home *** CD-ROM | disk | FTP | other *** search
/ ftp.rarlab.com / 2014.05.ftp.rarlab.com.tar / ftp.rarlab.com / rar / sunrar.zip / getopt.c < prev    next >
C/C++ Source or Header  |  1998-07-01  |  6KB  |  292 lines

  1. long ExclSize;
  2.  
  3. void SplitCommandLine(int Argc, char *Argv[])
  4. {
  5.   struct FileStat FS;
  6.   int I,Len,WriteArgsCount,NotSwCount;
  7.  
  8.   ExtrPath[0]=0;
  9.   ExclSize=ExclCount=NotSwCount=0;
  10.   memset(MainCommand,0,sizeof(MainCommand));
  11.  
  12.   for (I=1;I<Argc;I++)
  13.     if (Argv[I][0]=='-')
  14.       SetOptions(Argv[I],0);
  15.     else
  16.       NotSwCount++;
  17.  
  18.   mprintf(MUCopyright);
  19.  
  20.   WriteArgsCount=*ArcName=0;
  21.  
  22.   for (I=1;I<Argc;I++)
  23.   {
  24.     if (Argv[I][0]=='-')
  25.       continue;
  26.     if (MainCommand[0]==0 && NotSwCount>1)
  27.     {
  28.       strncpy(MainCommand,Argv[I],sizeof(MainCommand));
  29.       strupper(MainCommand);
  30.     }
  31.     else
  32.     {
  33.       if (*ArcName==0)
  34.       {
  35.         strncpy(ArcName,Argv[I],sizeof(ArcName)-1);
  36.         MakeTmpPath();
  37.         GetArcNames();
  38.       }
  39.       else
  40.       {
  41.         if (Argv[I][0]=='@' && !FileExist(Argv[I]))
  42.         {
  43.           AddArgsFromFile(&Argv[I][1]);
  44.           WriteArgsCount++;
  45.         }
  46.         else
  47.         {
  48.           Len=strlen(Argv[I]);
  49.           if (Len>0 && (Argv[I][Len-1]==':' || IsPathDiv(Argv[I][Len-1])) &&
  50.               strchr("AFUM",MainCommand[0])==NULL)
  51.             strncpy(ExtrPath,Argv[I],sizeof(ExtrPath)-1);
  52.           else
  53.           {
  54.             if ((MainCommand[0]=='X' || MainCommand[0]=='E') &&
  55.                 strchr(Argv[I],'*')==NULL && strchr(Argv[I],'?')==NULL &&
  56.                 GetFileStat(Argv[I],&FS) && FS.IsDir)
  57.             {
  58.               strncpy(ExtrPath,Argv[I],sizeof(ExtrPath)-1);
  59.               strcat(ExtrPath,PATHDIVIDER);
  60.             }
  61.             else
  62.             {
  63.               AddArgName(Argv[I]);
  64.               WriteArgsCount++;
  65.             }
  66.           }
  67.         }
  68.       }
  69.     }
  70.   }
  71.   if (WriteArgsCount==0 && *ArcName!=0)
  72.     AddArgName("*.*");
  73. }
  74.  
  75.  
  76. void SetOptions(char *OptStr,int MultipleSwitches)
  77. {
  78.   int I;
  79.   char SwStr[200];
  80.   while (*OptStr!=0)
  81.   {
  82.     if (MultipleSwitches)
  83.     {
  84.       while (*OptStr!='-' && *OptStr!=0)
  85.         OptStr++;
  86.       if (*OptStr==0 || *(++OptStr)==0)
  87.         break;
  88.       for (I=0; *OptStr!=0 && !isspace(*OptStr) && I<80; I++,OptStr++)
  89.         SwStr[I]=*OptStr;
  90.       SwStr[I]=0;
  91.     }
  92.     else
  93.       strcpy(SwStr,&OptStr[1]);
  94.     switch(toupper(SwStr[0]))
  95.     {
  96.       case 'I':
  97.         if (stricomp(&SwStr[1],"ERR")==0)
  98.         {
  99.           Opt.MsgStream=MSG_STDERR;
  100.           break;
  101.         }
  102.         if (stricomp(&SwStr[1],"NUL")==0)
  103.         {
  104.           Opt.MsgStream=MSG_NULL;
  105.           break;
  106.         }
  107.         break;
  108.       case 'O':
  109.         switch(toupper(SwStr[1]))
  110.         {
  111.           case '+':
  112.             Opt.Overwrite=ALL_OVERWR;
  113.             break;
  114.           case '-':
  115.             Opt.Overwrite=NO_OVERWR;
  116.             break;
  117.           default :
  118.             OutHelp();
  119.             ErrExit(EEMPTY,USER_ERROR);
  120.         }
  121.         break;
  122.       case 'R':
  123.         if (SwStr[1]==0)
  124.           Opt.Recurse=1;
  125.         break;
  126.       case 'Y':
  127.         Opt.AllYes=1;
  128.         break;
  129.       case 'X':
  130.         if (SwStr[1]!=0)
  131.           AddExclArgs(&SwStr[1]);
  132.         break;
  133.       case 'P':
  134.         if (SwStr[1]==0)
  135.         {
  136.           while (GetPassword(2)==0)
  137.             ;
  138.           mprintf("\n");
  139.         }
  140.         else
  141.           strncpy(Password,&SwStr[1],77);
  142.         break;
  143.       case 'V':
  144.         Opt.PackVolume=1;
  145.         break;
  146.       case 'F':
  147.         if (SwStr[1]==0)
  148.           Opt.FreshFiles=1;
  149.         break;
  150.       case 'U':
  151.         if (SwStr[1]==0)
  152.           Opt.UpdateFiles=1;
  153.         break;
  154.       case 'C':
  155.         if (SwStr[2]==0)
  156.           switch(toupper(SwStr[1]))
  157.           {
  158.             case '-':
  159.               Opt.DisableComment=1;
  160.               break;
  161.             case 'U':
  162.               Opt.ConvertNames=NAMES_UPPERCASE;
  163.               break;
  164.             case 'L':
  165.               Opt.ConvertNames=NAMES_LOWERCASE;
  166.               break;
  167.           }
  168.         break;
  169.       case 'K':
  170.         if (toupper(SwStr[1])=='B')
  171.           Opt.KeepBroken=1;
  172.         break;
  173.       case '?' :
  174.         OutHelp();
  175.         ErrExit(EEMPTY,SUCCESS);
  176.       default :
  177.         OutHelp();
  178.         ErrExit(EEMPTY,USER_ERROR);
  179.     }
  180.     if (!MultipleSwitches)
  181.       break;
  182.   }
  183. }
  184.  
  185.  
  186. void AddArgsFromFile(char *Name)
  187. {
  188.   FILE *ArgList;
  189.   char Arg[NM];
  190.   if (*Name)
  191.     ArgList=topen(Name,READTEXT,M_DENYWRITE);
  192.   else
  193.     ArgList=stdin;
  194.   while (fgets(Arg,sizeof(Arg),ArgList)!=NULL)
  195.   {
  196.     RemoveEOL(Arg);
  197.     if (*Arg)
  198.       AddArgName(Arg);
  199.   }
  200.   if (*Name)
  201.     fclose(ArgList);
  202. }
  203.  
  204.  
  205. void AddExclArgs(char *Name)
  206. {
  207.   FILE *ExclList;
  208.   char Arg[NM];
  209.   int NameSize;
  210.   if (Name[0]!='@')
  211.   {
  212.     NameSize=strlen(Name)+1;
  213.     if ((ExclPtr=realloc(ExclPtr,ExclSize+NameSize))==NULL)
  214.       ErrExit(EMEMORY,MEMORY_ERROR);
  215.     strcpy(ExclPtr+ExclSize,Name);
  216.     ExclSize+=NameSize;
  217.     ExclCount++;
  218.     return;
  219.   }
  220.   if (Name[1])
  221.     ExclList=topen(&Name[1],READTEXT,M_DENYWRITE);
  222.   else
  223.     ExclList=stdin;
  224.   while (fgets(Arg,sizeof(Arg),ExclList)!=NULL)
  225.   {
  226.     RemoveEOL(Arg);
  227.     if (*Arg)
  228.       AddExclArgs(Arg);
  229.   }
  230.   if (Name[1])
  231.     fclose(ExclList);
  232. }
  233.  
  234.  
  235. int ExclCheck(char *Name)
  236. {
  237.   int I;
  238.   char *ExclName;
  239.   for (ExclName=ExclPtr,I=0;I<ExclCount;I++,ExclName+=strlen(ExclName)+1)
  240.     if (CmpName(ExclName,Name,2))
  241.       return(1);
  242.   return(0);
  243. }
  244.  
  245.  
  246. void MakeTmpPath(void)
  247. {
  248.   if (strrchr(PointToName(ArcName),'.')==NULL && !FileExist(ArcName))
  249.     strcat(ArcName,".rar");
  250.  
  251.   if ((NumArcDrive=GetPathDisk(ArcName))==-1)
  252.     NumArcDrive=GetCurDisk();
  253.  
  254. }
  255.  
  256.  
  257. void InitSomeVars(void)
  258. {
  259.   CurExtrFile[0]=TmpArc[0]=0;
  260.   ArcPtr=TmpArcPtr=FilePtr=NULL;
  261.   OverwriteAll=0;
  262. }
  263.  
  264.  
  265. void OutHelp(void)
  266. {
  267.   mprintf(MUCHelp1);
  268.   mprintf(MUCHelp2);
  269.   mprintf(MUCHelp3);
  270.   mprintf(MUCHelp4);
  271.   mprintf(MUCHelp5);
  272.   mprintf(MUCHelp6);
  273.   mprintf(MUCHelp7);
  274.   mprintf(MUCHelp8);
  275.   mprintf(MUCHelp9);
  276.   mprintf(MUCHelp10);
  277.   mprintf(MUCHelp11);
  278.  
  279.   mprintf(MUFCHelp12);
  280.  
  281.   mprintf(MUCHelp13);
  282.   mprintf(MUCHelp14);
  283.   mprintf(MUCHelp15);
  284.   mprintf(MUCHelp16);
  285.   mprintf(MUCHelp17);
  286.   mprintf(MUCHelp18);
  287.   mprintf(MUCHelp19);
  288.   mprintf("\n");
  289. }
  290.  
  291.  
  292.