Annotation of pgp/src/amiga__main.c, revision 1.1

1.1     ! root        1: /*
        !             2: $VER: RKNOP's __main() 1.2 (06.02.95)
        !             3: 
        !             4:   Replacement AmigaDOS __main() for SAS/C 6.51.
        !             5: 
        !             6:   As with the standard __main(), this parses the input command line into the
        !             7:   argv array.  However, here, the number of arguments is unlimited;
        !             8:   additionally, one may specify on the command line a list of arguments in
        !             9:   a file using the construction "@filename" (without quotes).  The named file
        !            10:   will be read and all of the whitespace separated arguments therein will be
        !            11:   inserted to the argv array at that point.  Since the string parser is written
        !            12:   recursively, embedded files may be nested; that is, within one filename
        !            13:   referenced on the command line with @, there may be another filename
        !            14:   referenced with @.  Memory and stack space is the only limit as to how far
        !            15:   the nesting may go.
        !            16: 
        !            17:   Version 1.2 -- this version supports stderr redirection, similar to unix, by
        !            18:   specifying &filename (or & filename or &"file name" or & "file name") on the
        !            19:   command line.  stderr is redirected by opening first calling Close() on what
        !            20:   is currently in __ufbs[2].ufbfh (hopefully this simulates the SAS stdio
        !            21:   destructor), and then Open()ing the file __ufbs[2].ufbfh with the specified
        !            22:   filename.
        !            23: 
        !            24:   Inspiration by Peter Simons.  Rewritten from scratch by Robert Knop using no
        !            25:   SAS code so that this file could be freely distributed with PGP 2.6
        !            26:   source code.
        !            27: 
        !            28:   [email protected]
        !            29:   [email protected]
        !            30:   R.KNOP1 on GEnie
        !            31: */
        !            32: 
        !            33: #include <stdlib.h>
        !            34: #include <stdio.h>
        !            35: #include <string.h>
        !            36: #include <ios1.h>
        !            37: #include <dos/dos.h>
        !            38: #include <exec/lists.h>
        !            39: #include <exec/memory.h>
        !            40: #include <exec/nodes.h>
        !            41: #include <libraries/dos.h>
        !            42: #include <libraries/dosextens.h>
        !            43: #include <workbench/startup.h>
        !            44: 
        !            45: #include <proto/dos.h>
        !            46: #include <proto/exec.h>
        !            47: 
        !            48: #define isspace(c)   (((c)==' ')||((c)=='\t')||((c)=='\n'))
        !            49: 
        !            50: extern struct WBStartup *_WBenchMsg;
        !            51: 
        !            52: int main(int,void *);
        !            53: int __regargs CountArgs(struct MinList *,struct ArgNode *);
        !            54: void __regargs AddArgs(struct ArgNode **,char ***);
        !            55: 
        !            56: struct ArgNode {
        !            57:    struct MinNode n;
        !            58:    int length;
        !            59:    char *d;
        !            60: };
        !            61: 
        !            62: void __stdargs __main(char *inline)
        !            63: {  struct ArgNode n,*cur;
        !            64:    struct MinList ArgStrings;
        !            65:    int argc,rval;
        !            66:    char **argv,**pargv;
        !            67: 
        !            68:    NewList((struct List *)&ArgStrings);
        !            69:    n.d=inline;
        !            70:    AddTail((struct List *)&ArgStrings,(struct Node *)&n);
        !            71: 
        !            72:    if (inline && (argc=CountArgs(&ArgStrings,&n)))
        !            73:    {  if (!(argv=(char **)calloc(argc+1,sizeof(char *))))
        !            74:          /* +1 is for one null element at the end of argv */
        !            75:          exit(20);
        !            76:       cur=&n;
        !            77:       pargv=argv;
        !            78:       AddArgs(&cur,&pargv);
        !            79:    }
        !            80:    else argv=(char **)_WBenchMsg;   /* Workbench startup */
        !            81: 
        !            82:    rval=main(argc,argv);
        !            83: 
        !            84: /* Don't worry about cleanup -- we used only calloc & malloc */
        !            85: /* (It's safer this way, so that if the program goes directly to exit()
        !            86:    we don't have to worry about missed cleanup.) */
        !            87: 
        !            88:    exit(rval);
        !            89: }
        !            90: 
        !            91: /**********************************************************************/
        !            92: /* CountArgs() -- a recursive function that counts the number of      */
        !            93: /*                arguments in the string in node.d.  If, while       */
        !            94: /*                counting, it comes across an argument of the form   */
        !            95: /*                "@filename", it creates a new node on the tail of   */
        !            96: /*                list, reads the data from the named file            */
        !            97: /*                into this new node's data, and recursively calls    */
        !            98: /*                itself to count the arguments in the new read string*/
        !            99: /**********************************************************************/
        !           100: 
        !           101: int __regargs CountArgs(struct MinList *list,struct ArgNode *node)
        !           102: {  int argc;
        !           103:    struct ArgNode *n;
        !           104:    char *line,*fstart,fendbuffer;
        !           105:    BPTR ifp;                         /* Only 1 file will be open at a time */
        !           106:    static struct FileInfoBlock fib;  /* static safe for recursion */
        !           107: 
        !           108:    argc=0;
        !           109:    line=node->d;
        !           110:    while (1)
        !           111:    {  while (isspace(*line)) line++;   /* Skip leading whitespace */
        !           112: 
        !           113:       if (*line=='\0') break;
        !           114: 
        !           115:       else if (*line=='&')          /* Skip a stderr redirect */
        !           116:       {  ++line;
        !           117:          while (isspace(*line)) ++line;
        !           118:          if (*line=='"')
        !           119:          {  line++;
        !           120:             while (*line!='"' && *line!='\0') line++;
        !           121:             if (*line=='"') line++;
        !           122:          }
        !           123:          else
        !           124:          {  while (!isspace(*line))
        !           125:             {  if (*line=='\0') break;
        !           126:                ++line;
        !           127:             }
        !           128:          }
        !           129:       }
        !           130: 
        !           131:       else if (*line=='@')         /* Embedded file */
        !           132:       {  fstart=++line;
        !           133:          if (*line=='"')
        !           134:          {  fstart++; line++;
        !           135:             while (*line!='"')
        !           136:               if (*(++line)=='\0') break;  /* Errorish? */
        !           137:             fendbuffer=*line;
        !           138:             *line='\0';  /* Temporarily 0-term so we can use as a filename */
        !           139:          }
        !           140:          else
        !           141:          {  while (!isspace(*line))
        !           142:               if (*(++line)=='\0') break;    /* Error? */
        !           143:             fendbuffer=*line;
        !           144:             *line='\0';   /* Temp 0-term for filename */
        !           145:          }
        !           146:          if (!(ifp=Open(fstart,MODE_OLDFILE)))
        !           147:             fprintf(stderr,"Couldn't open file \"%s\"\n",fstart);
        !           148:          else
        !           149:          {  ExamineFH(ifp,&fib);
        !           150:             n=(struct ArgNode *)calloc(sizeof(struct ArgNode),1);
        !           151:                /* CHECK ERRORS!!!!!!!!!!! */
        !           152:             AddTail((struct List *)list,(struct Node *)n);
        !           153:             if (fib.fib_Size)
        !           154:             {  n->d=calloc((n->length=fib.fib_Size+1),1);
        !           155:                Read(ifp,n->d,fib.fib_Size);
        !           156:                n->d[fib.fib_Size]='\0';   /* Make sure null terminated */
        !           157:             }
        !           158:             Close(ifp);
        !           159:             if (n->d) argc+=CountArgs(list,n);          /* Recurse */
        !           160:          }
        !           161:          *line=fendbuffer;        /* Restore char replaced with '\0' */
        !           162:          if (*line=='"') ++line;  /* Increment line past quote */
        !           163:       }    /* End of embedded file handling */
        !           164: 
        !           165:       else if (*line=='"')
        !           166:       {  ++line;
        !           167:          while (*line!='"')
        !           168:            if (*(++line)=='\0') break;
        !           169:          argc++;
        !           170:          if (*line='"') ++line;
        !           171:       }
        !           172: 
        !           173:       else
        !           174:       {  while (!isspace(*line))
        !           175:            if (*(++line)=='\0') break;
        !           176:          argc++;
        !           177:       }
        !           178: 
        !           179:    }     /* End of infinite loop */
        !           180: 
        !           181:    return(argc);   /* Also returns any nodes added to list from embed files */
        !           182: }
        !           183: 
        !           184: /**********************************************************************/
        !           185: /* AddArgs() -- put each of the arguments in the node into the array  */
        !           186: /*              argv.  Recurse if necessary                           */
        !           187: /**********************************************************************/
        !           188: 
        !           189: void __regargs AddArgs(struct ArgNode **node,char ***argv)
        !           190: {  char *line,*stderrfile;
        !           191: 
        !           192:    line=(*node)->d;
        !           193:    (*node)=(struct ArgNode*)(*node)->n.mln_Succ;
        !           194:    while (1)
        !           195:    {  while (isspace(*line)) line++;   /* Skip leading whitespace */
        !           196: 
        !           197:       if (*line=='\0') break;                  /* Finished */
        !           198: 
        !           199:       else if (*line=='&')                     /* stderr redirect */
        !           200:       {  ++line;
        !           201:          while (isspace(*line)) ++line;
        !           202:          if (*line=='"')
        !           203:          {  stderrfile=++line;
        !           204:             while (*line!='"' && *line!='\0') line++;
        !           205:             if (*line=='"') { *line='\0'; line++; }
        !           206:          }
        !           207:          else
        !           208:          {  stderrfile=line;
        !           209:             while (!isspace(*line))
        !           210:             {  if (*line=='\0') break;
        !           211:                line++;
        !           212:             }
        !           213:             if (*line!='\0') { *line='\0'; line++; }
        !           214:          }
        !           215:          Close(__ufbs[2].ufbfh);
        !           216:          if ((__ufbs[2].ufbfh=Open(stderrfile,MODE_NEWFILE))==NULL)
        !           217:            __ufbs[2].ufbfh=Open("NIL:",MODE_OLDFILE);
        !           218:       }
        !           219: 
        !           220:       else if (*line=='@')         /* Embedded file -- skip past filename */
        !           221:       {  ++line;
        !           222:          if (*line=='"')
        !           223:          {  while (*line!='"')
        !           224:               if (*(++line)=='\0') break;
        !           225:          }
        !           226:          else
        !           227:          {  while (!isspace(*line))
        !           228:               if (*(++line)=='\0') break;
        !           229:          }
        !           230:          AddArgs(node,argv);       /* Add the arguments from whatever node */
        !           231:          if (*line!='\0') ++line;
        !           232:       }
        !           233: 
        !           234:       else if (*line=='"')
        !           235:       {  (*argv)[0]=++line;
        !           236:          while (*line!='"')
        !           237:            if (*(++line)=='\0') break;
        !           238:          if (*line!='\0')
        !           239:          {  *line='\0';                /* Null terminate this argument */
        !           240:             ++line;
        !           241:          }
        !           242:          (*argv)++;
        !           243:       }
        !           244: 
        !           245:       else
        !           246:       {  (*argv)[0]=line;
        !           247:          while (!isspace(*line))
        !           248:            if (*(++line)=='\0') break;
        !           249:          if (*line!='\0')
        !           250:          {  *line='\0';               /* Null terminate this argument */
        !           251:             ++line;
        !           252:          }
        !           253:          (*argv)++;
        !           254:       }
        !           255:    }     /* End of infinite loop */
        !           256: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.