*** nkf.c.orig Thu Nov 7 05:04:27 1996 --- nkf.c Sat Feb 6 03:48:38 1999 *************** *** 8,13 **** --- 8,14 ---- ** (E-Mail Address: kono@ie.u-ryukyu.ac.jp) ** 連絡先: COW for DOS & Win16 & Win32 & OS/2 ** (E-Mail Address: GHG00637@niftyserve.or.jp) + ** ** 営利を目的としない限り、このソースのいかなる ** 複写,改変,修正も許諾します。その際には、この部分を残すこと。 ** このプログラムについては特に何の保証もしない、悪しからず。 *************** *** 63,68 **** --- 64,70 ---- ** B[1-9] broken level ** ** O Output to 'nkf.out' file + ** W Overwrite ** d Delete \r in line feed ** c Add \r in line feed **/ *************** *** 115,120 **** --- 117,127 ---- #include #endif + /* added by satoru@isoternet.org */ + #include + #include + + #define FALSE 0 #define TRUE 1 *************** *** 226,231 **** --- 233,239 ---- extern unsigned char cv[],dv[],ev[],fv[]; int file_out = FALSE; + int overwrite = FALSE; int add_cr = FALSE; int del_cr = FALSE; int end_check; *************** *** 396,401 **** --- 404,413 ---- case 'O':/* for Output file */ file_out = TRUE; continue; + case 'W':/* overwrite */ + file_out = TRUE; + overwrite = TRUE; + continue; case 'c':/* add cr code */ add_cr = TRUE; continue; *************** *** 441,463 **** convert (stdin); } else { while (argc--) { if((fin = fopen (*argv++, "r")) == NULL) { perror (*--argv); return (-1); } else { /* reopen file for stdout */ if(file_out == TRUE){ ! if(argc == 1 ) { ! if(freopen(*argv++, "w", stdout) == NULL) { ! perror (*--argv); ! return (-1); ! } ! argc--; ! } else { ! if(freopen("nkf.out", "w", stdout) == NULL) { ! perror (*--argv); ! return (-1); ! } } if(binmode_f == TRUE) { #ifdef __OS2__ --- 453,471 ---- convert (stdin); } else { while (argc--) { + char *outfname = "nkf.out"; if((fin = fopen (*argv++, "r")) == NULL) { perror (*--argv); return (-1); } else { /* reopen file for stdout */ if(file_out == TRUE){ ! if (overwrite) { ! outfname = tempnam(".", "nkftmp"); ! } ! if(freopen(outfname, "w", stdout) == NULL) { ! perror (*--argv); ! return (-1); } if(binmode_f == TRUE) { #ifdef __OS2__ *************** *** 481,486 **** --- 489,520 ---- else convert (fin); fclose (fin); + if (overwrite) { + char *origfname = *(argv -1); + struct stat sb; + struct utimbuf tb; + + fclose(stdout); + if (stat(origfname, &sb)) { + fprintf(stderr, "Can't stat %s\n", origfname); + } + tb.actime = sb.st_atime; + tb.modtime = sb.st_mtime; + + if (rename(outfname, origfname)) { + fprintf(stderr, "Can't rename %s to %s\n", + outfname, origfname); + } + + /* タイムスタンプを復元 */ + if (utime(origfname, &tb)) { + fprintf(stderr, "Can't set timestamp %s\n", origfname); + } + /* パーミッションを復元 */ + if (chmod(origfname, sb.st_mode)) { + fprintf(stderr, "Can't set permission %s\n", origfname); + } + } } } } *************** *** 1748,1753 **** --- 1782,1788 ---- fprintf(stderr,"T Text mode output\n"); #endif fprintf(stderr,"O Output to File (DEFAULT 'nkf.out')\n"); + fprintf(stderr,"W Overwrite\n"); fprintf(stderr,"d,c Delete \\r in line feed, Add \\r in line feed\n"); fprintf(stderr,"Network Kanji Filter Version %s (%s) " #if defined(MSDOS) && !defined(_Windows)