static int num_more = 0;
-#ifndef HAS_MEMSET
-
-/*
- * For those systems that don't have "memset()"
- *
- * Set the value of each of 'n' bytes starting at 's' to 'c', return 's'
- * If 'n' is negative, you will erase a whole lot of memory.
- */
-char *memset(char *s, int c, huge n)
-{
- char *t;
- for (t = s; len--; ) *t++ = c;
- return (s);
-}
-
-#endif
-
-
#if 0
#ifndef HAS_STRICMP
#ifdef SET_UID
-# ifndef HAS_USLEEP
+# ifndef HAVE_USLEEP
/*
* For those systems that don't have "usleep()" but need it.
/*
-* Hack -- External functions
-*/
-extern struct passwd *getpwuid();
-extern struct passwd *getpwnam();
+ * Hack -- External functions
+ */
+#ifdef SET_UID
+extern struct passwd *getpwuid(uid_t uid);
+extern struct passwd *getpwnam(const char *name);
+#endif
/*
*/
void user_name(char *buf, int id)
{
-#ifdef SET_UID
struct passwd *pw;
/* Look up the user name */
return;
}
-#endif /* SET_UID */
/* Oops. Hack -- default to "PLAYER" */
strcpy(buf, "PLAYER");
if (path_parse(buf, 1024, file)) return (NULL);
#if defined(MACINTOSH) && defined(MAC_MPW)
- /* setting file type/creator -- AR */
- tempfff = fopen(buf, mode);
- fsetfileinfo(file, _fcreator, _ftype);
- fclose(tempfff);
+ if (strchr(mode, 'w'))
+ {
+ /* setting file type/creator */
+ tempfff = fopen(buf, mode);
+ fsetfileinfo(file, _fcreator, _ftype);
+ fclose(tempfff);
+ }
#endif
/* Attempt to fopen the file anyway */
int fd;
/* Prepare the buffer for mkstemp */
- (void)strnfmt(buf, max, "%s", "/tmp/anXXXXXX");
+ strncpy(buf, "/tmp/anXXXXXX", max);
/* Secure creation of a temporary file */
fd = mkstemp(buf);
# if defined(MACINTOSH) && defined(MAC_MPW)
/* setting file type and creator -- AR */
- errr_tmp = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode);
- fsetfileinfo(file, _fcreator, _ftype);
- return(errr_tmp);
+ {
+ errr errr_tmp;
+ errr_tmp = open(buf, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, mode);
+ fsetfileinfo(file, _fcreator, _ftype);
+ return(errr_tmp);
+ }
# else
/* Create the file, fail if exists, write-only, binary */
p = lseek(fd, n, SEEK_SET);
/* Failure */
- if (p < 0) return (1);
-
- /* Failure */
if (p != n) return (1);
/* Success */
/* Skip the backslash */
str++;
- /* Macro Trigger */
+ /* Macro Trigger */
if (*str == '[')
{
trigger_text_to_ascii(&s, &str);
}
-bool trigger_ascii_to_text(char **bufptr, cptr *strptr)
+static bool trigger_ascii_to_text(char **bufptr, cptr *strptr)
{
char *s = *bufptr;
cptr str = *strptr;
/*
- * Initialize the "macro" package
- */
-errr macro_init(void)
-{
- /* Macro patterns */
- C_MAKE(macro__pat, MACRO_MAX, cptr);
-
- /* Macro actions */
- C_MAKE(macro__act, MACRO_MAX, cptr);
-
- /* Success */
- return (0);
-}
-
-/*
* Local variable -- we are inside a "macro action"
*
* Do not match any macros until "ascii 30" is found.
void flush(void)
{
/* Do it later */
- inkey_xtra = TRUE;
+ inkey_xtra = TRUE;
}
/* Hack : ¥¡¼ÆþÎÏÂÔ¤Á¤Ç»ß¤Þ¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¢Î®¤ì¤¿¹Ô¤Îµ²±¤ÏÉÔÍס£ */
num_more = 0;
- /* Wait for a keypress */
- (void)(Term_inkey(&ch, TRUE, TRUE));
+ if (parse_macro)
+ {
+ /* Scan next keypress from macro action */
+ if (Term_inkey(&ch, FALSE, TRUE))
+ {
+ /* Over-flowed? Cancel macro action */
+ parse_macro = FALSE;
+ }
+ }
+ else
+ {
+ /* Wait for a keypress */
+ (void) (Term_inkey(&ch, TRUE, TRUE));
+ }
/* End "macro action" */
/* Inside "macro trigger" */
if (parse_under) return (ch);
+ /* Parse special key only */
+ if (inkey_special && ch != 31) return (ch);
/* Save the first key, advance */
buf[p++] = ch;
ch = *inkey_next++;
/* Cancel the various "global parameters" */
- inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
+ inkey_base = inkey_xtra = inkey_flag = inkey_scan = inkey_special = FALSE;
/* Accept result */
return (ch);
if (inkey_hack && ((ch = (*inkey_hack)(inkey_xtra)) != 0))
{
/* Cancel the various "global parameters" */
- inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
+ inkey_base = inkey_xtra = inkey_flag = inkey_scan = inkey_special = FALSE;
/* Accept result */
return (ch);
/* Cancel the various "global parameters" */
- inkey_base = inkey_xtra = inkey_flag = inkey_scan = FALSE;
+ inkey_base = inkey_xtra = inkey_flag = inkey_scan = inkey_special = FALSE;
/* Return the keypress */
return (ch);
for (t = buf; *t && (*t != '<' || (*(t+1) != 'x' )); t++)
if( iskanji(*t))t++;
#else
- for (t = buf; *t && (*t != '<'); t++);
+ for (t = buf; *t && (*t != '<'); t++);
#endif
if (*t)
}
now_damaged = FALSE;
- if (!alive || !nagasu)
+ if (!p_ptr->playing || !nagasu)
{
/* Pause for response */
#ifdef JP
/* Clear line, move cursor */
Term_erase(x, y, 255);
+
+ break;
}
/* Clean up the char */
/* Dump */
#ifdef JP
- Term_addch((byte)(a|0x10), ch);
+ Term_addch((byte)(a|0x10), ch);
#else
Term_addch(a, ch);
#endif
default:
#ifdef JP
{ /* ÊÒ»³¤µ¤óºîÀ® */
- int next;
-
- if (iskanji (i)) {
- inkey_base = TRUE;
- next = inkey ();
- if (k+1 < len) {
- buf[k++] = i;
- buf[k] = next;
- k_flag[k++] = 1;
- } else
- bell();
- } else {
+ int next;
+
+ if (iskanji (i)) {
+ inkey_base = TRUE;
+ next = inkey ();
+ if (k+1 < len) {
+ buf[k++] = i;
+ buf[k] = next;
+ k_flag[k++] = 1;
+ } else
+ bell();
+ } else {
#ifdef SJIS
- if(k<len && (isprint(i) || (0xa0<=i && i<=0xdf))){
+ if(k<len && (isprint(i) || (0xa0<=i && i<=0xdf))){
#else
- if(k<len && isprint(i)){
+ if(k<len && isprint(i)){
#endif
- buf[k] = i;
- k_flag[k++] = 0;
- } else
- bell();
- }
+ buf[k] = i;
+ k_flag[k++] = 0;
+ } else
+ bell();
+ }
}
#else
if ((k < len) && (isprint(i)))
/*
* Verify something with the user strictly
*
- * mode & 0x01 : force user to answer "YES" or "N"
- * mode & 0x02 : don't allow ESCAPE key
+ * mode & CHECK_OKAY_CANCEL : force user to answer 'O'kay or 'C'ancel
+ * mode & CHECK_NO_ESCAPE : don't allow ESCAPE key
+ * mode & CHECK_NO_HISTORY : no message_add
*/
bool get_check_strict(cptr prompt, int mode)
{
msg_print(NULL);
if (!rogue_like_commands)
- mode &= ~1;
+ mode &= ~CHECK_OKAY_CANCEL;
/* Hack -- Build a "useful" prompt */
- if (mode & 1)
+ if (mode & CHECK_OKAY_CANCEL)
{
-#ifdef JP
- /* (79-8)¥Ð¥¤¥È¤Î»ØÄê, prompt¤¬Ä¹¤«¤Ã¤¿¾ì¹ç,
- (79-9)ʸ»ú¤Î¸å½ªÃ¼Ê¸»ú¤¬½ñ¤¹þ¤Þ¤ì¤ë.
- ±Ñ¸ì¤ÎÊý¤Îstrncpy¤È¤Ï°ã¤¦¤Î¤ÇÃí°Õ.
- else¤ÎÊý¤Îʬ´ô¤âƱÍÍ. --henkma
- */
- mb_strlcpy(buf, prompt, 80-8);
-#else
- strncpy(buf, prompt, 79-8);
- buf[79-8]='\0';
-#endif
- strcat(buf, "[yes/no]");
+ my_strcpy(buf, prompt, sizeof(buf)-15);
+ strcat(buf, "[(O)k/(C)ancel]");
}
else
{
-#ifdef JP
- mb_strlcpy(buf, prompt, 80-5);
-#else
- strncpy(buf, prompt, 79-5);
- buf[79-5]='\0';
-#endif
+ my_strcpy(buf, prompt, sizeof(buf)-5);
strcat(buf, "[y/n]");
}
/* Prompt for it */
prt(buf, 0, 0);
+ if (!(mode & CHECK_NO_HISTORY) && p_ptr->playing)
+ {
+ /* HACK : Add the line to message buffer */
+ message_add(buf);
+ p_ptr->window |= (PW_MESSAGE);
+ window_stuff();
+ }
+
/* Get an acceptable answer */
while (TRUE)
{
i = inkey();
-
- if (i == 'y' || i == 'Y')
+ if (mode & CHECK_OKAY_CANCEL)
+ {
+ if ( i == 'o' || i == 'O' )
+ {
+ i = 'Y';
+ break;
+ }
+ }
+ else if (i == 'y' || i == 'Y')
{
- if (!(mode & 1))
break;
- else
+ }
+ if (!(mode & CHECK_NO_ESCAPE) && (i == ESCAPE)) break;
+ if ( mode & CHECK_OKAY_CANCEL )
+ {
+ if ( i == 'c' || i == 'C' )
{
-#ifdef JP
- prt("y (YES¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤)", 0, strlen(buf));
-#else
- prt("y (Please answer YES.)", 0, strlen(buf));
-#endif
- i = inkey();
- if (i == 'e' || i == 'E')
- {
-#ifdef JP
- prt("e (YES¤ÈÆþÎϤ·¤Æ¤¯¤À¤µ¤¤)", 0, strlen(buf)+1);
-#else
- prt("e (Please answer YES.)", 0, strlen(buf)+1);
-#endif
- i = inkey();
- if (i == 's' || i == 'S')
- {
- i = 'y';
- break;
- }
- prt("", 0, strlen(buf)+1);
- }
- prt("", 0, strlen(buf));
+ break;
}
}
- if (!(mode & 2) && (i == ESCAPE)) break;
- if (strchr("Nn", i)) break;
+ else if (i == 'n' || i == 'N')
+ {
+ break;
+ }
bell();
}
/* Get a command */
sub_cmd = inkey();
- if ((sub_cmd == ' ') || (sub_cmd == 'x') || (sub_cmd == 'X') || (sub_cmd == '\r'))
+ if ((sub_cmd == ' ') || (sub_cmd == 'x') || (sub_cmd == 'X') || (sub_cmd == '\r') || (sub_cmd == '\n'))
{
if (menu_info[menu][num].fin)
{
int i;
char cmd;
-
int mode;
cptr act;
#ifdef JP
- int caretcmd = 0;
+ int caretcmd = 0;
#endif
/* Roguelike */
if (rogue_like_commands)
msg_print(NULL);
/* Use auto-command */
- cmd = (unsigned char)command_new;
+ cmd = command_new;
/* Forget it */
command_new = 0;
/* Use command */
- command_cmd = cmd;
+ command_cmd = (byte)cmd;
/* Done */
break;
}
#ifdef JP
- for (i = 0; i < 256; i++)
- {
- cptr s;
- if ((s = keymap_act[mode][i]) != NULL)
- {
- if (*s == command_cmd && *(s+1) == 0)
- {
- caretcmd = i;
- break;
- }
- }
- }
- if (!caretcmd)
- caretcmd = command_cmd;
+ for (i = 0; i < 256; i++)
+ {
+ cptr s;
+ if ((s = keymap_act[mode][i]) != NULL)
+ {
+ if (*s == command_cmd && *(s+1) == 0)
+ {
+ caretcmd = i;
+ break;
+ }
+ }
+ }
+ if (!caretcmd)
+ caretcmd = command_cmd;
#endif
/* Hack -- Scan equipment */
for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
{
/* Check the "restriction" character */
#ifdef JP
- if ((s[1] == caretcmd) || (s[1] == '*'))
+ if ((s[1] == caretcmd) || (s[1] == '*'))
#else
if ((s[1] == command_cmd) || (s[1] == '*'))
#endif
*/
int get_keymap_dir(char ch)
{
- cptr act, s;
int d = 0;
- if (rogue_like_commands)
+ /* Already a direction? */
+ if (isdigit(ch))
{
- act = keymap_act[KEYMAP_MODE_ROGUE][(byte)ch];
+ d = D2I(ch);
}
else
{
- act = keymap_act[KEYMAP_MODE_ORIG][(byte)ch];
- }
+ int mode;
+ cptr act, s;
- if (act)
- {
- /* Convert to a direction */
- for (s = act; *s; ++s)
+ /* Roguelike */
+ if (rogue_like_commands)
+ {
+ mode = KEYMAP_MODE_ROGUE;
+ }
+
+ /* Original */
+ else
+ {
+ mode = KEYMAP_MODE_ORIG;
+ }
+
+ /* Extract the action (if any) */
+ act = keymap_act[mode][(byte)(ch)];
+
+ /* Analyze */
+ if (act)
{
- /* Use any digits in keymap */
- if (isdigit(*s)) d = D2I(*s);
+ /* Convert to a direction */
+ for (s = act; *s; ++s)
+ {
+ /* Use any digits in keymap */
+ if (isdigit(*s)) d = D2I(*s);
+ }
}
}
- return d;
+
+ /* Paranoia */
+ if (d == 5) d = 0;
+
+ /* Return direction */
+ return (d);
}
int write_pt = 0;
int line_len = 0;
int word_punct = 0;
- unsigned char ch[3];
+ char ch[3];
ch[2] = '\0';
while (str[read_pt])
{
#ifdef JP
+ bool kinsoku = FALSE;
bool kanji;
#endif
+ int ch_len = 1;
+
+ /* Prepare one character */
ch[0] = str[read_pt];
ch[1] = '\0';
#ifdef JP
kanji = iskanji(ch[0]);
+
if (kanji)
+ {
ch[1] = str[read_pt+1];
- if (!kanji && !isprint(ch[0]))
+ ch_len = 2;
+
+ if (strcmp(ch, "¡£") == 0 ||
+ strcmp(ch, "¡¢") == 0 ||
+ strcmp(ch, "¥£") == 0 ||
+ strcmp(ch, "¡¼") == 0)
+ kinsoku = TRUE;
+ }
+ else if (!isprint(ch[0]))
ch[0] = ' ';
#else
if (!isprint(ch[0]))
ch[0] = ' ';
#endif
- if (line_len >= maxlen - 1 || str[read_pt] == '\n')
+ if (line_len + ch_len > maxlen - 1 || str[read_pt] == '\n')
{
int word_len;
/* return to better wrapping point. */
/* Space character at the end of the line need not to be printed. */
word_len = read_pt - word_punct;
- if (ch[0] != ' ' && word_len < line_len/2)
+#ifdef JP
+ if (kanji && !kinsoku)
+ /* nothing */ ;
+ else
+#endif
+ if (ch[0] == ' ' || word_len >= line_len/2)
+ read_pt++;
+ else
{
read_pt = word_punct;
if (str[word_punct] == ' ')
read_pt++;
write_pt -= word_len;
}
- else
- read_pt++;
+
tbuf[write_pt++] = '\0';
line_len = 0;
word_punct = read_pt;
if (ch[0] == ' ')
word_punct = read_pt;
#ifdef JP
- if (kanji &&
- strcmp((char *)ch, "¡£") != 0 && strcmp((char *)ch, "¡¢") != 0 &&
- strcmp((char *)ch, "¥£") != 0 && strcmp((char *)ch, "¡¼") != 0)
- word_punct = read_pt;
+ if (!kinsoku) word_punct = read_pt;
#endif
tbuf[write_pt++] = ch[0];
line_len++;
return;
}
+
+/*
+ * The my_strcpy() function copies up to 'bufsize'-1 characters from 'src'
+ * to 'buf' and NUL-terminates the result. The 'buf' and 'src' strings may
+ * not overlap.
+ *
+ * my_strcpy() returns strlen(src). This makes checking for truncation
+ * easy. Example: if (my_strcpy(buf, src, sizeof(buf)) >= sizeof(buf)) ...;
+ *
+ * This function should be equivalent to the strlcpy() function in BSD.
+ */
+size_t my_strcpy(char *buf, const char *src, size_t bufsize)
+{
+#ifdef JP
+
+ char *d = buf;
+ const char *s = src;
+ size_t len = 0;
+
+ /* reserve for NUL termination */
+ bufsize--;
+
+ /* Copy as many bytes as will fit */
+ while (len < bufsize)
+ {
+ if (iskanji(*s))
+ {
+ if (len + 1 >= bufsize || !*(s+1)) break;
+ *d++ = *s++;
+ *d++ = *s++;
+ len += 2;
+ }
+ else
+ {
+ *d++ = *s++;
+ len++;
+ }
+ }
+ *d = '\0';
+ while(*s++) len++;
+
+ return len;
+
+#else
+
+ size_t len = strlen(src);
+ size_t ret = len;
+
+ /* Paranoia */
+ if (bufsize == 0) return ret;
+
+ /* Truncate */
+ if (len >= bufsize) len = bufsize - 1;
+
+ /* Copy the string and terminate it */
+ (void)memcpy(buf, src, len);
+ buf[len] = '\0';
+
+ /* Return strlen(src) */
+ return ret;
+
+#endif
+}
+
+
+/*
+ * The my_strcat() tries to append a string to an existing NUL-terminated string.
+ * It never writes more characters into the buffer than indicated by 'bufsize' and
+ * NUL-terminates the buffer. The 'buf' and 'src' strings may not overlap.
+ *
+ * my_strcat() returns strlen(buf) + strlen(src). This makes checking for
+ * truncation easy. Example:
+ * if (my_strcat(buf, src, sizeof(buf)) >= sizeof(buf)) ...;
+ *
+ * This function should be equivalent to the strlcat() function in BSD.
+ */
+size_t my_strcat(char *buf, const char *src, size_t bufsize)
+{
+ size_t dlen = strlen(buf);
+
+ /* Is there room left in the buffer? */
+ if (dlen < bufsize - 1)
+ {
+ /* Append as much as possible */
+ return (dlen + my_strcpy(buf + dlen, src, bufsize - dlen));
+ }
+ else
+ {
+ /* Return without appending */
+ return (dlen + strlen(src));
+ }
+}