しらいです。

 file & directory 管理ツール FDclone 2.09a の patch その 2
です。

Submitted-by: shirai@chandra2
Archive-name: FD-2.09a.patch/part02

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is `FD-2.09a.shar.02' (part 2 of FD-2.09a.patch).
# Do not concatenate these parts, unpack them in order with `/bin/sh'.
# File `FD-2.09a.patch' is being continued...
#
echo=echo
touch -am 1231235999 $$.touch >/dev/null 2>&1
if test ! -f 1231235999 && test -f $$.touch; then
  shar_touch=touch
else
  shar_touch=:
  echo
  $echo 'WARNING: not restoring timestamps.  Consider getting and'
  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
  echo
fi
rm -f 1231235999 $$.touch
#
if test ! -r _sh00584/seq; then
  $echo 'Please unpack part 1 first!'
  exit 1
fi
shar_sequence=`cat _sh00584/seq`
if test "$shar_sequence" != 2; then
  $echo 'Please unpack part' "$shar_sequence" 'next!'
  exit 1
fi
if test ! -f _sh00584/new; then
  $echo 'x -' 'STILL SKIPPING' 'FD-2.09a.patch'
else
  $echo 'x -' 'continuing file' 'FD-2.09a.patch'
  sed 's/^X//' << 'SHAR_EOF' >> FD-2.09a.patch &&
