Path: ccsf.homeunix.org!CALA-MUZIK!newsfeed.media.kyoto-u.ac.jp!newsfeed.s-kddi1.home.ne.jp!news.home.ne.jp!news-virt.s-kddi1.home.ne.jp.POSTED!53ab2750!not-for-mail Newsgroups: fj.sources Subject: FDclone 2.09 patch [2/10] References: Followup-To: fj.sources.d Organization: UNIX users From: shirai@unixusers.net (Takashi SHIRAI) Lines: 2163 Message-ID: Date: Tue, 22 Aug 2006 07:00:43 GMT NNTP-Posting-Host: 61.46.104.74 X-Complaints-To: abuse@home.ne.jp X-Trace: news-virt.s-kddi1.home.ne.jp 1156230043 61.46.104.74 (Tue, 22 Aug 2006 16:00:43 JST) NNTP-Posting-Date: Tue, 22 Aug 2006 16:00:43 JST Xref: ccsf.homeunix.org fj.sources:175  しらいです。  file & directory 管理ツール FDclone 2.09 の patch その 2 です。 Submitted-by: shirai@chandra2 Archive-name: FD-2.09.patch/part02 ---- Cut Here and feed the following to sh ---- #!/bin/sh # This is `FD-2.09.shar.02' (part 2 of FD-2.09.patch). # Do not concatenate these parts, unpack them in order with `/bin/sh'. # File `FD-2.09.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 _sh00904/seq; then $echo 'Please unpack part 1 first!' exit 1 fi shar_sequence=`cat _sh00904/seq` if test "$shar_sequence" != 2; then $echo 'Please unpack part' "$shar_sequence" 'next!' exit 1 fi if test ! -f _sh00904/new; then $echo 'x -' 'STILL SKIPPING' 'FD-2.09.patch' else $echo 'x -' 'continuing file' 'FD-2.09.patch' sed 's/^X//' << 'SHAR_EOF' >> FD-2.09.patch && +#ifndef _NOEXTRACOPY + fshowprogress(path); +#endif X X return(APL_OK); X } @@ -754,6 +962,9 @@ X if ((n = checkrmv(path, R_OK | W_OK | X_OK)) < 0) X return((n == CHK_CANCEL) ? APL_CANCEL : APL_IGNORE); X if (Xrmdir(path) < 0) return(APL_ERROR); +#ifndef _NOEXTRACOPY + fshowprogress(path); +#endif X X return(APL_OK); X } @@ -1418,6 +1629,9 @@ X i = (*func)(fnodospath(path, filepos)); X if (i == APL_ERROR) warning(-1, filelist[filepos].name); X else if (i == APL_OK) ret++; +#ifndef _NOEXTRACOPY + if (endmes && copyline > 0) _showprogress(n_column); +#endif X return(ret); X } X @@ -1443,7 +1657,12 @@ X old = filepos; X } X - if (endmes) warning(0, endmes); + if (endmes) { +#ifndef _NOEXTRACOPY + if (copyline > 0) _showprogress(n_column); +#endif + warning(0, endmes); + } X filepos = dupfilepos; X movepos(old, 0); X Xlocate(win_x, win_y); @@ -1592,7 +1811,12 @@ X if (ret == APL_CANCEL) return(ret); X warning(-1, dir); X } - if (endmes) warning(0, endmes); + if (endmes) { +#ifndef _NOEXTRACOPY + if (copyline > 0) _showprogress(n_column); +#endif + warning(0, endmes); + } X X return(ret); X } @@ -1649,7 +1873,10 @@ X destdir = NULL; X if (mark > 0 X || (!isdir(&(filelist[filepos])) || islink(&(filelist[filepos])))) { - preparecopy(); + if (preparecopy(0, mark) < 0) { + free(destpath); + return(FNC_CANCEL); + } X VOID_C applyfile(safecopy, ENDCP_K); X } X #ifdef _NOEXTRACOPY @@ -1660,7 +1887,10 @@ X } X #endif X else { - preparecopy(); + if (preparecopy(1, 1) < 0) { + free(destpath); + return(FNC_CANCEL); + } X order = (islowerdir()) ? ORD_LOWER : ORD_NORMAL; X VOID_C applydir(filelist[filepos].name, safecopy, X cpdir, touchdir, order, ENDCP_K); @@ -1717,7 +1947,10 @@ X } X destdir = NULL; X if (mark > 0) { - preparemove(); + if (preparemove(0, mark) < 0) { + free(destpath); + return(FNC_CANCEL); + } X filepos = applyfile(safemove, ENDMV_K); X } X else if (islowerdir()) warning(EINVAL, filelist[filepos].name); @@ -1729,7 +1962,10 @@ X else ret = isxdev(fnodospath(path, filepos), NULL); X if (ret < 0) warning(-1, filelist[filepos].name); X else if (ret) { - preparemove(); + if (preparemove(1, 1) < 0) { + free(destpath); + return(FNC_CANCEL); + } X # ifndef _NODOSDRIVE X if (dospath3(nullstr)) waitmes(); X # endif @@ -1740,7 +1976,10 @@ X else X #endif /* !_NOEXTRACOPY */ X { - preparemove(); + if (preparemove(0, 1) < 0) { + free(destpath); + return(FNC_CANCEL); + } X ret = safemove(fnodospath(path, filepos)); X if (ret == APL_ERROR) X warning(-1, filelist[filepos].name); diff -urNP ../FD-2.08f/archive.c ./archive.c --- ../FD-2.08f/archive.c Tue Aug 8 00:00:00 2006 +++ ./archive.c Tue Aug 22 00:00:00 2006 @@ -19,6 +19,9 @@ X #endif X X extern int mark; +#if FD >= 2 +extern int sorttype; +#endif X extern int stackdepth; X #ifndef _NOTRADLAYOUT X extern int tradlayout; @@ -2105,7 +2108,11 @@ X launchp = list; X filelist = NULL; X maxent = 0; +#if FD >= 2 + if (sorttype < 200) sorton = 0; +#else X sorton = 0; +#endif X X if (readarchive(archivefile, launchp, flags) < 0) { X arcflist = NULL; diff -urNP ../FD-2.08f/browse.c ./browse.c --- ../FD-2.08f/browse.c Tue Aug 8 00:00:00 2006 +++ ./browse.c Tue Aug 22 00:00:00 2006 @@ -53,6 +53,7 @@ X #define CL_FIFO 7 X #define CL_BLOCK 8 X #define CL_CHAR 9 +#define CL_EXE 10 X #define ANSI_FG 8 X #define ANSI_BG 9 X @@ -130,6 +131,9 @@ X char *macrolist[MAXMACROTABLE]; X int maxmacro = 0; X int isearch = 0; +#if FD >= 2 +int helplayout = 0; +#endif X char *helpindex[MAXHELPINDEX] = { X #ifdef _NOTREE X "help", @@ -148,6 +152,26 @@ X #else X "Unpack", X #endif +#if FD >= 2 + "Attr", "Info", "Move", "rmDir", "mKdir", + "sHell", +# ifdef _NOWRITEFS + "", +# else + "Write", +# endif +# ifdef _NOARCHIVE + "", +# else + "Backup", +# endif + "View", +# ifdef _NOARCHIVE + "", +# else + "Pack", +# endif +#endif /* FD >= 2 */ X }; X char typesymlist[] = "dbclsp"; X u_short typelist[] = { @@ -171,6 +195,8 @@ X #endif X #ifndef _NOSPLITWIN X int windows = 1; +#endif +#if !defined (_NOSPLITWIN) || !defined (_NOPTY) X int win = 0; X #endif X int calc_x = -1; @@ -199,6 +225,7 @@ X ANSI_RED, /* CL_FIFO */ X ANSI_FG, /* CL_BLOCK */ X ANSI_FG, /* CL_CHAR */ + ANSI_FG, /* CL_EXE */ X }; X #endif /* !_NOCOLOR */ X #ifndef _NOPRECEDE @@ -220,6 +247,7 @@ X for (i = 0; i < MAXMODELIST; i++) X if ((namep -> st_mode & S_IFMT) == modelist[i]) X return(colorlist[i]); + if (isexec(namep)) return(CL_EXE); X X return(CL_REG); X } @@ -291,8 +319,20 @@ X { X int i, j, col, gap, width, len, ofs, max, blk, rest; X - max = MAXHELPINDEX; - blk = 5; +#if FD >= 2 + if (helplayout) { + max = helplayout / 100; + blk = helplayout % 100; + if (max < 0) max = FUNCLAYOUT / 100; + else if (max > MAXHELPINDEX) max = MAXHELPINDEX; + if (blk <= 0 || blk > max) blk = max; + } + else +#endif + { + max = FUNCLAYOUT / 100; + blk = FUNCLAYOUT % 100; + } X X if (ishardomit()) { X col = n_column; @@ -314,6 +354,7 @@ X col = n_column - 1; X gap = 3; X } + if (max > FUNCLAYOUT / 100) gap = 1; X X rest = max - 1 + gap * ((max - 1) / blk); X width = (col - 4 - rest) / max; diff -urNP ../FD-2.08f/builtin.c ./builtin.c --- ../FD-2.08f/builtin.c Tue Aug 8 00:00:00 2006 +++ ./builtin.c Tue Aug 22 00:00:00 2006 @@ -20,6 +20,10 @@ X #include "termemu.h" X #endif X +#ifndef _NOIME +#include "roman.h" +#endif + X #define MD5_BUFSIZ (128 / 32) X #define MD5_BLOCKS 16 X @@ -69,6 +73,10 @@ X #ifndef _NOPTY X extern int parentfd; X #endif +#ifndef _NOIME +extern romantable *romanlist; +extern int maxromanlist; +#endif X X static VOID NEAR builtinerror __P_((char *[], char *, int)); X #ifdef _NOORIGSHELL @@ -77,7 +85,7 @@ X #define hitkey(n) X #endif X static VOID NEAR fputsmeta __P_((char *, FILE *)); -#if !defined (_NOARCHIVE) && !defined(_NOBROWSE) +#if (!defined (_NOARCHIVE) && !defined(_NOBROWSE)) || !defined (_NOIME) X static char **NEAR file2argv __P_((FILE *, char *, int)); X #endif X #ifndef _NOARCHIVE @@ -125,6 +133,11 @@ X #if !MSDOS && (FD >= 2) X static int NEAR savetty __P_((int, char *[])); X #endif +#ifndef _NOIME +static int NEAR setroman __P_((int, char *[])); +static VOID NEAR disproman __P_((char *, int, FILE *)); +static int NEAR printroman __P_((int, char *[])); +#endif X #ifdef _NOORIGSHELL X static int NEAR printenv __P_((int, char *[])); X static int NEAR setalias __P_((int, char *[])); @@ -216,6 +229,10 @@ X #if !MSDOS && (FD >= 2) X {savetty, BL_SAVETTY}, X #endif +#ifndef _NOIME + {setroman, BL_SETROMAN}, + {printroman, BL_PRINTROMAN}, +#endif X #ifdef _NOORIGSHELL X # if FD >= 2 X {printenv, BL_SET}, @@ -305,7 +322,7 @@ X } X } X -#if !defined (_NOARCHIVE) && !defined(_NOBROWSE) +#if (!defined (_NOARCHIVE) && !defined(_NOBROWSE)) || !defined (_NOIME) X static char **NEAR file2argv(fp, s, whole) X FILE *fp; X char *s; @@ -384,7 +401,7 @@ X X return(argv); X } -#endif /* !_NOARCHIVE && !_NOBROWSE */ +#endif /* (!_NOARCHIVE && !_NOBROWSE) || !_NOIME */ X X #ifndef _NOARCHIVE X # if FD >= 2 @@ -2778,6 +2795,149 @@ X } X # endif /* FD >= 2 */ X #endif /* !MSDOS */ + +#ifndef _NOIME +static int NEAR setroman(argc, argv) +int argc; +char *argv[]; +{ + FILE *fp; + char *file, **args; + int i, n, skip, clean; + + file = NULL; + skip = clean = 0; + for (n = 1; n < argc && argv[n][0] == '-'; n++) { + skip = 0; + for (i = 1; argv[n][i]; i++) { + skip = 0; + switch (argv[n][i]) { + case 'c': + clean = 2; + break; + case 'r': + clean = 1; + break; + case 'f': + if (argv[n][i + 1]) { + file = &(argv[n][i + 1]); + skip = 1; + } + else if (n + 1 < argc) { + file = argv[++n]; + skip = 1; + } + else skip = -1; + break; + default: + skip = -1; + break; + } + if (skip) { + skip--; + break; + } + } + if (skip) { + skip--; + break; + } + } + if (skip || (!file && !clean && n >= argc)) { + fprintf2(stderr, + "%k: usage: %k [-c] [-r] [-f file] [roman [kanji]]]", + argv[0], argv[0]); + fputnl(stderr); + return(-1); + } + + if (clean) { + freeroman(clean - 1); +# ifndef _NOPTY + sendparent(TE_FREEROMAN, clean - 1); +# endif + } + + if (!file) fp = NULL; + else if (!(fp = Xfopen(file, "r"))) { + builtinerror(argv, file, -1); + return(-1); + } + else for (;;) { + args = file2argv(fp, argv[0], 0); + i = 1; + if (args[i] && !strcommcmp(args[i], BL_SETROMAN)) i++; + + if (!args[i]) /*EMPTY*/; + else if (addroman(args[i], args[i + 1]) < 0) + builtinerror(argv, args[i], ER_SYNTAXERR); +# ifndef _NOPTY + else sendparent(TE_ADDROMAN, args[i], args[i + 1]); +# endif + freevar(args); + + if (Xfeof(fp)) break; + } + if (fp) Xfclose(fp); + + if (n >= argc) /*EMPTY*/; + else if (addroman(argv[n], argv[n + 1]) < 0) { + builtinerror(argv, argv[n], ER_SYNTAXERR); + return(-1); + } +# ifndef _NOPTY + else sendparent(TE_ADDROMAN, argv[n], argv[n + 1]); +# endif + + return(0); +} + +static VOID NEAR disproman(s, n, fp) +char *s; +int n; +FILE *fp; +{ + char buf[2 + 1]; + int i; + + if (s && *s) fprintf2(fp, "%s ", s); + fprintf2(fp, "%s \"", romanlist[n].str); + for (i = 0; i < R_MAXKANA; i++) { + if (!romanlist[n].code[i]) break; + VOID_C jis2str(buf, romanlist[n].code[i]); + fprintf2(fp, "%k", buf); + } + fputc('"', fp); + fputnl(fp); +} + +static int NEAR printroman(argc, argv) +int argc; +char *argv[]; +{ + int i, n, ret; + + initroman(); + ret = -1; + + if (argc < 2) { + for (i = 0; i < maxromanlist; i++) + disproman(BL_SETROMAN, i, stdout); + ret = 0; + } + else for (n = 1; n < argc; n++) { + if (!*(argv[n]) + || (i = searchroman(argv[n], strlen(argv[n]))) < 0) { + builtinerror(argv, argv[n], ER_NOENTRY); + continue; + } + disproman(BL_PRINTROMAN, i, stdout); + ret = 0; + } + + return(ret); +} +#endif /* !_NOIME */ X X #ifdef _NOORIGSHELL X static int NEAR printenv(argc, argv) diff -urNP ../FD-2.08f/command.c ./command.c --- ../FD-2.08f/command.c Tue Aug 8 00:00:00 2006 +++ ./command.c Tue Aug 22 00:00:00 2006 @@ -1424,7 +1424,7 @@ X X if (mark > 0) { X if (!yesno(DELMK_K)) return(FNC_CANCEL); - prepareremove(); + if (prepareremove(0, mark) < 0) return(FNC_CANCEL); X filepos = applyfile(rmvfile, NULL); X } X else if (isdir(&(filelist[filepos]))) return(warning_bell(arg)); @@ -1433,7 +1433,7 @@ X len = strlen2(cp) - strsize("%.*s"); X if (!yesno(cp, n_lastcolumn - len, filelist[filepos].name)) X return(FNC_CANCEL); - prepareremove(); + if (prepareremove(0, 1) < 0) return(FNC_CANCEL); X filepos = applyfile(rmvfile, NULL); X } X if (filepos >= maxfile && (filepos -= 2) < 0) filepos = 0; @@ -1459,14 +1459,14 @@ X cp = filelist[filepos].name; X #ifndef NOSYMLINK X if (islink(&(filelist[filepos]))) { - prepareremove(); + if (prepareremove(0, 1) < 0) return(FNC_CANCEL); X ret = rmvfile(fnodospath(path, filepos)); X if (ret == APL_ERROR) warning(-1, cp); X } X else X #endif X { - prepareremove(); + if (prepareremove(1, 1) < 0) return(FNC_CANCEL); X ret = applydir(cp, rmvfile, NULL, rmvdir, ORD_NOPREDIR, NULL); X } X if (ret == APL_OK) filepos++; diff -urNP ../FD-2.08f/custom.c ./custom.c --- ../FD-2.08f/custom.c Tue Aug 8 00:00:00 2006 +++ ./custom.c Tue Aug 22 00:00:00 2006 @@ -25,15 +25,19 @@ X #if !defined (_USEDOSCOPY) && !defined (_NOEXTRACOPY) X extern int inheritcopy; X #endif +#ifndef _NOEXTRACOPY +extern int progressbar; +extern int precopymenu; +#endif X #if !MSDOS X extern int adjtty; X #endif X extern int hideclock; X extern int defcolumns; X extern int minfilename; -extern char *histfile; +extern char *histfile[]; X extern short histsize[]; -extern int savehist; +extern short savehist[]; X #ifndef _NOTREE X extern int dircountlimit; X #endif @@ -45,6 +49,13 @@ X extern int tradlayout; X #endif X extern int sizeinfo; +#if FD >= 2 +extern int helplayout; +#endif +#ifndef _NOIME +extern int imekey; +extern int imebuffer; +#endif X #ifndef _NOCOLOR X extern int ansicolor; X # if FD >= 2 @@ -84,6 +95,7 @@ X extern char *cappath; X extern char *utf8path; X extern char *utf8macpath; +extern char *utf8iconvpath; X extern char *noconvpath; X #endif /* !_NOKANJIFCONV */ X #if FD >= 2 @@ -118,6 +130,9 @@ X #ifdef _USEUNICODE X extern char *unitblpath; X #endif +#ifndef _NOIME +extern char *dicttblpath; +#endif X #ifndef _NOCUSTOMIZE X extern int curcolumns; X extern int subwindow; @@ -160,9 +175,16 @@ X #define MAXCUSTVAL (n_column - MAXCUSTNAM - 3) X #define noselect(n, m, x, s, v) \ X (selectstr(n, m, x, s, v) != K_CR) +#define getmax(m, n) do { \ + cs_max = ((!(n) & basiccustom) \ + ? nbasic : (m)[n]); \ + } while (0) +#define setmax(m, n) do { \ + if (!(n)) (m)[n] = cs_max; \ + } while (0) X #define MAXSAVEMENU 5 -#define DEFPALETTE "8962435188" -#define MAXPALETTE 10 +#define DEFPALETTE "89624351888" +#define MAXPALETTE 11 X #define MAXCOLOR 10 X #ifndef O_TEXT X #define O_TEXT 0 @@ -191,6 +213,7 @@ X #define env_str(n) (&(envlist[n].env[FDESIZ])) X #define fdenv_str(n) (envlist[n].env) X #define env_type(n) (envlist[n].type & T_TYPE) +#define _B_(t) (T_BASIC | (t)) X #ifdef FORCEDSTDC X #define def_str(n) (envlist[n].def.str) X #define def_num(n) (envlist[n].def.num) @@ -203,6 +226,7 @@ X X #define T_TYPE 0037 X #define T_PRIMAL 0040 +#define T_BASIC 0100 X #define T_BOOL 0 X #define T_SHORT 1 X #define T_INT 2 @@ -226,10 +250,12 @@ X #define T_KOUT 16 X #define T_KNAM 17 X #define T_KTERM 18 -#define T_KPATHS 19 -#define T_OCTAL 20 -#define T_KEYCODE 21 -#define T_NOVAR 22 +#define T_MESLANG 19 +#define T_KPATHS 20 +#define T_OCTAL 21 +#define T_KEYCODE 22 +#define T_HELP 23 +#define T_NOVAR 24 X X #ifndef _NOKANJIFCONV X typedef struct _pathtable { @@ -349,11 +375,17 @@ X X #ifndef _NOCUSTOMIZE X int custno = -1; +int basiccustom = 0; X #endif X X static envtable envlist[] = { - {"FD_SORTTYPE", &sorttype, DEFVAL(SORTTYPE), STTP_E, T_SORT}, - {"FD_DISPLAYMODE", &displaymode, DEFVAL(DISPLAYMODE), DPMD_E, T_DISP}, +#ifndef _NOCUSTOMIZE + {"FD_BASICCUSTOM", &basiccustom, + DEFVAL(BASICCUSTOM), BSCS_E, _B_(T_BOOL)}, +#endif + {"FD_SORTTYPE", &sorttype, DEFVAL(SORTTYPE), STTP_E, _B_(T_SORT)}, + {"FD_DISPLAYMODE", &displaymode, + DEFVAL(DISPLAYMODE), DPMD_E, _B_(T_DISP)}, X #ifndef _NOTREE X {"FD_SORTTREE", &sorttree, DEFVAL(SORTTREE), STTR_E, T_BOOL}, X #endif @@ -366,6 +398,10 @@ X #if !defined (_USEDOSCOPY) && !defined (_NOEXTRACOPY) X {"FD_INHERITCOPY", &inheritcopy, DEFVAL(INHERITCOPY), IHTM_E, T_BOOL}, X #endif +#ifndef _NOEXTRACOPY + {"FD_PROGRESSBAR", &progressbar, DEFVAL(PROGRESSBAR), PRGB_E, T_BOOL}, + {"FD_PRECOPYMENU", &precopymenu, DEFVAL(PRECOPYMENU), PCMN_E, T_BOOL}, +#endif X #if !MSDOS X {"FD_ADJTTY", &adjtty, DEFVAL(ADJTTY), AJTY_E, T_BOOL}, X # if FD >= 2 @@ -373,13 +409,24 @@ X DEFVAL(USEGETCURSOR), UGCS_E, T_BOOL}, X # endif X #endif /* !MSDOS */ - {"FD_DEFCOLUMNS", &defcolumns, DEFVAL(DEFCOLUMNS), CLMN_E, T_COLUMN}, + {"FD_DEFCOLUMNS", &defcolumns, + DEFVAL(DEFCOLUMNS), CLMN_E, _B_(T_COLUMN)}, X {"FD_MINFILENAME", &minfilename, X DEFVAL(MINFILENAME), MINF_E, T_NATURAL}, - {"FD_HISTFILE", &histfile, DEFVAL(HISTFILE), HSFL_E, T_PATH}, - {"FD_HISTSIZE", &(histsize[0]), DEFVAL(HISTSIZE), HSSZ_E, T_SHORT}, - {"FD_DIRHIST", &(histsize[1]), DEFVAL(DIRHIST), DRHS_E, T_SHORT}, - {"FD_SAVEHIST", &savehist, DEFVAL(SAVEHIST), SVHS_E, T_INT}, + {"FD_HISTFILE", &(histfile[0]), DEFVAL(HISTFILE), HSFL_E, T_PATH}, +#if FD >= 2 + {"FD_DIRHISTFILE", &(histfile[1]), + DEFVAL(DIRHISTFILE), DHFL_E, T_PATH}, +#endif + {"FD_HISTSIZE", &(histsize[0]), + DEFVAL(HISTSIZE), HSSZ_E, _B_(T_SHORT)}, + {"FD_DIRHIST", &(histsize[1]), DEFVAL(DIRHIST), DRHS_E, _B_(T_SHORT)}, + {"FD_SAVEHIST", &(savehist[0]), + DEFVAL(SAVEHIST), SVHS_E, _B_(T_SHORT)}, +#if FD >= 2 + {"FD_SAVEDIRHIST", &(savehist[1]), + DEFVAL(SAVEDIRHIST), SVDH_E, T_SHORT}, +#endif X #ifndef _NOTREE X {"FD_DIRCOUNTLIMIT", &dircountlimit, X DEFVAL(DIRCOUNTLIMIT), DCLM_E, T_INT}, @@ -387,13 +434,20 @@ X #ifndef _NODOSDRIVE X {"FD_DOSDRIVE", &dosdrive, DEFVAL(DOSDRIVE), DOSD_E, T_DDRV}, X #endif - {"FD_SECOND", &showsecond, DEFVAL(SECOND), SCND_E, T_BOOL}, + {"FD_SECOND", &showsecond, DEFVAL(SECOND), SCND_E, _B_(T_BOOL)}, X #ifndef _NOTRADLAYOUT X {"FD_TRADLAYOUT", &tradlayout, DEFVAL(TRADLAYOUT), TRLO_E, T_BOOL}, X #endif - {"FD_SIZEINFO", &sizeinfo, DEFVAL(SIZEINFO), SZIF_E, T_BOOL}, + {"FD_SIZEINFO", &sizeinfo, DEFVAL(SIZEINFO), SZIF_E, _B_(T_BOOL)}, +#if FD >= 2 + {"FD_FUNCLAYOUT", &helplayout, DEFVAL(FUNCLAYOUT), FNLO_E, T_HELP}, +#endif +#ifndef _NOIME + {"FD_IMEKEY", &imekey, DEFVAL(IMEKEY), IMKY_E, T_KEYCODE}, + {"FD_IMEBUFFER", &imebuffer, DEFVAL(IMEBUFFER), IMBF_E, T_BOOL}, +#endif X #ifndef _NOCOLOR - {"FD_ANSICOLOR", &ansicolor, DEFVAL(ANSICOLOR), ACOL_E, T_COLOR}, + {"FD_ANSICOLOR", &ansicolor, DEFVAL(ANSICOLOR), ACOL_E, _B_(T_COLOR)}, X # if FD >= 2 X {"FD_ANSIPALETTE", &ansipalette, X DEFVAL(ANSIPALETTE), APAL_E, T_COLORPAL}, @@ -450,13 +504,13 @@ X #endif X #if !defined (_NOKANJICONV) \ X || (!defined (_NOENGMES) && !defined (_NOJPNMES)) - {"FD_LANGUAGE", &outputkcode, DEFVAL(NOCNV), LANG_E, T_KOUT}, + {"FD_LANGUAGE", &outputkcode, DEFVAL(NOCNV), LANG_E, _B_(T_KOUT)}, X #endif X #ifndef _NOKANJIFCONV X {"FD_DEFKCODE", &defaultkcode, DEFVAL(NOCNV), DFKC_E, T_KNAM}, X #endif X #ifndef _NOKANJICONV - {"FD_INPUTKCODE", &inputkcode, DEFVAL(NOCNV), IPKC_E, T_KIN}, + {"FD_INPUTKCODE", &inputkcode, DEFVAL(NOCNV), IPKC_E, _B_(T_KIN)}, X #endif X #if !defined (_NOKANJICONV) && !defined (_NOPTY) X {"FD_PTYINKCODE", &ptyinkcode, DEFVAL(NOCNV), PIKC_E, T_KTERM}, @@ -464,6 +518,11 @@ X #endif X #ifndef _NOKANJIFCONV X {"FD_FNAMEKCODE", &fnamekcode, DEFVAL(NOCNV), FNKC_E, T_KNAM}, +#endif +#if !defined (_NOENGMES) && !defined (_NOJPNMES) + {"FD_MESSAGELANG", &messagelang, DEFVAL(NOCNV), MESL_E, T_MESLANG}, +#endif +#ifndef _NOKANJIFCONV X {"FD_SJISPATH", &sjispath, DEFVAL(SJISPATH), SJSP_E, T_KPATHS}, X {"FD_EUCPATH", &eucpath, DEFVAL(EUCPATH), EUCP_E, T_KPATHS}, X {"FD_JISPATH", &jis7path, DEFVAL(JISPATH), JISP_E, T_KPATHS}, @@ -477,6 +536,8 @@ X {"FD_UTF8PATH", &utf8path, DEFVAL(UTF8PATH), UTF8P_E, T_KPATHS}, X {"FD_UTF8MACPATH", &utf8macpath, X DEFVAL(UTF8MACPATH), UTF8MACP_E, T_KPATHS}, + {"FD_UTF8ICONVPATH", &utf8iconvpath, + DEFVAL(UTF8ICONVPATH), UTF8ICONVP_E, T_KPATHS}, X {"FD_NOCONVPATH", &noconvpath, DEFVAL(NOCONVPATH), NCVP_E, T_KPATHS}, X #endif /* !_NOKANJIFCONV */ X #ifndef _NOCUSTOMIZE @@ -501,6 +562,9 @@ X # ifdef _USEUNICODE X {&unitblpath, NULL, NOCNV, P_STABLE}, X # endif +# ifndef _NOIME + {&dicttblpath, NULL, NOCNV, P_STABLE}, +# endif X }; X #define PATHLISTSIZ arraysize(pathlist) X # ifndef _NOSPLITWIN @@ -525,6 +589,8 @@ X }; X #define MEDIADESCRSIZ arraysize(mediadescr) X # endif /* _USEDOSEMU */ +static char basicenv[ENVLISTSIZ]; +static int nbasic = 0; X static int cs_item = 0; X static int cs_max = 0; X static int cs_row = 0; @@ -728,6 +794,7 @@ X case T_KOUT: X case T_KNAM: X case T_KTERM: + case T_MESLANG: X n = (1 << (env_type(no) - T_KIN)); X *((int *)(envlist[no].var)) = getlang(cp, n); X break; @@ -738,12 +805,20 @@ X *((int *)(envlist[no].var)) = n; X break; X #endif -#ifndef _NOPTY +#if !defined (_NOPTY) || !defined (_NOIME) X case T_KEYCODE: X if ((n = getkeycode(cp, 0)) < 0) n = def_num(no); X *((int *)(envlist[no].var)) = n; X break; X #endif +#if FD >= 2 + case T_HELP: + if ((n = atoi2(cp)) < 0 || (n / 100) > MAXHELPINDEX + || (n % 100) > (n / 100)) + n = def_num(no); + *((int *)(envlist[no].var)) = n; + break; +#endif X #ifndef _NOCUSTOMIZE X case T_NOVAR: X break; @@ -884,7 +959,7 @@ X X #ifndef _NOKANJIFCONV X type = env_type(n); - if (type < T_KIN || type > T_KPATHS) type = -1; + if (type != T_KPATHS && (type < T_KIN || type > T_KTERM)) type = -1; X if (type >= 0) savepathlang(); X #endif X _evalenv(n); @@ -1344,6 +1419,7 @@ X int n, p; X X new = NULL; + if (basiccustom) no = basicenv[no]; X switch (env_type(no)) { X case T_BOOL: X str[0] = VBOL0_K; @@ -1382,7 +1458,12 @@ X } X if (p) { X new = strcatalloc(new, ", "); - new = strcatalloc(new, VSORT_K); +#if FD >= 2 + if (p > 1) cp = VSARC_K; + else +#endif + cp = VSORT_K; + new = strcatalloc(new, cp); X } X cp = new; X break; @@ -1473,6 +1554,7 @@ X case T_KOUT: X case T_KNAM: X case T_KTERM: + case T_MESLANG: X str[NOCNV] = VNCNV_K; X str[ENG] = VENG_K; X # ifndef _NOKANJICONV @@ -1488,6 +1570,7 @@ X str[CAP] = "CAP"; X str[UTF8] = "UTF-8"; X str[M_UTF8] = "UTF-8 for Mac OS X"; + str[I_UTF8] = "UTF-8 for iconv"; X # endif /* !_NOKANJICONV */ X cp = str[*((int *)(envlist[no].var))]; X break; @@ -1497,11 +1580,24 @@ X cp = ascoctal(*((int *)(envlist[no].var)), buf); X break; X # endif -# ifndef _NOPTY +# if !defined (_NOPTY) || !defined (_NOIME) X case T_KEYCODE: X cp = getenv2(fdenv_str(no)); X break; X # endif +# if FD >= 2 + case T_HELP: + n = *((int *)(envlist[no].var)); + p = n / 100; + n %= 100; + new = strdup2(VFNMX_K); + new = strcatalloc(new, int2str(buf, p)); + new = strcatalloc(new, ", "); + new = strcatalloc(new, VFNBR_K); + new = strcatalloc(new, int2str(buf, n)); + cp = new; + break; +# endif /* FD >= 2 */ X default: X if (!(cp = getenv2(fdenv_str(no)))) cp = def_str(no); X break; @@ -1527,6 +1623,7 @@ X for (n = 0; n < MAXSELECTSTRS; n++) val[n] = n; X X new = NULL; + if (basiccustom) no = basicenv[no]; X env = env_str(no); X switch (env_type(no)) { X case T_BOOL: @@ -1614,8 +1711,10 @@ X envcaption(VSORT_K); X str[0] = VSRT0_K; X str[1] = VSRT1_K; + str[2] = VSRT2_K; X val[0] = 0; X val[1] = 1; + val[2] = 2; X if (noselect(&p, MAXSORTINHERIT + 1, 0, str, val)) X return(0); X n += p * 100; @@ -1728,6 +1827,7 @@ X str[7] = VCFIF_K; X str[8] = VCBLD_K; X str[9] = VCCHD_K; + str[10] = VCEXE_K; X str[MAXPALETTE] = VUSET_K; X val[MAXPALETTE] = -1; X envcaption(env); @@ -1789,6 +1889,7 @@ X case T_KNAM: X case T_KOUT: X case T_KTERM: + case T_MESLANG: X tmp = 0; X str[tmp] = VNCNV_K; X val[tmp++] = NOCNV; @@ -1839,6 +1940,7 @@ X n--; X break; X case M_UTF8: + case I_UTF8: X p = n - UTF8; X n = UTF8; X break; @@ -1870,7 +1972,8 @@ X case UTF8: X str[0] = VUTF8_K; X str[1] = VUTFM_K; - tmp = 2; + str[2] = VUTFI_K; + tmp = 3; X break; X default: X tmp = -1; @@ -1879,6 +1982,7 @@ X if (tmp >= 0) { X val[0] = 0; X val[1] = 1; + val[2] = 2; X if (noselect(&p, tmp, 64, str, val)) return(0); X n += p; X } @@ -1900,6 +2004,7 @@ X str[CAP] = "cap"; X str[UTF8] = "utf8"; X str[M_UTF8] = "utf8-mac"; + str[I_UTF8] = "utf8-iconv"; X # endif /* !_NOKANJICONV */ X cp = str[n]; X break; @@ -1919,7 +2024,7 @@ X cp = ascoctal(n, buf); X break; X # endif /* FD >= 2 */ -# ifndef _NOPTY +# if !defined (_NOPTY) || !defined (_NOIME) X case T_KEYCODE: X cp = asprintf3(VKYCD_K, env); X n = inputkeycode(cp); @@ -1932,7 +2037,40 @@ X cp = getkeysym(n, 0); X if (!yesno(VKYOK_K, cp, env_str(no))) return(0); X break; -# endif /* !_NOPTY */ +# endif /* !_NOPTY || !_NOIME */ +# if FD >= 2 + case T_HELP: + n = *((int *)(envlist[no].var)); + p = n / 100; + n %= 100; + envcaption(env); + int2str(buf, p); + lcmdline = -1; + cp = inputcustenvstr(VFNMX_K, 1, buf, -1); + if (cp == (char *)-1) return(0); + if (!cp) break; + p = atoi2(cp); + free(cp); + if (p < 0 || p > MAXHELPINDEX) { + warning(0, VALNG_K); + return(0); + } + + envcaption(env); + int2str(buf, n); + lcmdline = -1; + cp = inputcustenvstr(VFNBR_K, 1, buf, -1); + if (cp == (char *)-1) return(0); + if (!cp) break; + n = atoi2(cp); + free(cp); + if (n < 0 || n > p) { + warning(0, VALNG_K); + return(0); + } + cp = int2str(buf, p * 100 + n); + break; +# endif /* FD >= 2 */ X default: X if (!(cp = getenv2(fdenv_str(no)))) cp = def_str(no); X new = inputcustenvstr(env, 0, cp, -1); @@ -3889,18 +4027,18 @@ X } X else { X warning(-1, path); -# if MSDOS || defined (CYGWIN) - lockclose(lck); +# if !MSDOS && !defined (CYGWIN) X if (fd >= 0) { - if (fpin) VOID_C Xclose(fd); X Xunlink(path); + if (fpin) VOID_C Xclose(fd); X } + lockclose(lck); X # else + lockclose(lck); X if (fd >= 0) { - Xunlink(path); X if (fpin) VOID_C Xclose(fd); + Xunlink(path); X } - lockclose(lck); X # endif X return(-1); X } @@ -4073,10 +4211,7 @@ X if (origflaglist[i]) free(origflaglist[i]); X } X - if (!fpin) { - lockclose(lck); - n = 0; - } + if (!fpin) lockclose(lck); X else { X # if !MSDOS && !defined (CYGWIN) X n = Xrename(path, file); @@ -4094,12 +4229,11 @@ X } X # endif X # endif /* MSDOS || CYGWIN */ - } - - if (n < 0) { - warning(-1, file); - Xunlink(path); - return(-1); + if (n < 0) { + warning(-1, file); + Xunlink(path); + return(-1); + } X } X X return(0); @@ -4278,6 +4412,7 @@ X cp = NEWET_K; X switch (custno) { X case 0: + if (basiccustom) no = basicenv[no]; X cp = env_str(no); X break; X case 1: @@ -4449,6 +4584,7 @@ X switch (custno) { X case 0: X n = editenv(cs_item); + cs_max = (basiccustom) ? nbasic : ENVLISTSIZ; X break; X case 1: X if ((n = editbind(cs_item))) { @@ -4506,6 +4642,11 @@ X } X for (i = 0; i < MAXCUSTOM; i++) item[i] = 0; X + nbasic = 0; + for (i = 0; i < ENVLISTSIZ; i++) + if (envlist[i].type & T_BASIC) basicenv[nbasic++] = i; + while (i < ENVLISTSIZ) basicenv[i++] = -1; + X tmpenvlist = copyenv(NULL); X tmpmacrolist = copystrarray(NULL, macrolist, &tmpmaxmacro, maxmacro); X tmphelpindex = copystrarray(NULL, helpindex, NULL, MAXHELPINDEX); @@ -4544,7 +4685,7 @@ X changed = 0; X custno = 0; X cs_item = item[custno]; - cs_max = max[custno]; + getmax(max, custno); X cs_row = (FILEPERROW - 2) / 2; X cs_len = (int *)malloc2(cs_row * sizeof(int)); X custtitle(); @@ -4573,22 +4714,22 @@ X case K_RIGHT: X if (custno < MAXCUSTOM - 1) { X item[custno] = cs_item; - max[custno] = cs_max; + setmax(max, custno); X custno++; X custtitle(); X cs_item = item[custno]; - cs_max = max[custno]; + getmax(max, custno); X old = -1; X } X break; X case K_LEFT: X if (custno > 0) { X item[custno] = cs_item; - max[custno] = cs_max; + setmax(max, custno); X custno--; X custtitle(); X cs_item = item[custno]; - cs_max = max[custno]; + getmax(max, custno); X old = -1; X } X break; @@ -4632,7 +4773,7 @@ X break; X } X if (custno < MAXCUSTOM - 1) { - max[custno] = cs_max; + setmax(max, custno); X changed = 1; X } X else { diff -urNP ../FD-2.08f/dict.c ./dict.c --- ../FD-2.08f/dict.c Thu Jan 1 09:00:00 1970 +++ ./dict.c Tue Aug 22 00:00:00 2006 @@ -0,0 +1,1070 @@ +/* + * dict.c + * + * dictionary accessing module + */ + +#include +#include "fd.h" +#include "termio.h" +#include "func.h" +#include "roman.h" +#include "hinsi.h" + +#ifndef _NOIME + +#define DICTTBL "fd-dict.tbl" +#define MAXHINSI 16 +#define FREQMAGIC 0x4446 +#define FREQVERSION 0x0100 +#define USERFREQBIAS 16 +#define freqbias(n) (((long)(n) + USERFREQBIAS) * USERFREQBIAS) +#define getword(s, n) (((u_short)((s)[(n) + 1]) << 8) | (s)[n]) +#define getdword(s, n) (((u_long)getword(s, (n) + 2) << 16) | getword(s, n)) +#define skread(f,o,s,n) (Xlseek(f, o, L_SET) >= (off_t)0 \ + && sureread(f, s, n) == n) + +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#ifndef L_SET +# ifdef SEEK_SET +# define L_SET SEEK_SET +# else +# define L_SET 0 +# endif +#endif /* !L_SET */ +#ifndef L_INCR +# ifdef SEEK_CUR +# define L_INCR SEEK_CUR +# else +# define L_INCR 1 +# endif +#endif /* !L_INCR */ + +typedef struct _kanjitable { + u_short *kbuf; + u_char klen; + u_char len; + u_char match; + u_char kmatch; + u_short freq; + u_short hinsi[MAXHINSI]; + long ofs; +} kanjitable; + +static int NEAR fgetbyte __P_((u_char *, int)); +static int NEAR fgetword __P_((u_short *, int)); +static int NEAR fgetdword __P_((long *, int)); +static int NEAR fgetstring __P_((kanjitable *, int)); +static off_t NEAR fgetoffset __P_((long, int)); +static int NEAR fgetjisbuf __P_((kanjitable *, long, int)); +static int NEAR fgethinsi __P_((u_short [], int)); +static int NEAR fgetfreqbuf __P_((kanjitable *, long, int)); +static int NEAR _fchkhinsi __P_((int, u_short [], int)); +static int NEAR fchkhinsi __P_((u_short [], u_short [], + u_short [], u_short [], int)); +static int NEAR opendicttbl __P_((char *)); +static u_char *NEAR newhinsitbl __P_((ALLOC_T)); +static VOID NEAR readdicttable __P_((int)); +static int NEAR fputbyte __P_((int, int)); +static int NEAR fputword __P_((u_int, int)); +static int NEAR fputdword __P_((long, int)); +static int NEAR fputstring __P_((kanjitable *, int)); +static lockbuf_t *NEAR openfreqtbl __P_((char *, int)); +static int NEAR getfreq __P_((kanjitable *, kanjitable *)); +static int NEAR copyuserfreq __P_((kanjitable *, kanjitable *, int, int)); +static int cmpdict __P_((CONST VOID_P, CONST VOID_P)); +static int cmpfreq __P_((CONST VOID_P, CONST VOID_P)); +static long NEAR addkanji __P_((long, kanjitable **, kanjitable *)); +static VOID freekanji __P_((kanjitable *)); +static long NEAR addkanjilist __P_((long, kanjitable **, + long, kanjitable *, kanjitable *, int)); +static off_t NEAR nextofs __P_((off_t, int)); +static long NEAR _searchdict __P_((long, kanjitable **, kanjitable *, int)); +static long NEAR uniqkanji __P_((long, kanjitable *)); + +char *dicttblpath = NULL; +int imebuffer = 0; + +static kanjitable *kanjilist = NULL; +static u_char *hinsiindexbuf = NULL; +static u_char *hinsitblbuf = NULL; +static long dicttblent = 0L; +static long freqtblent = 0L; +static int hinsitblent = 0; +static off_t hinsitblofs = (off_t)0; + + +static int NEAR fgetbyte(cp, fd) +u_char *cp; +int fd; +{ + if (sureread(fd, cp, 1) != 1) return(-1); + + return(0); +} + +static int NEAR fgetword(wp, fd) +u_short *wp; +int fd; +{ + u_char buf[2]; + + if (sureread(fd, buf, 2) != 2) return(-1); + *wp = getword(buf, 0); + + return(0); +} + +static int NEAR fgetdword(lp, fd) +long *lp; +int fd; +{ + u_char buf[4]; + + if (sureread(fd, buf, 4) != 4) return(-1); + *lp = getdword(buf, 0); + + return(0); +} + +static int NEAR fgetstring(kp, fd) +kanjitable *kp; +int fd; +{ + u_short *kbuf; + u_char c; + int i; + + kp -> kbuf = NULL; + if (fgetbyte(&c, fd) < 0) return(-1); + kp -> klen = c; + kbuf = (u_short *)malloc2((kp -> klen + 1) * sizeof(u_short)); + for (i = 0; i < kp -> klen; i++) if (fgetword(&(kbuf[i]), fd) < 0) { + free(kbuf); + return(-1); + } + kbuf[i] = (short)0; + kp -> kbuf = kbuf; + + return(0); +} + +static off_t NEAR fgetoffset(n, fd) +long n; +int fd; +{ + u_char buf[4]; + off_t ofs; + + ofs = (off_t)n * 4 + 4; + if (!skread(fd, ofs, buf, 4)) return((off_t)-1); + ofs = (off_t)(dicttblent + 1) * 4 + 4 + getdword(buf, 0); + + return(ofs); +} + +static int NEAR fgetjisbuf(kp, n, fd) +kanjitable *kp; +long n; +int fd; +{ + off_t ofs; + + if ((ofs = fgetoffset(n, fd)) < (off_t)0) return(-1); + if (Xlseek(fd, ofs, L_SET) < (off_t)0) return(-1); + + return(fgetstring(kp, fd)); +} + +static int NEAR fgethinsi(hinsi, fd) +u_short hinsi[MAXHINSI]; +int fd; +{ + u_char c; + int i, n; + + if (hinsitblent <= 0) n = 0; + else { + if (fgetbyte(&c, fd) < 0) return(-1); + if ((n = c) > MAXHINSI) n = MAXHINSI; + for (i = 0; i < n; i++) + if (fgetword(&(hinsi[i]), fd) < 0) return(-1); + } + if (n < MAXHINSI) hinsi[n] = MAXUTYPE(u_short); + + return(n); +} + +static int NEAR fgetfreqbuf(kp, n, fd) +kanjitable *kp; +long n; +int fd; +{ + u_char buf[4]; + off_t ofs; + + ofs = (off_t)n * 4 + 4 + 4; + if (!skread(fd, ofs, buf, 4)) return(-1); + ofs = (off_t)(freqtblent + 1) * 4 + 4 + 4 + getdword(buf, 0); + if (Xlseek(fd, ofs, L_SET) < (off_t)0) return(-1); + + return(fgetstring(kp, fd)); +} + +static int NEAR _fchkhinsi(id, hinsi, fd) +int id; +u_short hinsi[MAXHINSI]; +int fd; +{ + u_char *cp, *hbuf, buf[2]; + off_t ofs; + u_short w; + int i, j, len; + + if (hinsitblent <= 0) return(0); + if (id >= hinsitblent) return(MAXUTYPE(u_short)); + + ofs = (off_t)id * 2; + if (hinsiindexbuf) ofs = getword(hinsiindexbuf, ofs); + else { + ofs += hinsitblofs + 2; + if (!skread(fd, ofs, buf, 2)) return(-1); + ofs = getword(buf, 0); + } + + if (hinsitblbuf) { + cp = &(hinsitblbuf[ofs]); + len = getword(cp, 0); + cp += 2; + hbuf = NULL; + } + else { + ofs += hinsitblofs + (off_t)(hinsitblent + 1) * 2 + 2; + if (!skread(fd, ofs, buf, 2)) return(-1); + if ((len = getword(buf, 0)) <= 0) return(MAXUTYPE(u_short)); + cp = hbuf = (u_char *)malloc2(len * 2); + if (sureread(fd, hbuf, len * 2) != len * 2) { + free(hbuf); + return(-1); + } + } + + for (i = 0; i < len; i++, cp += 2) { + w = getword(cp, 0); + for (j = 0; j < MAXHINSI; j++) { + if (hinsi[j] == MAXUTYPE(u_short)) break; + if (hinsi[j] == w) { + if (hbuf) free(hbuf); + return(j); + } + } + } + if (hbuf) free(hbuf); + + return(MAXUTYPE(u_short)); +} + +static int NEAR fchkhinsi(fdest, fsrc, bdest, bsrc, fd) +u_short fdest[MAXHINSI], fsrc[MAXHINSI], bdest[MAXHINSI], bsrc[MAXHINSI]; +int fd; +{ + u_short fhit[MAXHINSI], bhit[MAXHINSI]; + int i, j, n; + + if (hinsitblent <= 0 || fsrc[0] == MAXUTYPE(u_short)) { + if (fdest) memcpy((char *)fdest, (char *)fsrc, sizeof(fhit)); + if (bdest) memcpy((char *)bdest, (char *)bsrc, sizeof(bhit)); + return(0); + } + + for (i = 0; i < MAXHINSI; i++) fhit[i] = bhit[i] = MAXUTYPE(u_short); + for (i = j = 0; i < MAXHINSI; i++) { + if (bsrc[i] == MAXUTYPE(u_short)) break; + n = _fchkhinsi(bsrc[i], fsrc, fd); + if (n < 0) return(-1); + if (n < MAXUTYPE(u_short)) { + fhit[n] = fsrc[n]; + bhit[i] = bsrc[i]; + j++; + } + } + if (!j) return(-1); + + if (fdest) { + for (i = j = 0; i < MAXHINSI; i++) + if (fhit[i] < MAXUTYPE(u_short)) fdest[j++] = fhit[i]; + if (j < MAXHINSI) fdest[j] = MAXUTYPE(u_short); + } + if (bdest) { + for (i = j = 0; i < MAXHINSI; i++) + if (bhit[i] < MAXUTYPE(u_short)) bdest[j++] = bhit[i]; + if (j < MAXHINSI) bdest[j] = MAXUTYPE(u_short); + } + + return(0); +} + +static int NEAR opendicttbl(file) +char *file; +{ + static int fd = -2; + u_char buf[2]; + char path[MAXPATHLEN]; + + if (!file) { + if (fd >= 0) Xclose(fd); + fd = -2; + return(0); + } + + if (fd >= -1) return(fd); + + if (!dicttblpath || !*dicttblpath) strcpy(path, file); + else strcatdelim2(path, dicttblpath, file); + + if ((fd = Xopen(path, O_BINARY | O_RDONLY, 0666)) < 0) fd = -1; + else if (!dicttblent && fgetdword(&dicttblent, fd) < 0) { + Xclose(fd); + fd = -1; + } + else if (!hinsitblent) { + if ((hinsitblofs = fgetoffset(dicttblent, fd)) < (off_t)0 + || !skread(fd, hinsitblofs, buf, 2)) + hinsitblent = -1; + else hinsitblent = getword(buf, 0); + } + + return(fd); +} + +static u_char *NEAR newhinsitbl(size) +ALLOC_T size; +{ + u_char *tbl; + + if ((tbl = (u_char *)malloc(size))) return(tbl); + if (imebuffer) imebuffer = 0; + + return(NULL); +} + +static VOID NEAR readdicttable(fd) +int fd; +{ + u_char *tbl, buf[2]; + ALLOC_T size; + off_t ofs; + + if (hinsitblent <= 0) return; + + if (!hinsiindexbuf) { + size = (ALLOC_T)hinsitblent * 2; + if (!(tbl = newhinsitbl(size))) return; + if (!skread(fd, hinsitblofs + 2, tbl, size)) { + free(tbl); + return; + } + hinsiindexbuf = tbl; + } + + if (!imebuffer) return; + + if (!hinsitblbuf) { + ofs = (off_t)hinsitblent * 2 + 2; + if (!skread(fd, hinsitblofs + ofs, buf, 2)) return; + size = getword(buf, 0); + if (!(tbl = newhinsitbl(size))) return; + if (sureread(fd, tbl, size) != size) { + free(tbl); + return; + } + hinsitblbuf = tbl; + } +} + +VOID discarddicttable(VOID_A) +{ + if (hinsiindexbuf) { + free(hinsiindexbuf); + hinsiindexbuf = NULL; + } + if (hinsitblbuf) { + free(hinsitblbuf); + hinsitblbuf = NULL; + } +} + +static int NEAR fputbyte(c, fd) +int c, fd; +{ + u_char uc; + + uc = c; + if (surewrite(fd, &uc, sizeof(uc)) < 0) return(-1); + + return(0); +} + +static int NEAR fputword(w, fd) +u_int w; +int fd; +{ + u_char buf[2]; + + buf[0] = (w & 0xff); + buf[1] = ((w >> 8) & 0xff); + if (surewrite(fd, buf, sizeof(buf)) < 0) return(-1); + + return(0); +} + +static int NEAR fputdword(dw, fd) +long dw; +int fd; +{ + u_char buf[4]; + + buf[0] = (dw & 0xff); + buf[1] = ((dw >> 8) & 0xff); + buf[2] = ((dw >> 16) & 0xff); + buf[3] = ((dw >> 24) & 0xff); + if (surewrite(fd, buf, sizeof(buf)) < 0) return(-1); + + return(0); +} + +static int NEAR fputstring(kp, fd) +kanjitable *kp; +int fd; +{ + int i; + + if (fputbyte(kp -> klen, fd) < 0) return(-1); + for (i = 0; i < kp -> klen; i++) + if (fputword(kp -> kbuf[i], fd) < 0) return(-1); + + return(0); +} + +static lockbuf_t *NEAR openfreqtbl(file, flags) +char *file; +int flags; +{ + static lockbuf_t *lck = NULL; + u_short w; + + if (!file) { + lockclose(lck); + lck = NULL; + return(NULL); + } + + if (lck) return(lck); + file = evalpath(strdup2(file), 0); + + freqtblent = 0L; + lck = lockopen(file, flags, 0666); + if (!lck || lck -> fd < 0) /*EMPTY*/; + else if (fgetword(&w, lck -> fd) < 0 || w != FREQMAGIC + || fgetword(&w, lck -> fd) < 0 || w != FREQVERSION + || fgetdword(&freqtblent, lck -> fd) < 0) { + lockclose(lck); + lck = NULL; + } + + if (!lck) { + lck = (lockbuf_t *)malloc2(sizeof(lockbuf_t)); + lck -> fd = -1; + lck -> fp = NULL; + lck -> name = NULL; + lck -> flags = LCK_INVALID; + } + + return(lck); +} + +static int NEAR getfreq(kp1, kp2) +kanjitable *kp1, *kp2; +{ + kanjitable tmp; + lockbuf_t *lck; + long ofs, min, max; + int n; + + kp1 -> ofs = -1L; + lck = openfreqtbl(FREQFILE, O_BINARY | O_RDONLY); + if (lck -> fd < 0) return(0); + + min = -1L; + max = freqtblent; + for (;;) { + ofs = (min + max) / 2; + if (ofs <= min) { + kp1 -> ofs = min + 1; + return(0); + } + else if (ofs >= max) { + kp1 -> ofs = max; + return(0); + } + else if (fgetfreqbuf(&tmp, ofs, lck -> fd) < 0) return(-1); + + n = cmpdict(kp1, &tmp); + free(tmp.kbuf); + if (n > 0) min = ofs; + else if (n < 0) max = ofs; + else if (fgetstring(&tmp, lck -> fd) < 0) return(-1); + else { + n = cmpdict(kp2, &tmp); + free(tmp.kbuf); + if (n > 0) min = ofs; + else if (n < 0) max = ofs; + else break; + } + } + + kp1 -> ofs = ofs; + if (fgetword(&(kp1 -> freq), lck -> fd) < 0) return(-1); + + return(1); +} + +static int NEAR copyuserfreq(kp1, kp2, fdin, fdout) +kanjitable *kp1, *kp2; +int fdin, fdout; +{ + kanjitable tmp; + ALLOC_T size; + long ofs, index, ent; + int n, skip; + + size = 1 + (kp1 -> klen * 2) + 1 + (kp2 -> klen * 2) + 2; + skip = 0; + if (fdin < 0) { + ent = kp1 -> ofs = 0L; + kp1 -> freq = (u_short)1; + } + else { + ent = freqtblent; + n = getfreq(kp1, kp2); + if (n < 0) return(-1); + else if (!n) kp1 -> freq = (u_short)1; + else { + skip++; + if (kp1 -> freq < MAXUTYPE(u_short)) kp1 -> freq++; + } + if (Xlseek(fdin, (off_t)1 * 4 + 4 + 4, L_SET) < (off_t)0) + return(-1); + } + + if (fputword(FREQMAGIC, fdout) < 0) return(-1); + if (fputword(FREQVERSION, fdout) < 0) return(-1); + if (fputdword(ent + 1 - skip, fdout) < 0) return(-1); + index = 0L; + if (fputdword(index, fdout) < 0) return(-1); + for (ofs = 1; ofs <= kp1 -> ofs; ofs++) { + if (fgetdword(&index, fdin) < 0) return(-1); + if (fputdword(index, fdout) < 0) return(-1); + } + if (fputdword(index + size, fdout) < 0) return(-1); + if (skip) { + if (fgetdword(&index, fdin) < 0) return(-1); + size = (ALLOC_T)0; + ofs++; + } + for (; ofs <= ent; ofs++) { + if (fgetdword(&index, fdin) < 0) return(-1); + index += size; + if (fputdword(index, fdout) < 0) return(-1); + } + + for (ofs = 0; ofs < kp1 -> ofs; ofs++) { + if (fgetstring(&tmp, fdin) < 0) return(-1); + if (fputstring(&tmp, fdout) < 0) return(-1); + free(tmp.kbuf); + if (fgetstring(&tmp, fdin) < 0) return(-1); + if (fputstring(&tmp, fdout) < 0) return(-1); + free(tmp.kbuf); + if (fgetword(&(tmp.freq), fdin) < 0) return(-1); + if (fputword(tmp.freq, fdout) < 0) return(-1); + } + if (skip) { + if (fgetstring(&tmp, fdin) < 0) return(-1); + free(tmp.kbuf); + if (fgetstring(&tmp, fdin) < 0) return(-1); + free(tmp.kbuf); + if (fgetword(&(tmp.freq), fdin) < 0) return(-1); + ofs++; + } + if (fputstring(kp1, fdout) < 0) return(-1); + if (fputstring(kp2, fdout) < 0) return(-1); + if (fputword(kp1 -> freq, fdout) < 0) return(-1); + for (; ofs < ent; ofs++) { + if (fgetstring(&tmp, fdin) < 0) return(-1); + if (fputstring(&tmp, fdout) < 0) return(-1); + free(tmp.kbuf); + if (fgetstring(&tmp, fdin) < 0) return(-1); + if (fputstring(&tmp, fdout) < 0) return(-1); + free(tmp.kbuf); + if (fgetword(&(tmp.freq), fdin) < 0) return(-1); + if (fputword(tmp.freq, fdout) < 0) return(-1); + } + + return(0); +} + +VOID saveuserfreq(kana, kbuf) +u_short *kana, *kbuf; +{ + kanjitable tmp1, tmp2; + lockbuf_t *lck; + char *cp, path[MAXPATHLEN]; + long argc; + int n, fdin, fdout; + + if (!kanjilist) return; + + for (argc = 0L; kanjilist[argc].kbuf; argc++) + if (kbuf == kanjilist[argc].kbuf) break; + if (!kanjilist[argc].kbuf) return; + + VOID_C openfreqtbl(NULL, 0); + if (!(lck = openfreqtbl(FREQFILE, O_BINARY | O_RDWR))) return; + cp = evalpath(strdup2(FREQFILE), 0); + strcpy(path, cp); + if ((fdin = lck -> fd) >= 0) fdout = opentmpfile(path, 0666); + else { + VOID_C openfreqtbl(NULL, 0); + lck = lockopen(path, + O_BINARY | O_WRONLY | O_CREAT | O_EXCL, 0666); + fdout = (lck) ? lck -> fd : -1; + } + + if (fdout < 0) { + VOID_C openfreqtbl(NULL, 0); + if (fdin < 0) lockclose(lck); + free(cp); + return; + } + + tmp1.kbuf = kana; + tmp1.klen = kanjilist[argc].match; + tmp2.kbuf = kbuf; + tmp2.klen = kanjilist[argc].kmatch; + + n = copyuserfreq(&tmp1, &tmp2, fdin, fdout); + if (fdin < 0) { +#if !MSDOS && !defined (CYGWIN) + if (n < 0) Xunlink(path); + lockclose(lck); +#else + lockclose(lck); + if (n < 0) Xunlink(path); +#endif + } + else { +#if !MSDOS && !defined (CYGWIN) + if (n >= 0) n = Xrename(path, cp); + VOID_C openfreqtbl(NULL, 0); + Xclose(fdout); +#else /* MSDOS || CYGWIN */ + VOID_C openfreqtbl(NULL, 0); + Xclose(fdout); + if (n >= 0) { +# if MSDOS + n = Xrename(path, cp); +# else + while ((n = Xrename(path, cp)) < 0) { + if (errno != EACCES) break; + usleep(100000L); + } +# endif + } +#endif /* MSDOS || CYGWIN */ + if (n < 0) Xunlink(path); + } + + free(cp); +} + +static int cmpdict(vp1, vp2) +CONST VOID_P vp1; +CONST VOID_P vp2; +{ + kanjitable *kp1, *kp2; + u_short *kbuf1, *kbuf2; + int i, klen1, klen2; + + kp1 = (kanjitable *)vp1; + kp2 = (kanjitable *)vp2; + kbuf1 = kp1 -> kbuf; + kbuf2 = kp2 -> kbuf; + klen1 = kp1 -> klen; + klen2 = kp2 -> klen; + + for (i = 0; i < klen1; i++) { + if (i >= klen2) return(1); + if (kbuf1[i] > kbuf2[i]) return(1); + else if (kbuf1[i] < kbuf2[i]) return(-1); + } + + return(klen1 - klen2); +} + +static int cmpfreq(vp1, vp2) +CONST VOID_P vp1; +CONST VOID_P vp2; +{ + kanjitable *kp1, *kp2; + + kp1 = (kanjitable *)vp1; + kp2 = (kanjitable *)vp2; + + if (kp1 -> len < kp2 -> len) return(1); + else if (kp1 -> len > kp2 -> len) return(-1); + if (kp1 -> freq < kp2 -> freq) return(1); + else if (kp1 -> freq > kp2 -> freq) return(-1); + if (kp1 -> ofs > kp2 -> ofs) return(1); + else if (kp1 -> ofs < kp2 -> ofs) return(-1); + + return(0); +} + +static long NEAR addkanji(argc, argvp, tmp) +long argc; +kanjitable **argvp, *tmp; +{ + *argvp = (kanjitable *)realloc2(*argvp, + (argc + 2) * sizeof(kanjitable)); + memcpy((char *)&((*argvp)[argc++]), tmp, sizeof(kanjitable)); + (*argvp)[argc].kbuf = NULL; + + return(argc); +} + +static VOID freekanji(argv) +kanjitable *argv; +{ + long n; + + if (argv) { + for (n = 0L; argv[n].kbuf; n++) free(argv[n].kbuf); + free(argv); + } +} + +static long NEAR addkanjilist(argc, argvp, argc2, argv2, kp, fd) +long argc; +kanjitable **argvp; +long argc2; +kanjitable *argv2, *kp; +int fd; +{ + kanjitable *next, tmp1, tmp2; + u_short hinsi[MAXHINSI], shuutan[MAXHINSI]; + long n; + int i; + + tmp1.kbuf = kp -> kbuf; + tmp1.klen = kp -> len; + if (fgetstring(&tmp2, fd) < 0 || fgetword(&(tmp2.freq), fd) < 0 + || fgethinsi(hinsi, fd) < 0) { + if (tmp2.kbuf) free(tmp2.kbuf); + return(argc); + } + + if (getfreq(&tmp1, &tmp2) <= 0) /*EMPTY*/; + else if (tmp2.freq < MAXUTYPE(u_short) - freqbias(tmp1.freq)) + tmp2.freq += freqbias(tmp1.freq); + else tmp2.freq = MAXUTYPE(u_short); + tmp1.kbuf = tmp2.kbuf; + tmp1.klen = tmp2.klen; + tmp1.freq = tmp2.freq; + + tmp2.match = kp -> len; + tmp2.kmatch = tmp1.klen; + tmp2.len = kp -> len; + tmp2.ofs = kp -> ofs; + if (hinsitblent <= 0) { + if (kp -> len < kp -> klen) { + tmp2.klen += kp -> klen - kp -> len; + tmp2.kbuf = (u_short *)realloc2(tmp2.kbuf, + (tmp2.klen + 1) * sizeof(u_short)); + memcpy((char *)&(tmp2.kbuf[tmp1.klen]), + (char *)&(kp -> kbuf[kp -> len]), + (kp -> klen - kp -> len) * sizeof(short)); + tmp2.kbuf[tmp2.klen] = (short)0; + } + return(addkanji(argc, argvp, &tmp2)); + } + + i = fchkhinsi(NULL, kp -> hinsi, hinsi, hinsi, fd); + if (i >= 0 && kp -> len >= kp -> klen) { + shuutan[0] = SH_svkantan; + shuutan[1] = MAXUTYPE(u_short); + i = fchkhinsi(tmp2.hinsi, hinsi, NULL, shuutan, fd); + if (i >= 0) return(addkanji(argc, argvp, &tmp2)); + } + if (i < 0) { + if (kp -> hinsi[0] == (u_short)HN_SENTOU + && kp -> len >= kp -> klen) { + for (i = 0; i < MAXHINSI; i++) { + if (hinsi[i] == MAXUTYPE(u_short)) break; + if (hinsi[i] == (u_short)HN_TANKAN) + return(addkanji(argc, argvp, &tmp2)); + } + } + free(tmp1.kbuf); + return(argc); + } + + if (!(next = argv2)) { + tmp2.kbuf = &(kp -> kbuf[kp -> len]); + tmp2.klen = kp -> klen - kp -> len; + memcpy((char *)(tmp2.hinsi), (char *)hinsi, sizeof(hinsi)); + for (tmp2.len = kp -> klen; tmp2.len > (u_char)0; tmp2.len--) + argc2 = _searchdict(argc2, &argv2, &tmp2, fd); + if (!argv2) { + free(tmp1.kbuf); + return(argc); + } + } + + for (n = 0L; n < argc2; n++) { + if (next + && fchkhinsi(tmp2.hinsi, hinsi, NULL, argv2[n].hinsi, fd) < 0) + continue; + + tmp2.klen = tmp1.klen + argv2[n].klen; + tmp2.kbuf = + (u_short *)malloc2((tmp2.klen + 1) * sizeof(u_short)); + memcpy((char *)(tmp2.kbuf), (char *)(tmp1.kbuf), + tmp1.klen * sizeof(u_short)); + memcpy((char *)&(tmp2.kbuf[tmp1.klen]), + (char *)(argv2[n].kbuf), + argv2[n].klen * sizeof(u_short)); + tmp2.kbuf[tmp2.klen] = (u_short)0; + + if (argv2[n].hinsi[0] >= (u_short)HN_MAX) { + tmp2.len = kp -> len + argv2[n].len; + tmp2.freq = tmp1.freq + argv2[n].freq; + } + else if (tmp2.hinsi[0] >= (u_short)HN_MAX) { + tmp2.len = argv2[n].len; + tmp2.freq = argv2[n].freq; + } + else if (kp -> len > argv2[n].len) { + tmp2.len = kp -> len; + tmp2.freq = tmp1.freq; + } + else if (tmp2.len < argv2[n].len) { + tmp2.len = argv2[n].len; + tmp2.freq = argv2[n].freq; + } + else { + tmp2.len = kp -> len; + tmp2.freq = (tmp1.freq > argv2[n].freq) + ? tmp1.freq : argv2[n].freq; + } + + argc = addkanji(argc, argvp, &tmp2); + } + + if (!next) freekanji(argv2); + free(tmp1.kbuf); + + return(argc); +} + +static off_t NEAR nextofs(ofs, fd) +off_t ofs; +int fd; +{ + u_char c; + + if (Xlseek(fd, ofs, L_SET) < (off_t)0) return((off_t)-1); + if (fgetbyte(&c, fd) < 0) return((off_t)-1); + ofs = (off_t)c * 2 + 2; + if ((ofs = Xlseek(fd, ofs, L_INCR)) < (off_t)0) return((off_t)-1); + if (hinsitblent <= 0) return(ofs); + if (fgetbyte(&c, fd) < 0) return((off_t)-1); + ofs = (off_t)c * 2; + + return(Xlseek(fd, ofs, L_INCR)); +} + +static long NEAR _searchdict(argc, argvp, kp, fd) +long argc; +kanjitable **argvp, *kp; +int fd; +{ + kanjitable *argv2, tmp1, tmp2; + off_t curofs; + long ofs, min, max, argc2; + u_char c; + int n; + + min = -1L; + max = dicttblent; + tmp1.kbuf = kp -> kbuf; + tmp1.klen = kp -> len; + for (;;) { + ofs = (min + max) / 2; + if (ofs <= min || ofs >= max + || (fgetjisbuf(&tmp2, ofs, fd)) < 0) + return(argc); + n = cmpdict(&tmp1, &tmp2); + free(tmp2.kbuf); + if (n > 0) min = ofs; + else if (n < 0) max = ofs; + else break; + } + + kp -> ofs = ofs; + if (fgetbyte(&c, fd) < 0) return(argc); + if (c <= 1) return(addkanjilist(argc, argvp, 0, NULL, kp, fd)); + + if ((curofs = Xlseek(fd, (off_t)0, L_INCR)) < (off_t)0) return(argc); + argv2 = NULL; + argc2 = 0L; + if (hinsitblent > 0 && kp -> len < kp -> klen) { + tmp1.kbuf = &(kp -> kbuf[kp -> len]); + tmp1.klen = kp -> klen - kp -> len; + tmp1.hinsi[0] = MAXUTYPE(u_short); + for (tmp1.len = kp -> klen; tmp1.len > (u_char)0; tmp1.len--) + argc2 = _searchdict(argc2, &argv2, &tmp1, fd); + if (!argv2) return(argc); + } + + if (Xlseek(fd, curofs, L_SET) >= (off_t)0) { + for (n = 0; n < c; n++, curofs = nextofs(curofs, fd)) { + if (curofs < (off_t)0) break; + argc = addkanjilist(argc, argvp, argc2, argv2, kp, fd); + } + } + + freekanji(argv2); + + return(argc); +} + +static long NEAR uniqkanji(argc, argv) +long argc; +kanjitable *argv; +{ + long i, j; + int c; + + for (i = 0L; i < argc - 1; i++) { + for (j = 1L; i + j < argc; j++) { + if (argv[i].klen != argv[i + j].klen) break; + c = memcmp((char *)(argv[i].kbuf), + (char *)(argv[i + j].kbuf), + argv[i].klen * sizeof(u_short)); + if (c) break; + free(argv[i + j].kbuf); + if (argv[i + j].len > argv[i].len) { + argv[i].len = argv[j].len; + argv[i].freq = argv[j].freq; + } + else if (argv[i + j].len == argv[i].len) { + if (argv[i + j].freq > argv[i].freq) + argv[i].freq = argv[j].freq; + } + } + if (j <= 1L) continue; + memmove((char *)&(argv[i + 1]), (char *)&(argv[i + j]), + (argc + 1 - (i + j)) * sizeof(kanjitable)); + argc -= --j; + } + + return(argc); +} + +VOID freekanjilist(argv) +u_short **argv; +{ + long n, argc; + + if (argv) { + for (argc = 0L; argv[argc]; argc++) { + if (kanjilist) { + for (n = 0L; kanjilist[n].kbuf; n++) + if (argv[argc] == kanjilist[n].kbuf) + break; + if (kanjilist[n].kbuf) continue; + } + free(argv[argc]); + } + free(argv); + } + freekanji(kanjilist); SHAR_EOF : || $echo 'restore of' 'FD-2.09.patch' 'failed' fi $echo 'End of' 'FD-2.09.patch' 'part' '2' $echo 'File' 'FD-2.09.patch' 'is continued in part' '3' echo 3 > _sh00904/seq exit 0 -- しらい たかし