home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 January / VPR0101A.BIN / OLS / TAR32053 / tar32053.exe / SRC / SETARG.C < prev    next >
C/C++ Source or Header  |  1999-05-23  |  5KB  |  241 lines

  1. #ifndef __DEFCONF_H
  2. #include "defconf.h"
  3. #endif
  4. /*
  5.     This file was hacked for kmtar for Windows DLL
  6.                                 at 1997-02-14
  7.                                 by tsuneo
  8.         (see setarg.h ,too)
  9. */
  10. /*
  11.  * Expand indirect files yasushi@is.s.u-tokyo.ac.jp
  12.  * 
  13.  * If ARGV contains "@FILE", read the content of FILE, and replace "@FILE" with
  14.  * it. Each entry is delimited with null character ('\0') in the indirect
  15.  * file.
  16.  * 
  17.  * If you want to place '@' at the first of the parameter character, write '@@'.
  18.  */
  19.  
  20. /* on LSI-C, called before stdin/out/err are fdopen'ed. */
  21. #define NO_USE_STDIN    /* for DLL */
  22.  
  23. #include <stdio.h>
  24. #include <ctype.h>
  25. #include <string.h>        /* Add Nide */
  26. #include <fcntl.h>        /* Add Nide */
  27. /* #include "wild.h"*/        /* Add Nide */
  28. #include "defs.h"    /* for iskanji/iskanji2  Add tsuneo */
  29. #define _expand_abendcode 1
  30.  
  31. #ifndef LSI_C            /* Add Nide */
  32. #define is_space(c) (isascii(c) && isspace(c))
  33. #else
  34. #define is_space(c) isspace(c)
  35. #endif
  36.  
  37. /* by tsuneo */
  38. static void _putnomemmes(void)
  39. {
  40.     fprintf(stderr,"error: can't allocate memory at setarg.c\n");
  41. }
  42.  
  43. static    char    **args, **args_head=NULL;
  44. static    int    lastsize = 30;
  45.  
  46. static    void    add_args(s)
  47. char    *s;
  48. {
  49.     void   *malloc(), *realloc();
  50.     char   *strdup();
  51.  
  52. #ifdef DEBUG
  53.     _puterrmes("before add_args:\r\n");
  54.     {char **p; if(args_head) for(p = args_head; p < args; p++){
  55.         _puterrmes(*p ? *p : "(NULL)");
  56.         _puterrmes("\r\n");
  57.     }}
  58.     _puterrmes("add_args "), _puterrmes(s ? s : "(NULL)");
  59.     _puterrmes("\r\n");
  60. #endif
  61.     if(args == 0){
  62.         args = args_head =
  63.             (char **) realloc(args_head,(lastsize) * sizeof(char *));
  64.             /* change malloc->realloc by tsuneo*/
  65.         if(args == 0){
  66.     memfull:
  67.             _putnomemmes(), exit(_expand_abendcode);
  68.         }
  69.     }
  70.     if(args - args_head >= lastsize){
  71.         char  **new = (char **) realloc(
  72.                 args_head, (lastsize += 40) * sizeof(char *));
  73.         /* DEBUG Nide */
  74.         if(new == 0)
  75.             goto memfull;
  76.         args = new + (args - args_head);
  77.         args_head = new;
  78.     }
  79.     *args++ = s;
  80. }
  81.  
  82. static    void arg_initialize()
  83. {
  84.     args = 0;
  85.     if(args_head!=NULL){free(args_head);args_head = 0;}  /* changed by tsuneo */
  86.     lastsize = 30;
  87. }
  88.  
  89. static    void check_arg(arg)
  90. char    *arg;
  91. {
  92.     int    fp, fprpos, fprsiz;
  93.     unsigned char fprbuf[BUFSIZ];
  94.  
  95.     if(*arg != '@'){
  96.         add_args(arg);
  97.         return;
  98.     } else {
  99.         int    ch;
  100.  
  101.         if(arg[1] == '@'){
  102.             add_args(arg + 1);
  103.             return;
  104.         }
  105.         if(arg[1] == '-' && !arg[2]){    /* Nide */
  106. #ifdef NO_USE_STDIN
  107.             fputs("Can't use @- (input from stdin)\n",stderr);
  108.             exit(_expand_abendcode);
  109. #else
  110.             fp = 0;
  111. #endif
  112.         } else if((fp = open(arg + 1, O_RDONLY)) < 0){
  113. #ifdef LSI_C
  114.             _puterrmes("Can't open the indirect file.\r\n");
  115. #else
  116.             fputs("Can't open the indirect file.\n", stderr);
  117. #endif
  118.             exit(_expand_abendcode);
  119.         }
  120.         fprpos = fprsiz = 0;
  121.         do {
  122.             char    buf[BUFSIZ], *bp;
  123.             char   *x;
  124.             int quote_in=0;    /* quote_in=1 at processing quote */
  125. #define fpgetc(fp) ( \
  126.  (fprpos == fprsiz ? (fprpos = 0, fprsiz = read(fp, fprbuf, BUFSIZ)) : fprsiz) \
  127.  <= 0 ? ((fprsiz = -1), EOF) : fprbuf[fprpos++])
  128. #define fpungetc(ch, fp) (fprsiz > 0 && fprpos--)
  129.                 /* ch, fp not used. don't call it twice */
  130.  
  131.             bp = buf;
  132.             while((ch = fpgetc(fp)) != EOF && !(quote_in==0 && is_space(ch))){
  133. #ifdef DEBUG
  134.                 char    p[0];
  135.                 *p = ch, p[1] = 0;
  136.                 _puterrmes("got '"), _puterrmes(p);
  137.                 _puterrmes("'\r\n");                
  138. #endif
  139.                 if(ch=='"'){
  140.                     if(quote_in==0){
  141.                         quote_in=1;    /* changed from quote==1 ,1997/09/02 by tsuneo by yasue*/
  142.                     }else{
  143.                         quote_in=0;
  144.                     }
  145.                 }else if(iskanji(ch)){
  146.                     int ch2;
  147.  
  148.                     ch2=fpgetc(fp);
  149.                     if(ch2!=EOF && iskanji2(ch2)){
  150.                         *bp++=ch;
  151.                         *bp++=ch2;
  152.                     }else{
  153.                         *bp++=ch;
  154.                         if(ch2==EOF){break;}
  155.                         fpungetc(ch2,fp);
  156.                     }
  157.                 }else{
  158.                     *bp++ = ch;
  159.                 }
  160.             }
  161.             /* ignore null strings. */
  162.             if(bp == buf)
  163.                 continue;
  164.             *bp = '\0';
  165.             x = strdup(buf);
  166.             if(x == 0){
  167.                 _putnomemmes(), exit(_expand_abendcode);
  168.             }
  169. #ifdef DEBUG
  170.             _puterrmes("Adding "), _puterrmes(x);
  171.             _puterrmes("\r\n");
  172. #endif
  173.             add_args(x);
  174.             while(is_space(ch) && ch != EOF)
  175.                 ch = fpgetc(fp);
  176.             fpungetc(ch, fp);
  177.         } while(ch != EOF);
  178.         if(!fp){    /* Nide */
  179. #ifndef LSI_C
  180.             if(NULL == freopen("con", "r", stdin))
  181. #else
  182.             close(0);
  183.             if(0 != open("con", O_RDONLY))
  184. #endif
  185.             {
  186. #ifdef LSI_C
  187.                 _puterrmes("? Can't open con\r\n");
  188. #else
  189.                 fputs("? Can't open con\n", stderr);
  190. #endif
  191.                 exit(_expand_abendcode);
  192.             }
  193.         } else
  194.             close(fp);
  195.     }
  196. }
  197.  
  198. void    setup_arguments(argcp, argvp)
  199. int    *argcp;
  200. char    ***argvp;
  201. {
  202.     int    argc = *argcp;
  203.     char  **argv = *argvp;
  204.     int    i;        /* char **c deleted by Nide */
  205.  
  206.     arg_initialize();
  207.     for(i = 0; i < argc; i++){
  208.         check_arg(argv[i]);
  209.     }
  210.     add_args((char *) 0);
  211.     *argcp = args - args_head - 1;    /* -1 for null delimiter above */
  212.     *argvp = args_head;
  213. }
  214.  
  215. /*
  216. void    setup_argument(pat, argcp, argvp)
  217. char    *pat;
  218. int    *argcp;
  219. char    ***argvp;
  220. {
  221.     arg_initialize();
  222.     check_arg(pat);
  223.     add_args((char *) 0);
  224.     *argcp = args - args_head - 1;
  225.     *argvp = args_head;
  226. }
  227. */
  228.  
  229. #ifdef TEST
  230. main(argc, argv)
  231. int    argc;
  232. char    **argv;
  233. {
  234.     setup_arguments(&argc, &argv);
  235.     while(*argv){
  236.         printf("[%s]\n", *argv);
  237.         argv++;
  238.     }
  239. }
  240. #endif
  241.