X                       Xclose(fd);
X                       lckflags &= ~LCK_FLOCK;
X               }
X               else if ((flags & O_TRUNC) && Xftruncate(fd, (off_t)0) < 0) {
X                       duperrno = errno;
-                       VOID_C fcntllock(fd, LCK_UNLOCK);
+                       VOID_C fcntllock(path, fd, LCK_UNLOCK);
X                       Xclose(fd);
X                       errno = duperrno;
X                       return(NULL);
@@ -625,7 +671,7 @@
X               if (!(lck -> flags & LCK_INVALID)) {
X #ifndef       NOFLOCK
X                       if (lck -> flags & LCK_FLOCK)
-                               VOID_C fcntllock(lck -> fd, LCK_UNLOCK);
+                               VOID_C fcntllock(NULL, lck -> fd, LCK_UNLOCK);
X #endif
X                       if (lck -> flags & LCK_STREAM) Xfclose(lck -> fp);
X                       else Xclose(lck -> fd);
@@ -738,6 +784,7 @@
X               }
X       }
X #endif        /* !NOUID */
+       if (stp -> st_nlink & TCH_IGNOREERR) ret = 0;
X       if (ret < 0) errno = duperrno;
X 
X       return(ret);
@@ -943,7 +990,7 @@
X               errno = duperrno;
X               return(-1);
X       }
-       stp1 -> st_nlink = (TCH_ATIME | TCH_MTIME);
+       stp1 -> st_nlink = (TCH_ATIME | TCH_MTIME | TCH_IGNOREERR);
X #ifdef        _USEDOSCOPY
X       if (touchfile(dest, stp1) < 0) return(-1);
X #else
@@ -1005,7 +1052,7 @@
X               return(-1);
X 
X       stp1 -> st_nlink = (TCH_MODE | TCH_UID | TCH_GID
-               | TCH_ATIME | TCH_MTIME);
+               | TCH_ATIME | TCH_MTIME | TCH_IGNOREERR);
X       return (touchfile(dest, stp1));
X }
X 
@@ -1086,8 +1133,7 @@
X #endif
X       deftmpdir = strdup2(path);
X #if   MSDOS
-       n = getcurdrv();
-       *path = (isupper2(n)) ? toupper2(*path) : tolower2(*path);
+       *path = (isupper2(getcurdrv())) ? toupper2(*path) : tolower2(*path);
X #endif
X 
X       mask = 0777 & ~tmpumask;
diff -urNP ../FD-2.09/frontend.c ./frontend.c
--- ../FD-2.09/frontend.c       Tue Aug 22 00:00:00 2006
+++ ./frontend.c        Tue Oct 31 00:00:00 2006
@@ -65,6 +65,7 @@
X static int NEAR recvstree __P_((int, syntaxtree **, syntaxtree *));
X #endif
X static VOID NEAR recvchild __P_((int));
+static VOID NEAR sendkey __P_((int));
X 
X 
X int waitstatus(pid, options, statusp)
@@ -425,7 +426,7 @@
X 
X       for (;;) {
X               n = -1;
-               c = getkey2(sigalrm(1));
+               c = getkey2(sigalrm(1), inputkcode);
X               while (lockflags & (1 << win)) {
X                       kbhit2(1000000L / SENSEPERSEC);
X                       waitpty();
@@ -433,7 +434,9 @@
X #ifndef       _NOORIGSHELL
X               if (isshptymode()) break;
X #endif
-               if (c < 0 || ptymenukey < 0 || c != ptymenukey) break;
+               if (c < 0 || ptymenukey < 0
+               || (c & ~K_ALTERNATE) != ptymenukey)
+                       break;
X 
X               str[0] = asprintf3(PTYAI_K, getkeysym(ptymenukey, 0));
X               str[1] = PTYIC_K;
@@ -988,6 +991,58 @@
X       }
X }
X 
+static VOID NEAR sendkey(c)
+int c;
+{
+       static char buf[MAXUTF8LEN * sizeof(short)];
+       static int index = 0;
+       static int max = 0;
+#ifndef        _NOKANJICONV
+       int code;
+#endif
+       short w;
+
+#ifndef        _NOKANJICONV
+       code = (inputkcode != NOCNV) ? inputkcode : DEFCODE;
+#endif
+       if (c >= 0) {
+               w = c;
+               memcpy(&(buf[index++ * sizeof(w)]), (char *)&w, sizeof(w));
+       }
+
+       if (c < 0 || c & 0xff00) /*EMPTY*/;
+       else if (max && index >= max) /*EMPTY*/;
+#ifdef _NOKANJICONV
+# ifdef        CODEEUC
+       else if (c == C_EKANA) {
+               max = 2;
+               return;
+       }
+# endif
+#else  /* !_NOKANJICONV */
+       else if (code == EUC && c == C_EKANA) {
+               max = 2;
+               return;
+       }
+       else if (code >= UTF8) {
+               if (index > 1) {
+                       if ((c & 0xc0) == 0x80) return;
+               }
+               else if (ismsb(c)) {
+                       max = ((c & 0xf0) == 0xe0) ? 3 : 2;
+                       return;
+               }
+       }
+#endif /* !_NOKANJICONV */
+       else if (isinkanji1(c, code)) {
+               max = 2;
+               return;
+       }
+
+       if (index) sendbuf(emufd, buf, index * sizeof(w));
+       index = max = 0;
+}
+
X int frontend(VOID_A)
X {
X       int n, ch, wastty, status;
@@ -1001,7 +1056,8 @@
X 
X       internal_status = FNC_FAIL;
X       if (!(wastty = isttyiomode)) Xttyiomode(1);
-       while ((ch = ptygetkey()) >= 0) sendword(emufd, ch);
+       while ((ch = ptygetkey()) >= 0) sendkey(ch);
+       sendkey(-1);
X       if (!wastty) Xstdiomode();
X 
X       if (ch < -1) {
diff -urNP ../FD-2.09/func.h ./func.h
--- ../FD-2.09/func.h   Tue Aug 22 00:00:00 2006
+++ ./func.h    Tue Oct 31 00:00:00 2006
@@ -621,7 +621,9 @@
X extern VOID discardunitable __P_((VOID_A));
X extern u_int unifysjis __P_((u_int, int));
X extern u_int cnvunicode __P_((u_int, int));
-#endif
+extern VOID ucs2normalization __P_((u_short *, int *, int, u_int, int));
+extern u_int ucs2denormalization __P_((u_short *, int *, int));
+#endif /* _USEUNICODE */
X #ifndef       _NOKANJICONV
X # ifdef       _USEUNICODE
X extern int ucs2toutf8 __P_((char *, int, u_int));
@@ -641,7 +643,7 @@
X extern char *convput __P_((char *, char *, int, int, char *, int *));
X 
X /* input.c */
-extern int intrkey __P_((VOID_A));
+extern int intrkey __P_((int));
X extern int Xgetkey __P_((int, int));
X extern int kanjiputs2 __P_((char *, int, int));
X extern VOID cputspace __P_((int));
@@ -748,6 +750,7 @@
X 
X /* browse.c */
X extern VOID helpbar __P_((VOID_A));
+extern u_int getfmode __P_((int));
X extern int putmode __P_((char *, u_int, int));
X #ifdef        HAVEFLAGS
X extern int putflags __P_((char *, u_long));
diff -urNP ../FD-2.09/ime.c ./ime.c
--- ../FD-2.09/ime.c    Tue Aug 22 00:00:00 2006
+++ ./ime.c     Tue Oct 31 00:00:00 2006
@@ -206,7 +206,7 @@
X u_int c;
X int type, kana;
X {
-       char *cp, buf[3 + 1], tmp[2 + 1];
+       char *cp, buf[MAXUTF8LEN + 1], tmp[MAXKLEN + 1];
X       int i, code;
X 
X       cp = NULL;
@@ -255,7 +255,7 @@
X       }
X 
X       if (cp) VOID_C code2kanji(cp, c);
-       cp = kanjiconv2(tmp, buf, 2, code, DEFCODE, L_INPUT);
+       cp = kanjiconv2(tmp, buf, MAXKLEN, code, DEFCODE, L_INPUT);
X       if (kanjierrno) return((u_int)0);
X       i = 0;
X       if (!iskanji1(cp, 0) && (!kana || !iskana1(cp, &i))) return((u_int)0);
@@ -280,7 +280,7 @@
X char *buf;
X u_int c;
X {
-       char tmp[2 + 1];
+       char tmp[MAXKLEN + 1];
X 
X       VOID_C code2kanji(tmp, c);
X       return(inkanjiconv(buf, tmp));
@@ -335,7 +335,7 @@
X static int NEAR jisputs(c)
X u_int c;
X {
-       char buf[4 + 1];
+       char buf[MAXKLEN * R_MAXKANA + 1];
X 
X       VOID_C jis2str(buf, c);
X       return(imeputs(buf));
@@ -355,7 +355,7 @@
X static int NEAR countjisbuf(jp)
X jisbuf *jp;
X {
-       char buf[4 + 1];
+       char buf[MAXKLEN * R_MAXKANA + 1];
X       int n, len;
X 
X       if (!jp) return(0);
@@ -590,7 +590,7 @@
X int *typep;
X jisbuf *jp;
X {
-       char buf[2 + 1];
+       char buf[MAXKLEN + 1];
X       u_int n, c;
X       u_short w;
X       int i;
@@ -619,7 +619,7 @@
X u_int c;
X int type;
X {
-       char *cp, buf[3 + 1], tmp[4 + 1];
+       char *cp, buf[MAXUTF8LEN + 1], tmp[MAXKLEN * R_MAXKANA + 1];
X 
X       cp = NULL;
X       kanjierrno = 0;
@@ -631,7 +631,8 @@
X                       break;
X               case 'S':
X                       VOID_C jis2str(tmp, c);
-                       cp = kanjiconv2(buf, tmp, 2, DEFCODE, SJIS, L_INPUT);
+                       cp = kanjiconv2(buf, tmp,
+                               MAXKLEN, DEFCODE, SJIS, L_INPUT);
X                       break;
X               case 'K':
X                       VOID_C code2kanji(buf, c - 0x2020);
@@ -642,7 +643,8 @@
X #ifdef        _USEUNICODE
X               case 'U':
X                       VOID_C jis2str(tmp, c);
-                       cp = kanjiconv2(buf, tmp, 3, DEFCODE, UTF8, L_INPUT);
+                       cp = kanjiconv2(buf, tmp,
+                               MAXUTF8LEN, DEFCODE, UTF8, L_INPUT);
X                       c = ucs2fromutf8((u_char *)cp, NULL);
X                       cp = NULL;
X                       break;
@@ -679,7 +681,7 @@
X long *minp, *maxp, *prevp;
X int xpos[];
X {
-       char buf[4 + 1];
+       char buf[MAXKLEN * R_MAXKANA + 1];
X       long n, min, max, prev;
X       int i, x, col, len;
X 
@@ -743,7 +745,7 @@
X       do {
X               imeputcursor(xpos[argc - min], argc - min, 1);
X 
-               if ((ch = getkey3(sig)) < 0) break;
+               if ((ch = getkey3(sig, inputkcode)) < 0) break;
X               old = argc;
X               switch (ch) {
X                       case ' ':
@@ -889,7 +891,7 @@
X               dispjiscode(c, type);
X               imeputcursor(jis_xpos(plen, c % col), c % col, 1);
X 
-               if ((ch = getkey3(sig)) < 0) break;
+               if ((ch = getkey3(sig, inputkcode)) < 0) break;
X               old = c;
X               switch (ch) {
X                       case ' ':
@@ -1143,7 +1145,7 @@
X #endif
X                       (*ime_locate)(imewin_x, imewin_y);
X                       Xtflush();
-                       if ((c = getkey3(sig)) < 0) break;
+                       if ((c = getkey3(sig, inputkcode)) < 0) break;
X                       else if (c == imekey) {
X                               ime_cont = kjisbuf.max = 0;
X                               c = K_ESC;
@@ -1325,7 +1327,7 @@
X char *buf;
X u_int c;
X {
-       char tmp[4 + 1];
+       char tmp[MAXKLEN * R_MAXKANA + 1];
X 
X       VOID_C jis2str(tmp, c);
X       return(inkanjiconv(buf, tmp));
diff -urNP ../FD-2.09/info.c ./info.c
--- ../FD-2.09/info.c   Tue Aug 22 00:00:00 2006
+++ ./info.c    Tue Oct 31 00:00:00 2006
@@ -103,9 +103,14 @@
X #endif        /* USEGETFSENT */
X 
X #if   MSDOS
+# ifdef        DOUBLESLASH
+# define       MNTDIRSIZ       MAXPATHLEN
+# else
+# define       MNTDIRSIZ       (3 + 1)
+# endif
X typedef struct _mnt_t {
X       char *mnt_fsname;
-       char mnt_dir[4];
+       char mnt_dir[MNTDIRSIZ];
X       char *mnt_type;
X       char *mnt_opts;
X } mnt_t;
@@ -201,9 +206,7 @@
X extern VOID error __P_((char *));
X extern int _chdir2 __P_((char *));
X extern char *strcpy2 __P_((char *, char *));
-#ifndef        NOFLOCK
X extern char *strncpy2 __P_((char *, char *, int));
-#endif
X extern char *getwd2 __P_((VOID_A));
X extern VOID warning __P_((int, char *));
X #ifdef        _USEDOSPATH
@@ -322,6 +325,9 @@
X #ifndef       MNTTYPE_FAT32
X #define       MNTTYPE_FAT32   "fat32"       /* Win98 */
X #endif
+#ifndef        MNTTYPE_SHARED
+#define        MNTTYPE_SHARED  "shared"      /* Win98 */
+#endif
X #define       MNTTYPE_XNFS    "nfs" /* NFS */
X 
X static int NEAR code2str __P_((char *, int));
@@ -351,6 +357,7 @@
X       {FSID_FAT, MNTTYPE_PC},
X       {FSID_LFN, MNTTYPE_DOS7},
X       {FSID_LFN, MNTTYPE_FAT32},
+       {FSID_LFN, MNTTYPE_SHARED},
X #if   MSDOS
X # ifndef      _NODOSDRIVE
X       {FSID_FAT, MNTTYPE_FAT12},
@@ -760,22 +767,47 @@
X statfs_t *fsbuf;
X mnt_t *mntbuf;
X {
-       statfs_t fs;
-       mnt_t mnt;
X #if   MSDOS
X # ifndef      _NODOSDRIVE
X       int i;
X # endif
+# ifdef        DOUBLESLASH
+       char *cp;
+       int len;
+# endif
+       statfs_t fs;
+       mnt_t mnt;
+       char buf[MAXPATHLEN];
+       int drive;
X 
X       if (!fsbuf) fsbuf = &fs;
X       if (!mntbuf) mntbuf = &mnt;
X 
X       mntbuf -> mnt_fsname = "MSDOS";
-       VOID_C gendospath(mntbuf -> mnt_dir, dospath(path, NULL), _SC_);
+       drive = dospath(path, buf);
+# ifdef        DOUBLESLASH
+       if (drive == '_') {
+               if (*buf) path = buf;
+               len = isdslash(path);
+               if ((cp = strdelim(&(path[len]), 0))) {
+                       len = cp - path;
+                       if (!(cp = strdelim(&(path[len + 1]), 0)))
+                               cp += strlen(cp);
+                       len = cp - path;
+               }
+               strncpy2(mntbuf -> mnt_dir, path, len);
+       }
+       else
+# endif
+       VOID_C gendospath(mntbuf -> mnt_dir, drive, _SC_);
+
X # ifdef       _NOUSELFN
X       mntbuf -> mnt_type = MNTTYPE_PC;
X # else        /* !_NOUSELFN */
X       switch (supportLFN(mntbuf -> mnt_dir)) {
+               case 3:
+                       mntbuf -> mnt_type = MNTTYPE_SHARED;
+                       break;
X               case 2:
X                       mntbuf -> mnt_type = MNTTYPE_FAT32;
X                       break;
@@ -812,13 +844,15 @@
X 
X       if (statfs2(mntbuf -> mnt_dir, fsbuf) < 0) return(-1);
X #else /* !MSDOS */
+# ifndef       _NODOSDRIVE
+       int drv;
+# endif
+       statfs_t fs;
+       mnt_t mnt;
X       mnt_t *mntp;
X       FILE *fp;
X       char *dir, fsname[MAXPATHLEN];
X       ALLOC_T len, match;
-# ifndef       _NODOSDRIVE
-       int drv;
-# endif
X 
X       if (!fsbuf) fsbuf = &fs;
X       if (!mntbuf) mntbuf = &mnt;
@@ -1069,7 +1103,10 @@
X #ifndef       _NODOSDRIVE
X       needbavail--;
X #endif
-       if (n < 0) return(-1);
+       if (n < 0) {
+               *bsizep = getblocksize(path);
+               return(-1);
+       }
X 
X       *totalp = fsbuf.f_blocks;
X       *freep = fsbuf.f_bavail;
diff -urNP ../FD-2.09/input.c ./input.c
--- ../FD-2.09/input.c  Tue Aug 22 00:00:00 2006
+++ ./input.c   Tue Oct 31 00:00:00 2006
@@ -49,11 +49,16 @@
X #define       LEFTMARGIN      0
X #define       RIGHTMARGIN     2
X 
+#ifdef _NOKANJICONV
+#define        getinkcode()    NOCNV
+#else
+static int NEAR getinkcode __P_((VOID_A));
+#endif
X #ifndef       _NOEDITMODE
X static int NEAR getemulatekey __P_((int, CONST char []));
X #endif
X #ifdef        _NOIME
-#define        getkey4         getkey3
+#define        getkey4(s)      getkey3(s, getinkcode())
X #else
X static int NEAR getimebuf __P_((char *, int *));
X static int NEAR getime __P_((int, int *, int));
@@ -109,6 +114,10 @@
X static VOID NEAR selectfile __P_((int, char **));
X static int NEAR completestr __P_((int, int, int));
X #endif
+#ifndef        _NOKANJICONV
+static u_int NEAR getucs2 __P_((int));
+static VOID NEAR ungetch3 __P_((int));
+#endif
X static int NEAR getch3 __P_((VOID_A));
X static int NEAR getkanjikey __P_((char *, int));
X static VOID NEAR copyhist __P_((char *, int));
@@ -211,18 +220,55 @@
X #ifndef       _NOIME
X static int imemode = 0;
X #endif
+#ifndef        _NOKANJICONV
+static u_char ungetbuf3[MAXUTF8LEN * MAXNFLEN];
+static int ungetnum3 = 0;
+#endif
X 
X 
-int intrkey(VOID_A)
+#ifndef        _NOKANJICONV
+static int NEAR getinkcode(VOID_A)
X {
-       int c;
+       int code;
X 
-       if (kbhit2(0L) && ((c = getkey2(0)) == cc_intr || c == K_ESC)) {
-               warning(0, INTR_K);
-               return(1);
+       code = (inputkcode != NOCNV) ? inputkcode : DEFCODE;
+# ifndef       _NOPTY
+       if (parentfd >= 0 && ptyinkcode != NOCNV) code = ptyinkcode;
+# endif
+
+       return(code);
+}
+#endif /* !_NOKANJICONV */
+
+int intrkey(key)
+int key;
+{
+       int c, duperrno;
+
+       duperrno = errno;
+       if (ttyio < 0 || !kbhit2(0L)) c = EOF;
+       else if ((c = getch2()) == EOF) /*EMPTY*/;
+       else if (c != K_ESC) /*EMPTY*/;
+       else if (kbhit2(WAITKEYPAD * 1000L)) {
+               ungetch2(c);
+               c = EOF;
X       }
X 
-       return(0);
+       if (c == EOF) /*EMPTY*/;
+       else if (c == cc_intr || (key >= 0 && c == key)) {
+               if (isttyiomode) warning(0, INTR_K);
+               else {
+                       fprintf2(stderr, INTR_K);
+                       fputnl(stderr);
+               }
+       }
+       else {
+               ungetch2(c);
+               c = EOF;
+       }
+       errno = duperrno;
+
+       return((c == EOF) ? 0 : 1);
X }
X 
X #ifndef       _NOEDITMODE
@@ -246,14 +292,10 @@
X char *buf;
X int *ptrp;
X {
-       int c, code;
-
-       code = (inputkcode != NOCNV) ? inputkcode : DEFCODE;
-# ifndef       _NOPTY
-       if (parentfd >= 0 && ptyinkcode != NOCNV) code = ptyinkcode;
-# endif
+       int c;
X 
-       if (code != EUC || !isekana(buf, *ptrp)) c = (u_char)(buf[*ptrp]);
+       if (getinkcode() != EUC || !isekana(buf, *ptrp))
+               c = (u_char)(buf[*ptrp]);
X       else c = mkekana((u_char)(buf[++(*ptrp)]));
X       (*ptrp)++;
X 
@@ -326,7 +368,7 @@
X       int c;
X 
X       if (imemode && getime(sig, &c, 0) >= 0) return(c);
-       return(getkey3(sig));
+       return(getkey3(sig, getinkcode()));
X }
X #endif        /* !_NOIME */
X 
@@ -348,6 +390,9 @@
X               return('\0');
X       }
X 
+#ifndef        _NOKANJICONV
+       if (ungetnum3 > 0) return((int)ungetbuf3[--ungetnum3]);
+#endif
X       sig = sigalrm(sig);
X       ch = getkey4(sig);
X       if (eof && (ch != cc_eof || prev == ch)) eof = 0;
@@ -1707,7 +1752,8 @@
X                               Xcputs2("wish to see them all? (y or n)");
X                               Xtflush();
X                               for (;;) {
-                                       if ((i = getkey2(0)) < K_MIN) {
+                                       i = getkey3(0, getinkcode());
+                                       if (i < K_MIN) {
X                                               i = toupper2(i);
X                                               if (i == 'Y' || i == 'N')
X                                                       break;
@@ -1857,7 +1903,7 @@
X       }
X       if (comline && top > 0) {
X               for (i = top - 1; i >= 0; i--)
-                       if (inputbuf[i] != ' ' && inputbuf[i] != '\t') break;
+                       if (!isblank2(inputbuf[i])) break;
X               if (i >= 0 && !strchr(SHELL_OPERAND, inputbuf[i])) comline = 0;
X       }
X # ifndef      _NOORIGSHELL
@@ -2082,11 +2128,53 @@
X }
X #endif        /* !_NOCOMPLETE */
X 
+#ifndef        _NOKANJICONV
+static u_int NEAR getucs2(ch)
+int ch;
+{
+       char buf[MAXUTF8LEN + 1];
+       int n;
+
+       n = 0;
+       if (ch & 0xff00) return((u_int)-1);
+       buf[n++] = ch;
+       if (!ismsb(ch)) /*EMPTY*/;
+       else if ((ch = getch3()) == EOF) return((u_int)-1);
+       else {
+               buf[n++] = ch;
+               if (isutf2(buf[0], buf[1])) /*EMPTY*/;
+               else if ((ch = getch3()) == EOF) {
+                       ungetch3(buf[1]);
+                       return((u_int)-1);
+               }
+               else buf[n++] = ch;
+       }
+       buf[n] = '\0';
+
+       return(ucs2fromutf8((u_char *)buf, NULL));
+}
+
+static VOID NEAR ungetch3(c)
+int c;
+{
+       if (ungetnum3 >= arraysize(ungetbuf3)) return;
+       memmove((char *)&(ungetbuf3[1]), (char *)&(ungetbuf3[0]),
+               ungetnum3 * sizeof(u_char));
+       ungetbuf3[0] = c;
+       ungetnum3++;
+}
+#endif /* !_NOKANJICONV */
+
X static int NEAR getch3(VOID_A)
X {
X #ifndef       _NOIME
X       int c;
+#endif
X 
+#ifndef        _NOKANJICONV
+       if (ungetnum3 > 0) return((int)ungetbuf3[--ungetnum3]);
+#endif
+#ifndef        _NOIME
X       if (imemode) return((getime(0, &c, 1) >= 0) ? c : EOF);
X #endif
X       if (!kbhit2(WAITMETA * 1000L)) return(EOF);
@@ -2098,8 +2186,10 @@
X int ch;
X {
X #ifndef       _NOKANJICONV
-       char tmpkanji[3 + 1];
-       int n, code;
+       u_short ubuf[MAXNFLEN];
+       char tmp[MAXUTF8LEN + 1];
+       u_int u;
+       int i, n, len, code;
X #endif
X       int ch2;
X 
@@ -2119,54 +2209,48 @@
X       }
X # endif
X #else /* !_NOKANJICONV */
-       code = (inputkcode != NOCNV) ? inputkcode : DEFCODE;
-# ifndef       _NOPTY
-       if (parentfd >= 0 && ptyinkcode != NOCNV) code = ptyinkcode;
-# endif
-
+       code = getinkcode();
X       if (code == EUC && isekana2(ch)) {
-               tmpkanji[0] = (char)C_EKANA;
-               tmpkanji[1] = (ch & 0xff);
-               tmpkanji[2] = '\0';
-               kanjiconv(buf, tmpkanji, 2, code, DEFCODE, L_INPUT);
+               tmp[0] = (char)C_EKANA;
+               tmp[1] = (ch & 0xff);
+               tmp[2] = '\0';
+               kanjiconv(buf, tmp, MAXKLEN, code, DEFCODE, L_INPUT);
X               return(1);
X       }
X       if (code == SJIS && iskana2(ch)) {
-               tmpkanji[0] = ch;
-               tmpkanji[1] = '\0';
-               kanjiconv(buf, tmpkanji, 2, code, DEFCODE, L_INPUT);
+               tmp[0] = ch;
+               tmp[1] = '\0';
+               kanjiconv(buf, tmp, MAXKLEN, code, DEFCODE, L_INPUT);
X               return(1);
X       }
X       if (code >= UTF8) {
-               if ((ch & 0xff00) || !ismsb(ch)) /*EMPTY*/;
-               else if ((ch2 = getch3()) == EOF) {
-                       buf[0] = '\0';
-                       return(-1);
-               }
-               else if (isutf2(ch, ch2)) {
-                       tmpkanji[0] = ch;
-                       tmpkanji[1] = ch2;
-                       tmpkanji[2] = '\0';
-                       n = kanjiconv(buf, tmpkanji, 2,
-                               code, DEFCODE, L_INPUT);
-                       return(n);
+               i = 0;
+               for (;;) {
+                       if ((u = getucs2(ch)) == (u_int)-1) {
+                               if (i) ungetch3(ch);
+                               buf[0] = '\0';
+                               return(-1);
+                       }
+                       ubuf[i++] = u;
+                       if (i >= MAXNFLEN) break;
+                       if (code != M_UTF8 || (ch = getch3()) == EOF) break;
+               }
+               len = i;
+               i = 0;
+               if (!len) u = ch;
+               else if (code != M_UTF8) u = ubuf[i++];
+               else u = ucs2denormalization(ubuf, &i, code - UTF8);
+
+               while (i < len) {
+                       tmp[ucs2toutf8(tmp, 0, ubuf[i++])] = '\0';
+                       for (n = 0; tmp[n]; n++) ungetch3(tmp[n]);
X               }
-               else if ((n = getch3()) == EOF) {
-                       buf[0] = '\0';
-                       return(-1);
-               }
-               else {
-                       tmpkanji[0] = ch;
-                       tmpkanji[1] = ch2;
-                       tmpkanji[2] = n;
-                       tmpkanji[3] = '\0';
-                       n = kanjiconv(buf, tmpkanji, 2,
-                               code, DEFCODE, L_INPUT);
+               tmp[ucs2toutf8(tmp, 0, u)] = '\0';
+               n = kanjiconv(buf, tmp, MAXKLEN, code, DEFCODE, L_INPUT);
X # ifdef       CODEEUC
-                       if (isekana(buf, 0)) n = 1;
+               if (isekana(buf, 0)) n = 1;
X # endif
-                       return(n);
-               }
+               return(n);
X       }
X #endif        /* !_NOKANJICONV */
X 
@@ -2180,10 +2264,10 @@
X               buf[1] = ch2;
X               buf[2] = '\0';
X #else
-               tmpkanji[0] = ch;
-               tmpkanji[1] = ch2;
-               tmpkanji[2] = '\0';
-               kanjiconv(buf, tmpkanji, 2, code, DEFCODE, L_INPUT);
+               tmp[0] = ch;
+               tmp[1] = ch2;
+               tmp[2] = '\0';
+               kanjiconv(buf, tmp, MAXKLEN, code, DEFCODE, L_INPUT);
X #endif
X               return(2);
X       }
@@ -2589,7 +2673,7 @@
X #if   FD >= 2
X       ALLOC_T searchsize;
X #endif
-       char *tmphist, buf[2 + 1];
+       char *tmphist, buf[MAXKLEN + 1];
X       int i, n, ch, ch2, ovptr, hist, quote, sig;
X 
X       subwindow = 1;
@@ -2630,7 +2714,7 @@
X               ch2 = ch;
X               ovptr = vptr;
X               if (quote) {
-                       i = ch = getkey2(sigalrm(sig));
+                       i = ch = getkey2(sigalrm(sig), getinkcode());
X                       quote = 0;
X #if   MSDOS
X                       switch (i) {
@@ -2943,10 +3027,9 @@
X                               keyflush();
X #ifndef       _NOCOMPLETE
X                               if (!completable(h) || !selectlist) break;
-                               i = completestr(0, -1, h);
-                               if (i < 0) break;
-                               if (iseol(vptr)) ovptr = -1;
X                               ch = '\0';
+                               i = completestr(0, -1, h);
+                               if (i >= 0 && iseol(vptr)) ovptr = -1;
X #endif        /* !_NOCOMPLETE */
X                               break;
X                       case K_ESC:
@@ -3490,7 +3573,7 @@
X       if (!(wastty = isttyiomode)) Xttyiomode(1);
X       keyflush();
X       do {
-               getkey2(sigalrm(1));
+               getkey3(sigalrm(1), getinkcode());
X       } while (kbhit2(WAITAFTERWARN * 1000L));
X       if (!wastty) Xstdiomode();
X 
diff -urNP ../FD-2.09/kanji.c ./kanji.c
--- ../FD-2.09/kanji.c  Tue Aug 22 00:00:00 2006
+++ ./kanji.c   Tue Oct 31 00:00:00 2006
@@ -147,8 +147,6 @@
X static int NEAR tojis8 __P_((char *, u_char *, int, int, int, int));
X static int NEAR tojunet __P_((char *, u_char *, int, int, int, int));
X # ifdef       _USEUNICODE
-static VOID NEAR ucs2normalization __P_((u_short *, int *, int, u_int, int));
-static u_int NEAR ucs2denormalization __P_((u_short *, int *, int));
X static u_int NEAR toucs2 __P_((u_char *, int *));
X static VOID NEAR fromucs2 __P_((char *, int *, u_int));
X static int NEAR toutf8 __P_((char *, u_char *, int));
@@ -943,6 +941,8 @@
X                       kanjierrno = UTF8;
X                       return(r);
X               }
+               if (wc == 0x3099) return(0x814a);
+               if (wc == 0x309a) return(0x814b);
X       }
X 
X       if (unicodebuffer && !unitblbuf) readunitable(0);
@@ -1138,6 +1138,9 @@
X u_char *s;
X int max, io;
X {
+# ifndef       CODEEUC
+       u_char tmp[MAXKLEN];
+# endif
X       int i, j, mode;
X 
X       mode = ASCII;
@@ -1212,8 +1215,6 @@
X                                       buf[j++] = s[i++] | 0x80;
X                                       buf[j++] = jdecnv(s[i], io) | 0x80;
X # else
-                                       u_char tmp[2];
-
X                                       tmp[0] = s[i++];
X                                       tmp[1] = jdecnv(s[i], io);
X                                       j2sj(&(buf[j]), tmp);
@@ -1350,7 +1351,7 @@
X }
X 
X # ifdef       _USEUNICODE
-static VOID NEAR ucs2normalization(buf, ptrp, max, wc, nf)
+VOID ucs2normalization(buf, ptrp, max, wc, nf)
X u_short *buf;
X int *ptrp, max;
X u_int wc;
@@ -1399,7 +1400,7 @@
X       if (new) free(new);
X }
X 
-static u_int NEAR ucs2denormalization(buf, ptrp, nf)
+u_int ucs2denormalization(buf, ptrp, nf)
X u_short *buf;
X int *ptrp, nf;
X {
@@ -1474,12 +1475,13 @@
X u_char *s;
X int *ptrp;
X {
+# ifdef        CODEEUC
+       u_char tmp[MAXKLEN];
+# endif
X       u_int w;
X 
X       if (iskanji1((char *)s, *ptrp)) {
X # ifdef       CODEEUC
-               u_char tmp[2];
-
X               j2sj((char *)tmp, &(s[*ptrp]));
X               if (kanjierrno) kanjierrno = EUC;
X               *ptrp += 2;
@@ -1502,6 +1504,9 @@
X int *ptrp;
X u_int wc;
X {
+# ifdef        CODEEUC
+       u_char tmp[MAXKLEN];
+# endif
X       int c1, c2;
X 
X       wc = cnvunicode(wc, 0);
@@ -1515,8 +1520,6 @@
X       }
X       else if (issjis1(c1) && issjis2(c2)) {
X # ifdef       CODEEUC
-               u_char tmp[2];
-
X               tmp[0] = c1;
X               tmp[1] = c2;
X               sj2j(&(buf[*ptrp]), tmp);
@@ -1622,10 +1625,10 @@
X       u2 = (u_short *)malloc2((max + 1) * sizeof(u_short));
X 
X       for (i = j = 0; s[i] && j < max; j++) u1[j] = toucs2(s, &i);
-       u1[j] = 0;
+       u1[j] = (u_short)0;
X       for (i = j = 0; u1[i] && j < max; i++)
X               ucs2normalization(u2, &j, max, u1[i], nf);
-       u2[j] = 0;
+       u2[j] = (u_short)0;
X       for (i = j = 0; u2[i] && j < max; i++) {
X               len = 1;
X               if (u2[i] >= 0x80) len++;
@@ -1654,10 +1657,10 @@
X       u2 = (u_short *)malloc2((max + 1) * sizeof(u_short));
X 
X       for (i = j = 0; s[i] && j < max; j++) u1[j] = ucs2fromutf8(s, &i);
-       u1[j] = 0;
+       u1[j] = (u_short)0;
X       for (i = j = 0; u1[i] && j < max; j++)
X               u2[j] = ucs2denormalization(u1, &i, nf);
-       u2[j] = 0;
+       u2[j] = (u_short)0;
X       for (i = j = 0; u2[i] && j + 1 < max; i++) fromucs2(buf, &j, u2[i]);
X 
X       free(u1);
@@ -1688,7 +1691,7 @@
X int max;
X {
X # ifdef       CODEEUC
-       u_char tmp[2];
+       u_char tmp[MAXKLEN];
X # endif
X       int i, j;
X 
@@ -1720,6 +1723,9 @@
X u_char *s;
X int max;
X {
+# ifdef        CODEEUC
+       u_char tmp[MAXKLEN];
+# endif
X       int i, j, c1, c2;
X 
X       for (i = j = 0; s[i] && j < max; i++, j++) {
@@ -1748,8 +1754,6 @@
X                               }
X                               else {
X # ifdef       CODEEUC
-                                       u_char tmp[2];
-
X                                       tmp[0] = c1;
X                                       tmp[1] = c2;
X                                       sj2j(&(buf[j]), tmp);
@@ -1791,7 +1795,7 @@
X int max;
X {
X # ifdef       CODEEUC
-       u_char tmp[2];
+       u_char tmp[MAXKLEN];
X # endif
X       int i, j, len;
X 
@@ -1827,6 +1831,9 @@
X u_char *s;
X int max;
X {
+# ifdef        CODEEUC
+       u_char tmp[MAXKLEN];
+# endif
X       int i, j, c1, c2;
X 
X       for (i = j = 0; s[i] && j < max; i++, j++) {
@@ -1855,8 +1862,6 @@
X                               }
X                               else {
X # ifdef       CODEEUC
-                                       u_char tmp[2];
-
X                                       tmp[0] = c1;
X                                       tmp[1] = c2;
X                                       sj2j(&(buf[j]), tmp);
@@ -2055,6 +2060,11 @@
X # endif
X       char *cp;
X 
+#ifdef DOUBLESLASH
+       if (path[0] == _SC_ && path[1] == _SC_ && !isdslash(path))
+               memmove(path, &(path[1]), strlen(&(path[1])) + 1);
+#endif
+
X       if (noconv) return(path);
X # ifndef      _NOKANJIFCONV
X       fgetok = (nokanjifconv) ? 0 : 1;
@@ -2126,13 +2136,20 @@
X       if (norealpath) cp = path;
X       else {
X               if ((file = strrdelim(path, 0))) {
-                       n = file - path;
-                       if (file++ == isrootdir(path)) n++;
+# ifdef        DOUBLESLASH
+                       if ((n = isdslash(path)) && file < &(path[n]))
+                               file = &(path[n]);
+                       else
+# endif
+                       {
+                               n = file - path;
+                               if (file++ == isrootdir(path)) n++;
+                       }
X                       strncpy2(rpath, path, n);
X               }
X # ifdef       _USEDOSEMU
X               else if ((n = _dospath(path))) {
-                       file = path + 2;
+                       file = &(path[2]);
X                       VOID_C gendospath(rpath, n, '.');
X               }
X # endif
@@ -2145,6 +2162,7 @@
X               strncpy2(cp, file, MAXPATHLEN - 1 - (cp - rpath));
X               cp = rpath;
X       }
+
X # ifdef       _USEDOSEMU
X       if ((n = dospath(cp, kbuf))) {
X               cp = kbuf;
@@ -2181,11 +2199,13 @@
X       if (cp == path) return(path);
X       if (needfile && (file = strrdelim(cp, 0))) file++;
X       else file = cp;
+
X # ifdef       _USEDOSEMU
-       if (n && !_dospath(file)) strcpy(gendospath(buf, n, '\0'), file);
+       if (isalpha2(n) && !_dospath(file)) cp = gendospath(buf, n, '\0');
X       else
X # endif
-       strcpy(buf, file);
+       cp = buf;
+       strcpy(cp, file);
X 
X       return(buf);
X }
diff -urNP ../FD-2.09/kctype.h ./kctype.h
--- ../FD-2.09/kctype.h Tue Aug 22 00:00:00 2006
+++ ./kctype.h  Tue Oct 31 00:00:00 2006
@@ -243,6 +243,7 @@
X                       (((u_char)(c1) & 0xf0) == 0xe0 \
X                       && ((u_char)(c2) & 0xc0) == 0x80 \
X                       && ((u_char)(c3) & 0xc0) == 0x80)
+#define        iswucs2(u)      (((u) & 0xff00) && ((u) < 0xff61 || (u) > 0xff9f))
X 
X #define       NOCNV   0
X #define       ENG     1
@@ -271,6 +272,9 @@
X #endif
X 
X #define       MAXKANJIBUF     (3 + 2 + 3)
+#define        MAXKLEN         2
+#define        MAXUTF8LEN      3
+#define        MAXNFLEN        4
X 
X #ifdef        NOMULTIKANJI
X #define       _NOKANJICONV
@@ -287,7 +291,9 @@
X #ifndef       _NOKANJIFCONV
X K_EXTERN int defaultkcode K_INIT(NOCNV);
X #endif
-#ifndef        _NOKANJICONV
+#ifdef _NOKANJICONV
+#define        inputkcode      NOCNV
+#else
X K_EXTERN int inputkcode K_INIT(NOCNV);
X #endif
X #if   !defined (_NOKANJICONV) \
diff -urNP ../FD-2.09/libc.c ./libc.c
--- ../FD-2.09/libc.c   Tue Aug 22 00:00:00 2006
+++ ./libc.c    Tue Oct 31 00:00:00 2006
@@ -160,16 +160,23 @@
X       if (n == 1) {
X               cp = strrdelim(resolved, 0);
X               top = resolved;
-#if    MSDOS
-               top += 2;
-#else  /* !MSDOS */
-# ifndef       _NODOSDRIVE
+#ifndef        _USEDOSEMU
X               if (_dospath(resolved)) top += 2;
X               else
-# endif
+#endif
+#ifdef DOUBLESLASH
+               if ((n = isdslash(resolved)) && cp < &(resolved[n])) {
+                       top = &(resolved[n - 1]);
+                       if (*top != _SC_) return(resolved);
+               }
+               else
+#endif
+#if    MSDOS
+               top += 2;
+#else
X               if (rdlink && evallink(resolved, cp) > 0)
X                       return(_realpath2(path, resolved, rdlink));
-#endif /* !MSDOS */
+#endif
X               if (!cp || cp == top) {
X                       *top = _SC_;
X                       cp = top + 1;
@@ -195,13 +202,16 @@
X char *path, *resolved;
X int rdlink;
X {
-#if    !MSDOS && !defined (_NODOSDRIVE)
+#ifdef _USEDOSEMU
X       char *cp;
X       int duplastdrive;
X #endif
-#if    MSDOS || !defined (_NODOSDRIVE)
+#ifdef _USEDOSPATH
X       int drv;
X #endif
+#ifdef DOUBLESLASH
+       int n;
+#endif
X #if   MSDOS
X       int drive;
X #endif
@@ -210,25 +220,8 @@
X       strcpy(tmp, path);
X       path = tmp;
X 
-#if    MSDOS
-       drv = dospath(nullstr, NULL);
-       if ((drive = _dospath(path))) path += 2;
-       if (*path == _SC_) {
-               if (!drive) drive = drv;
-               VOID_C gendospath(resolved, drive, _SC_);
-       }
-       else if (drive && drive != drv) {
-               if (setcurdrv(drive, 0) < 0)
-                       VOID_C gendospath(resolved, drive, _SC_);
-               else {
-                       if (!Xgetwd(resolved)) lostcwd(resolved);
-                       if (setcurdrv(drv, 0) < 0) error("setcurdrv()");
-               }
-       }
-#else  /* !MSDOS */
-       if (*path == _SC_) copyrootpath(resolved);
-# ifndef       _NODOSDRIVE
-       else if ((drv = _dospath(path))) {
+#ifdef _USEDOSEMU
+       if ((drv = _dospath(path))) {
X               path += 2;
X               if (*path == _SC_) cp = NULL;
X               else {
@@ -239,11 +232,40 @@
X               }
X               if (!cp) VOID_C gendospath(resolved, drv, _SC_);
X       }
-# endif
+       else
+#endif
+#ifdef DOUBLESLASH
+       if ((n = isdslash(path))) {
+               strncpy2(resolved, path, n);
+               path += n;
+               if (*path == _SC_) path++;
+       }
+       else
+#endif
+       {
+#if    MSDOS
+               drv = dospath(nullstr, NULL);
+               if ((drive = _dospath(path))) path += 2;
+               if (*path == _SC_) {
+                       if (!drive) drive = drv;
+                       VOID_C gendospath(resolved, drive, _SC_);
+               }
+               else if (drive && drive != drv) {
+                       if (setcurdrv(drive, 0) < 0)
+                               VOID_C gendospath(resolved, drive, _SC_);
+                       else {
+                               if (!Xgetwd(resolved)) lostcwd(resolved);
+                               if (setcurdrv(drv, 0) < 0) error("setcurdrv()");
+                       }
+               }
+#else  /* !MSDOS */
+               if (*path == _SC_) copyrootpath(resolved);
X #endif        /* !MSDOS */
-       else if (!rdlink && resolved != fullpath && *fullpath)
-               strcpy(resolved, fullpath);
-       else if (!Xgetwd(resolved)) copyrootpath(resolved);
+               else if (!rdlink && resolved != fullpath && *fullpath)
+                       strcpy(resolved, fullpath);
+               else if (!Xgetwd(resolved)) copyrootpath(resolved);
+       }
+
X       norealpath++;
X       _realpath2(path, resolved, rdlink);
X       norealpath--;
@@ -881,7 +903,7 @@
X               fflush(stderr);
X               Xttyiomode(1);
X               keyflush();
-               getkey2(0);
+               getkey3(0, inputkcode);
X               Xstdiomode();
X               fputnl(stderr);
X       }
@@ -929,7 +951,7 @@
X               fflush(stderr);
X               Xttyiomode(1);
X               keyflush();
-               getkey2(0);
+               getkey3(0, inputkcode);
X               Xstdiomode();
X               fputnl(stderr);
X               if (wasttyflags & F_TTYIOMODE)
diff -urNP ../FD-2.09/machine.h ./machine.h
--- ../FD-2.09/machine.h        Tue Aug 22 00:00:00 2006
+++ ./machine.h Tue Oct 31 00:00:00 2006
@@ -23,6 +23,7 @@
X #define       BSPATHDELIM
X #define       USECRNL
X #define       CWDINPATH
+#define        DOUBLESLASH
X #define       NOTZFILEH
X #define       USETIMEH
X #define       USEUTIME
@@ -473,6 +474,7 @@
X #define       PATHNOCASE
X #define       COMMNOCASE
X #define       USECRNL
+#define        DOUBLESLASH
X #define       USEMANLANG
X #define       BSDINSTALL
X #define       TARUSESPACE
@@ -789,6 +791,7 @@
X /* #define BSPATHDELIM        ;path delimtor is backspace  */
X /* #define USECRNL    ;use CR-NL as end of line */
X /* #define CWDINPATH  ;CWD is implicitly included in command path */
+/* #define DOUBLESLASH ;pathname starting with // has some special mean */
X /* #define USEMANLANG ;man(1) directory includes LANG environment value */
X /* #define SUPPORTSJIS        ;cc(1) or man(1) supports Shift JIS perfectly */
X /* #define BSDINSTALL ;install(1) with option -c is valid like BSD */
diff -urNP ../FD-2.09/main.c ./main.c
--- ../FD-2.09/main.c   Tue Aug 22 00:00:00 2006
+++ ./main.c    Tue Oct 31 00:00:00 2006
@@ -158,6 +158,7 @@
X #ifdef        SIGALRM
X static int trapalrm __P_((VOID_A));
X #endif
+static int wrap_intrkey __P_((VOID_A));
X static char *NEAR getversion __P_((int *));
X #ifndef       _NOLOGGING
X static VOID NEAR startlog __P_((char **));
@@ -251,6 +252,7 @@
X               fputs(s, stderr);
X               fputnl(stderr);
X       }
+       fclose(stderr);
X 
X       if (isorgpid()) {
X               inittty(1);
@@ -604,7 +606,7 @@
X               Xputterm(T_BELL);
X               Xcputnl();
X               Xtflush();
-               if (kbhit2(1000000L) && getkey2(0) == K_ESC) {
+               if (kbhit2(1000000L) && getkey3(0, inputkcode) == K_ESC) {
X                       errno = 0;
X                       error(INTR_K);
X               }
@@ -736,6 +738,11 @@
X }
X #endif        /* SIGALRM */
X 
+static int wrap_intrkey(VOID_A)
+{
+       return(intrkey(-1));
+}
+
X int sigvecset(set)
X int set;
X {
@@ -757,7 +764,7 @@
X #endif
X #ifndef       _NODOSDRIVE
X               doswaitfunc = waitmes;
-               dosintrfunc = intrkey;
+               dosintrfunc = wrap_intrkey;
X #endif
X               status = 1;
X       }
@@ -983,7 +990,7 @@
X               }
X 
X               cp = line + strlen(line);
-               for (cp--; cp >= line && (*cp == ' ' || *cp == '\t'); cp--);
+               for (cp--; cp >= line && isblank2(*cp); cp--);
X               cp[1] = '\0';
X 
X               cont = 0;
@@ -1379,7 +1386,6 @@
X       environ[i] = NULL;
X #endif
X 
-       initenv();
X       setexecpath(argv[0], envp);
X #ifdef        _USEUNICODE
X       unitblpath = strdup2(DATADIR);
@@ -1414,6 +1420,7 @@
X               error(NTERM_K);
X       }
X #endif        /* !_NOORIGSHELL */
+       initenv();
X 
X       Xttyiomode(0);
X       initterm();
diff -urNP ../FD-2.09/makefile.b98 ./makefile.b98
--- ../FD-2.09/makefile.b98     Tue Aug 22 00:00:00 2006
+++ ./makefile.b98      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.bpc ./makefile.bpc
--- ../FD-2.09/makefile.bpc     Tue Aug 22 00:00:00 2006
+++ ./makefile.bpc      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.d98 ./makefile.d98
--- ../FD-2.09/makefile.d98     Tue Aug 22 00:00:00 2006
+++ ./makefile.d98      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.dpc ./makefile.dpc
--- ../FD-2.09/makefile.dpc     Tue Aug 22 00:00:00 2006
+++ ./makefile.dpc      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.g98 ./makefile.g98
--- ../FD-2.09/makefile.g98     Tue Aug 22 00:00:00 2006
+++ ./makefile.g98      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.gpc ./makefile.gpc
--- ../FD-2.09/makefile.gpc     Tue Aug 22 00:00:00 2006
+++ ./makefile.gpc      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.l98 ./makefile.l98
--- ../FD-2.09/makefile.l98     Tue Aug 22 00:00:00 2006
+++ ./makefile.l98      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/makefile.lpc ./makefile.lpc
--- ../FD-2.09/makefile.lpc     Tue Aug 22 00:00:00 2006
+++ ./makefile.lpc      Tue Oct 31 00:00:00 2006
@@ -4,7 +4,7 @@
X 
X TITLE = FD-
X VERMAJ        = 2
-VERSION        = 2.09
+VERSION        = 2.09a
X PREFIX        = 
X CONFDIR       = 
X BUILD =
diff -urNP ../FD-2.09/mktankan.c ./mktankan.c
--- ../FD-2.09/mktankan.c       Tue Aug 22 00:00:00 2006
+++ ./mktankan.c        Tue Oct 31 00:00:00 2006
@@ -696,7 +696,8 @@
X char *argv[];
X {
X       FILE *fp;
-       char buf[MAXKANASTR + 1], kbuf[4 + 1], tbuf[sizeof(tankanstr) + 1];
+       char buf[MAXKANASTR + 1];
+       char kbuf[MAXKLEN * R_MAXKANA + 1], tbuf[sizeof(tankanstr) + 1];
X       u_short code;
X       int n, len;
X 
diff -urNP ../FD-2.09/parse.c ./parse.c
--- ../FD-2.09/parse.c  Tue Aug 22 00:00:00 2006
+++ ./parse.c   Tue Oct 31 00:00:00 2006
@@ -103,7 +103,7 @@
X char *skipspace(cp)
X char *cp;
X {
-       while (*cp == ' ' || *cp == '\t') cp++;
+       while (isblank2(*cp)) cp++;
X 
X       return(cp);
X }
@@ -587,10 +587,9 @@
X       next = plist;
X       for (cp = next; cp && *cp; cp = next) {
X #ifdef        _USEDOSPATH
-               if (_dospath(cp)) next = strchr(&(cp[2]), PATHDELIM);
-               else
+               if (_dospath(cp)) next += 2;
X #endif
-               next = strchr(cp, PATHDELIM);
+               next = strchr(next, PATHDELIM);
X               len = (next) ? (next++) - cp : strlen(cp);
X               if ((tmp = underpath(path, cp, len))) return(tmp);
X       }
diff -urNP ../FD-2.09/pathname.c ./pathname.c
--- ../FD-2.09/pathname.c       Tue Aug 22 00:00:00 2006
+++ ./pathname.c        Tue Oct 31 00:00:00 2006
@@ -551,7 +551,7 @@
X {
X       int i;
X 
-       if (d && _dospath(s)) return(s + 1);
+       if (d && _dospath(s)) return(&(s[1]));
X       for (i = 0; s[i]; i++) {
X               if (s[i] == _SC_) return(&(s[i]));
X # ifdef       BSPATHDELIM
@@ -569,7 +569,7 @@
X       char *cp;
X       int i;
X 
-       if (d && _dospath(s)) cp = s + 1;
+       if (d && _dospath(s)) cp = &(s[1]);
X       else cp = NULL;
X       for (i = 0; s[i]; i++) {
X               if (s[i] == _SC_) cp = &(s[i]);
@@ -635,6 +635,10 @@
X       if (_dospath(s)) i = 2;
X       else
X #endif
+#ifdef DOUBLESLASH
+       if (isdslash(s)) i = 1;
+       else
+#endif
X       i = 0;
X       if (!s[i]) return(&(s[i]));
X       if (s[i] == _SC_ && !s[i + 1]) return(&(s[i + 1]));
@@ -674,6 +678,13 @@
X       }
X       else
X #endif
+#ifdef DOUBLESLASH
+       if (isdslash(s1)) {
+               buf[0] = s1[0];
+               i = 1;
+       }
+       else
+#endif
X       i = 0;
X       if (!s1[i]) cp = &(buf[i]);
X       else if (s1[i] == _SC_ && !s1[i + 1]) {
@@ -717,9 +728,12 @@
X int strcasecmp2(s1, s2)
X char *s1, *s2;
X {
+       int c1, c2;
+
X       for (;;) {
-               if (toupper2(*s1) != toupper2(*s2))
-                       return((u_char)*s1 - (u_char)*s2);
+               c1 = toupper2(*s1);
+               c2 = toupper2(*s2);
+               if (c1 != c2) return(c1 - c2);
X #ifndef       CODEEUC
X               if (issjis1(*s1)) {
X                       s1++;
@@ -739,9 +753,12 @@
X char *s1, *s2;
X int n;
X {
+       int c1, c2;
+
X       while (n-- > 0) {
-               if (toupper2(*s1) != toupper2(*s2))
-                       return((u_char)*s1 - (u_char)*s2);
+               c1 = toupper2(*s1);
+               c2 = toupper2(*s2);
+               if (c1 != c2) return(c1 - c2);
X #ifndef       CODEEUC
X               if (issjis1(*s1)) {
X                       if (n-- <= 0) break;
@@ -784,7 +801,7 @@
X       char *cp;
X 
X       if (len < 0) len = strlen(dir);
-       if ((cp = strrdelim2(dir, &(dir[len]))) && !*(cp + 1)) len = cp - dir;
+       if ((cp = strrdelim2(dir, &(dir[len]))) && !cp[1]) len = cp - dir;
X       if (len <= 0 || strnpathcmp(path, dir, len)) return(NULL);
X       if (path[len] && path[len] != _SC_) return(NULL);
X 
@@ -872,7 +889,7 @@
X int isrootpath(s)
X char *s;
X {
-       return((s[0] == _SC_ && !s[1]));
+       return((s[0] == _SC_ && !s[1]) ? 1 : 0);
X }
X 
X VOID copyrootpath(s)
@@ -889,12 +906,29 @@
X       *s = '\0';
X }
X 
+#ifdef DOUBLESLASH
+int isdslash(s)
+char *s;
+{
+# if   MSDOS || defined (CYGWIN)
+       char *cp;
+
+       if (s[0] != _SC_ || s[1] != _SC_ || !s[2] || s[2] == _SC_) return(0);
+       if ((cp = strdelim(&(s[2]), 0))) return(cp - s);
+
+       return(strlen(s));
+# else
+       return((s[0] == _SC_ && s[1] == _SC_) ? 2 : 0);
+# endif
+}
+#endif /* DOUBLESLASH */
+
X char *getbasename(s)
X char *s;
X {
X       char *cp;
X 
-       if ((cp = strrdelim(s, 1))) return(cp + 1);
+       if ((cp = strrdelim(s, 1))) return(&(cp[1]));
X 
X       return(s);
X }
@@ -1450,6 +1484,9 @@
X char ***argvp;
X wild_t *wp;
X {
+#ifdef DOUBLESLASH
+       int ds;
+#endif
X       DIR *dirp;
X       struct dirent *dp;
X       struct stat st;
@@ -1473,6 +1510,14 @@
X       quote = wp -> quote;
X 
X       if (wp -> fixed.len) addstrbuf(&(wp -> path), rootpath, 1);
+#ifdef DOUBLESLASH
+       if (wp -> path.len) ds = 0;
+       else if ((ds = isdslash(wp -> s))) {
+               addstrbuf(&(wp -> fixed), wp -> s, ds);
+               addstrbuf(&(wp -> path), wp -> s, ds);
+               wp -> s += ds;
+       }
+#endif
X 
X       for (i = w = 0; wp -> s[i] && wp -> s[i] != _SC_; i++) {
X               pc = parsechar(&(wp -> s[i]), -1,
@@ -1519,6 +1564,9 @@
X 
X       if (!w) {
X               if (wp -> path.len <= plen) w++;
+#ifdef DOUBLESLASH
+               else if (ds) st.st_mode = S_IFDIR;
+#endif
X               else if (stat2(wp -> path.s, &st) < 0) return(argc);
X 
X               wp -> s += i;
@@ -1529,13 +1577,17 @@
X               }
X 
X #ifndef       NODIRLOOP
+# ifdef        DOUBLESLASH
+               if (ds) /*EMPTY*/;
+               else
+# endif
X               if (!w) {
X                       wp -> ino = (devino_t *)realloc2(wp -> ino,
X                               (wp -> nino + 1) * sizeof(devino_t));
X                       wp -> ino[wp -> nino].dev = st.st_dev;
X                       wp -> ino[(wp -> nino)++].ino = st.st_ino;
X               }
-#endif
+#endif /* !NODIRLOOP */
X               return(_evalwild(argc, argvp, wp));
X       }
X 
@@ -1926,7 +1978,7 @@
X                       dlen = (next) ? (next++) - cp : strlen(cp);
X                       if (!dlen) tmp = NULL;
X                       else {
-                               tmp = _evalpath(cp, cp + dlen, 0);
+                               tmp = _evalpath(cp, &(cp[dlen]), 0);
X                               dlen = strlen(tmp);
X                       }
X                       if (dlen + len + 1 + EXTWIDTH + 1 > size) {
@@ -2201,7 +2253,7 @@
X # endif
X               next = strchr(cp, PATHDELIM);
X               dlen = (next) ? (next++) - cp : strlen(cp);
-               tmp = _evalpath(cp, cp + dlen, 0);
+               tmp = _evalpath(cp, &(cp[dlen]), 0);
X               dlen = strlen(tmp);
X               argc = completefile(file, len, argc, argvp, tmp, dlen, 2);
X               free(tmp);
@@ -2219,6 +2271,9 @@
X # if  MSDOS || (defined (FD) && !defined (_NODOSDRIVE))
X       char cwd[4];
X # endif
+# ifdef        DOUBLESLASH
+       int n;
+# endif
X       char *file, *dir;
X       int dlen;
X 
@@ -2232,8 +2287,20 @@
X # endif
X 
X       if ((file = strrdelim(dir, 0))) {
-               dlen += (file == dir) ? 1 : file - dir;
-               return(completefile(file + 1, strlen(file + 1), argc, argvp,
+               if (file == dir) {
+                       dlen++;
+                       file++;
+               }
+# ifdef        DOUBLESLASH
+               else if ((n = isdslash(path)) && file < &(path[n])) {
+                       if (path[n - 1] != _SC_) return(argc);
+                       dlen = n;
+                       file = &(path[n]);
+                       if (*file == _SC_) file++;
+               }
+# endif
+               else dlen += file++ - dir;
+               return(completefile(file, strlen(file), argc, argvp,
X                       path, dlen, exe));
X       }
X # ifndef      NOUID
@@ -2604,13 +2671,13 @@
X       ret = NULL;
X       len = strlen(s);
X       if ((mode & ~0x80) != '#') {
-               if (mode & 0x80) for (cp = s; cp < s + len; cp++) {
+               if (mode & 0x80) for (cp = s; cp < &(s[len]); cp++) {
X                       if (regexp_exec(re, cp, 0)) {
X                               ret = cp;
X                               break;
X                       }
X               }
-               else for (cp = s + len - 1; cp >= s; cp--) {
+               else for (cp = &(s[len - 1]); cp >= s; cp--) {
X                       if (regexp_exec(re, cp, 0)) {
X                               ret = cp;
X                               break;
@@ -3314,7 +3381,7 @@
X                       if (*cp == '`') {
X                               bbuf[j] = '\0';
X                               buf = replacebackquote(buf, &i,
-                                       bbuf, strlen(cp + 1));
+                                       bbuf, strlen(&(cp[1])));
X                               j = 0;
X                       }
X                       else if (!(flags & EA_STRIPQ)) buf[i++] = *cp;
@@ -3520,7 +3587,10 @@
X {
X #if   MSDOS && defined (FD) && !defined (_NOUSELFN)
X       char alias[MAXPATHLEN];
-       int top = -1;
+       int top;
+#endif
+#ifdef DOUBLESLASH
+       int ds;
X #endif
X       char *cp, *tmp;
X       int i, j, c, pc, size, quote;
@@ -3536,9 +3606,16 @@
X       free(cp);
X       cp = tmp;
X 
+#if    MSDOS && defined (FD) && !defined (_NOUSELFN)
+       top = -1;
+#endif
+#ifdef DOUBLESLASH
+       ds = isdslash(cp);
+#endif
X       size = strlen(cp) + 1;
X       tmp = malloc2(size);
X       quote = '\0';
+
X       for (i = j = c = 0; cp[i]; c = cp[i++]) {
X               pc = parsechar(&(cp[i]), -1, '\0', 0, &quote, NULL);
X               if (pc == PC_CLQUOTE) {
@@ -3573,9 +3650,12 @@
X                       if (!(flags & EA_NOEVALQ)) continue;
X               }
X               else if (pc != PC_NORMAL) /*EMPTY*/;
-               else if (!(flags & EA_NOUNIQDELIM)
-               && cp[i] == _SC_ && c == _SC_)
-                       continue;
+               else if (flags & EA_NOUNIQDELIM) /*EMPTY*/;
+#ifdef DOUBLESLASH
+               else if (ds && i == 1) /*EMPTY*/;
+#endif
+               else if (cp[i] == _SC_ && c == _SC_) continue;
+
X               tmp[j++] = cp[i];
X       }
X       tmp[j] = '\0';
diff -urNP ../FD-2.09/pathname.h ./pathname.h
--- ../FD-2.09/pathname.h       Tue Aug 22 00:00:00 2006
+++ ./pathname.h        Tue Oct 31 00:00:00 2006
@@ -21,6 +21,10 @@
X #define       NESTINGQUOTE
X #endif
X 
+#if    defined (MINIMUMSHELL) && defined (DOUBLESLASH)
+#undef DOUBLESLASH
+#endif
+
X #define       IFS_SET         " \t\n"
X #define       META            '\\'
X #if   MSDOS && defined (_NOORIGSHELL)
@@ -242,6 +246,9 @@
X extern int isrootpath __P_((char *));
X extern VOID copyrootpath __P_((char *));
X extern VOID copycurpath __P_((char *));
+#ifdef DOUBLESLASH
+extern int isdslash __P_((char *));
+#endif
X extern char *getbasename __P_((char *));
X extern char *getshellname __P_((char *, int *, int *));
X extern reg_t *regexp_init __P_((char *, int));
diff -urNP ../FD-2.09/rockridg.c ./rockridg.c
--- ../FD-2.09/rockridg.c       Tue Aug 22 00:00:00 2006
+++ ./rockridg.c        Tue Oct 31 00:00:00 2006
@@ -9,9 +9,6 @@
X 
X #ifndef       _NOROCKRIDGE
X 
-extern char typesymlist[];
-extern u_short typelist[];
-
X #define       TRANSTBLFILE    "TRANS.TBL"
X #define       TRANSTBLVAR     1
X #define       RR_TRANS        001
@@ -171,7 +168,7 @@
X                       continue;
X               }
X 
-               for (eol = cp; *eol && *eol != ' ' && *eol != '\t'; eol++);
+               for (eol = cp; *eol && !isblank2(*eol); eol++);
X               if (*eol) *(eol++) = '\0';
X               if (!*(eol = skipspace(eol))) {
X                       free(line);
@@ -180,15 +177,14 @@
X 
X               org = getorgname(cp, flags);
X               cp = eol;
-               while (*eol && *eol != ' ' && *eol != '\t') eol++;
+               while (*eol && !isblank2(*eol)) eol++;
X               l1 = eol - cp;
X               if (*eol) *(eol++) = '\0';
X               l2 = 0;
X               maj = min = (r_dev_t)-1;
X               if (*line == 'L') {
X                       eol = skipspace(eol);
-                       while (eol[l2] && eol[l2] != ' ' && eol[l2] != '\t')
-                               l2++;
+                       while (eol[l2] && !isblank2(eol[l2])) l2++;
X                       eol[l2++] = '\0';
X               }
X               else if (*line == 'B' || *line == 'C') {
@@ -433,8 +429,7 @@
X {
X       transtable *tp;
X       char *cp;
-       u_short mode;
-       int i, n;
+       u_int mode;
X 
X       if (!(cp = strrdelim(path, 0)) || !inittrans(path, cp++ - path))
X               return(-1);
@@ -446,11 +441,7 @@
X       }
X       rr_curtbl = tp;
X 
-       n = tolower2(tp -> type);
-       for (i = 0; typesymlist[i]; i++) if (n == typesymlist[i]) break;
-       if (!typesymlist[i]) mode = S_IFREG;
-       else mode = typelist[i];
-
+       if ((mode = getfmode(tp -> type)) == (u_int)-1) mode = S_IFREG;
X       stp -> st_mode &= ~S_IFMT;
X       stp -> st_mode |= mode;
X       if ((mode == S_IFBLK || mode == S_IFCHR) && tp -> rdev != (r_dev_t)-1)
diff -urNP ../FD-2.09/roman.c ./roman.c
--- ../FD-2.09/roman.c  Tue Aug 22 00:00:00 2006
+++ ./roman.c   Tue Oct 31 00:00:00 2006
@@ -296,7 +296,7 @@
X u_int c;
X {
X #ifndef       CODEEUC
-       char *cp, buf[2 + 1], tmp[2 + 1];
+       char *cp, buf[MAXKLEN + 1], tmp[MAXKLEN + 1];
X #endif
X 
X       if (!(c & ~0xff)) {
@@ -310,7 +310,7 @@
X       return(c | 0x8080);
X #else
X       VOID_C code2kanji(tmp, c | 0x8080);
-       cp = kanjiconv2(buf, tmp, 2, EUC, DEFCODE, L_INPUT);
+       cp = kanjiconv2(buf, tmp, MAXKLEN, EUC, DEFCODE, L_INPUT);
X       if (kanjierrno) return(0);
X 
X       return(((u_char)(cp[0]) << 8) | (u_char)(cp[1]));
@@ -321,9 +321,9 @@
X char *buf;
X {
X #ifndef       CODEEUC
-       char tmp[2 + 1];
+       char tmp[MAXKLEN + 1];
X 
-       buf = kanjiconv2(tmp, buf, 2, DEFCODE, EUC, L_INPUT);
+       buf = kanjiconv2(tmp, buf, MAXKLEN, DEFCODE, EUC, L_INPUT);
X       if (kanjierrno) return((u_int)0);
X #endif
X       return((((u_char)(buf[0]) << 8) | (u_char)(buf[1])) & ~0x8080);
diff -urNP ../FD-2.09/shell.c ./shell.c
--- ../FD-2.09/shell.c  Tue Aug 22 00:00:00 2006
+++ ./shell.c   Tue Oct 31 00:00:00 2006
@@ -25,6 +25,12 @@
X #define       O_TEXT          0
X #endif
X 
+typedef struct _localetable {
+       char *env;
+       char *val;
+       char *org;
+} localetable;
+
X extern int mark;
X extern off_t marksize;
X extern char fullpath[];
@@ -95,6 +101,17 @@
X int n_args = 0;
X 
X static short histbufsize[2] = {0, 0};
+static localetable localelist[] = {
+       {"LC_COLLATE", "C", NULL},
+       {"LC_CTYPE", "", NULL},
+       {"LC_MESSAGES", "C", NULL},
+       {"LC_MONETARY", "C", NULL},
+       {"LC_NUMERIC", "C", NULL},
+       {"LC_TIME", "C", NULL},
+       {"LC_ALL", NULL, NULL},
+       {"LANG", "C", NULL},
+};
+#define        LOCALELISTSIZ   arraysize(localelist)
X 
X 
X static int NEAR checksc(buf, ptr, arg)
@@ -205,11 +222,13 @@
X       int len, optr;
X 
X       if (!arg || !*arg) return(checksc(*bufp, ptr, NULL) - ptr);
-       if (!dir || !*dir) {
+       if (!dir) {
X #if   MSDOS && !defined (_NOUSELFN)
X               if ((flags & F_TOSFN) && shortname(arg, path) == path)
X                       arg = path;
+               else
X #endif
+               arg = convput(conv, arg, 1, 0, NULL, NULL);
X       }
X       else {
X               strcatdelim2(path, dir, arg);
@@ -220,13 +239,12 @@
X                       if (arg[len] == _SC_) arg[len] = '/';
X               }
X #endif
-       }
-
-       if (arg != path) arg = convput(conv, arg, 1, 0, NULL, NULL);
X #ifndef       _NOKANJIFCONV
-       else arg = kanjiconv2(conv, arg,
-               MAXPATHLEN - 1, DEFCODE, fnamekcode, L_FNAME);
+               arg = kanjiconv2(conv, arg,
+                       MAXPATHLEN - 1, DEFCODE, fnamekcode, L_FNAME);
X #endif
+       }
+
X       optr = ptr;
X       ptr = checksc(*bufp, ptr, arg);
X       arg = killmeta(arg);
@@ -1298,7 +1316,7 @@
X       char *cp, *tmp;
X       int n, ret;
X 
-       while (*command == ' ' || *command == '\t') command++;
+       command = skipspace(command);
X       if ((cp = evalalias(command))) command = cp;
X 
X       n = sigvecset(0);
@@ -1462,17 +1480,28 @@
X       macrostat st;
X       FILE *fp;
X       char *tmp, *lang;
+       int i;
X 
X       internal_status = FNC_FAIL;
X       st.flags = flags;
X       if (isinternalcomm(command)) st.flags |= F_ARGSET;
X 
X       if (!(tmp = evalcommand(command, arg, &st))) return(NULL);
-       if ((lang = strdup2(getenv2("LANG")))) setenv2("LANG", "C", 1);
+       for (i = 0; i < LOCALELISTSIZ; i++) {
+               localelist[i].org = strdup2(getenv2(localelist[i].env));
+               if (!(localelist[i].val) || *(localelist[i].val)) {
+                       setenv2(localelist[i].env, localelist[i].val, 1);
+                       continue;
+               }
+               lang = getenv2("LC_ALL");
+               if (!lang || !*lang) lang = getenv2(localelist[i].env);
+               if (!lang || !*lang) lang = getenv2("LANG");
+               setenv2(localelist[i].env, lang, 1);
+       }
X       fp = popen2(tmp);
-       if (lang) {
-               setenv2("LANG", lang, 1);
-               free(lang);
+       for (i = 0; i < LOCALELISTSIZ; i++) {
+               setenv2(localelist[i].env, localelist[i].org, 1);
+               if (localelist[i].org) free(localelist[i].org);
X       }
X       free(tmp);
X 
diff -urNP ../FD-2.09/system.c ./system.c
--- ../FD-2.09/system.c Tue Aug 22 00:00:00 2006
+++ ./system.c  Tue Oct 31 00:00:00 2006
@@ -125,6 +125,7 @@
X extern int completebuiltin __P_((char *, int, int, char ***));
X extern int completeinternal __P_((char *, int, int, char ***));
X # endif
+extern VOID initenv __P_((VOID_A));
X extern VOID evalenv __P_((char *, int));
X extern int underhome __P_((char *));
X extern int replaceargs __P_((int *, char ***, char **, int));
@@ -5746,7 +5747,7 @@
X                               addarg(&trp, rp, NULL, tptrp, 0);
X                               do {
X                                       (*ptrp)++;
-                               } while (s[*ptrp] == ' ' || s[*ptrp] == '\t');
+                               } while (isblank2(s[*ptrp]));
X 
X                               /* for "esac " */
X                               if ((stype = getparenttype(trp)) != STT_INCASE
@@ -11237,6 +11238,7 @@
X       setshellvar(envp);
X       if (initshell(argc, argv) < 0) return(RET_FAIL);
X #ifdef        FD
+       initenv();
X       if (interactive) {
X # if  MSDOS
X               inittty(1);
diff -urNP ../FD-2.09/term.c ./term.c
--- ../FD-2.09/term.c   Tue Aug 22 00:00:00 2006
+++ ./term.c    Tue Oct 31 00:00:00 2006
@@ -1282,7 +1282,7 @@
X #if   !MSDOS
X       for (i = 0; i <= K_MAX - K_MIN; i++) keyseq[i].code = K_MIN + i;
X       for (i = 21; i <= 30; i++)
-               keyseq[K_F(i) - K_MIN].code = K_F(i - 20) | 01000;
+               keyseq[K_F(i) - K_MIN].code = K_F(i - 20) | K_ALTERNATE;
X #endif        /* !MSDOS */
X 
X       return(0);
@@ -2063,7 +2063,7 @@
X       }
X       for (i = 0; i <= K_MAX - K_MIN; i++) keyseq[i].code = K_MIN + i;
X       for (i = 21; i <= 30; i++)
-               keyseq[K_F(i) - K_MIN].code = K_F(i - 20) | 01000;
+               keyseq[K_F(i) - K_MIN].code = K_F(i - 20) | K_ALTERNATE;
X       sortkeyseq();
X 
X       return(0);
@@ -2106,7 +2106,7 @@
X 
X       if (str) {
X               for (i = 0; i <= K_MAX - K_MIN; i++) {
-                       if ((keyseq[i].code & 0777) == n
+                       if ((keyseq[i].code & ~K_ALTERNATE) == n
X                       || !(keyseq[i].str) || keyseq[i].len != len)
X                               continue;
X                       if (!memcmp(str, keyseq[i].str, len)) {
@@ -2750,8 +2750,8 @@
X #endif
X 
X /*ARGSUSED*/
-int getkey2(sig)
-int sig;
+int getkey2(sig, code)
+int sig, code;
X {
X #if   !defined (DJGPP) || defined (NOTUSEBIOS) || defined (PC98)
X       static u_char tbuf1[3] = {0xff, 0xff, 0xff};
@@ -2818,10 +2818,9 @@
X int ungetch2(c)
X int c;
X {
-       if (ungetnum >= arraysize(ungetbuf) - 1) return(EOF);
-       if (ungetnum)
-               memmove((char *)&(ungetbuf[1]), (char *)&(ungetbuf[0]),
-                       ungetnum * sizeof(u_char));
+       if (ungetnum >= arraysize(ungetbuf)) return(EOF);
+       memmove((char *)&(ungetbuf[1]), (char *)&(ungetbuf[0]),
+               ungetnum * sizeof(u_char));
X       ungetbuf[0] = c;
X       ungetnum++;
X 
@@ -2948,8 +2947,9 @@
X       return((int)ch);
X }
X 
-int getkey2(sig)
-int sig;
+/*ARGSUSED*/
+int getkey2(sig, code)
+int sig, code;
X {
X       static int count = SENSEPERSEC;
X       kstree_t *p;
@@ -2976,9 +2976,9 @@
X       else if (key != C_EKANA) /*EMPTY*/;
X #  if !defined (_NOKANJICONV)
X #   ifdef     CODEEUC
-       else if (inputkcode != EUC && inputkcode != NOCNV) /*EMPTY*/;
+       else if (code != EUC && code != NOCNV) /*EMPTY*/;
X #   else
-       else if (inputkcode != EUC) /*EMPTY*/;
+       else if (code != EUC) /*EMPTY*/;
X #   endif
X #  endif      /* !_NOKANJICONV */
X       else {
@@ -3012,8 +3012,7 @@
X                       if (key == keyseq[p -> next[j].key].str[0]) break;
X               if (j >= p -> num) return(key);
X               p = &(p -> next[j]);
-               if (keyseq[p -> key].len == 1)
-                       return(keyseq[p -> key].code);
+               if (keyseq[p -> key].len == 1) return(keyseq[p -> key].code);
SHAR_EOF
  : || $echo 'restore of' 'FD-2.09a.patch' 'failed'
fi
$echo 'End of' 'FD-2.09a.patch' 'part' '2'
$echo 'File' 'FD-2.09a.patch' 'is continued in part' '3'
echo 3 > _sh00584/seq
exit 0
-- 
                                               しらい たかし