aboutsummaryrefslogtreecommitdiffstats
path: root/cmdarg.c
diff options
context:
space:
mode:
Diffstat (limited to 'cmdarg.c')
-rw-r--r--cmdarg.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/cmdarg.c b/cmdarg.c
new file mode 100644
index 0000000..5ac02ee
--- /dev/null
+++ b/cmdarg.c
@@ -0,0 +1,222 @@
+/* cmdarg.c */
+/*****************************************************************************/
+/* AS-Portierung */
+/* */
+/* Verarbeitung Kommandozeilenparameter */
+/* */
+/* Historie: 4. 5.1996 Grundsteinlegung */
+/* 1. 6.1996 Empty-Funktion */
+/* 17. 4.1999 Key-Files in Kommandozeile */
+/* */
+/*****************************************************************************/
+
+#include "stdinc.h"
+#include <string.h>
+#include <ctype.h>
+
+#include "strutil.h"
+#include "cmdarg.h"
+#include "nls.h"
+#include "nlmessages.h"
+#include "cmdarg.rsc"
+
+LongInt ParamCount; /* Kommandozeilenparameter */
+char **ParamStr;
+
+TMsgCat MsgCat;
+
+ static void ClrBlanks(char *tmp)
+BEGIN
+ int cnt;
+
+ for (cnt=0; isspace((unsigned int) tmp[cnt]); cnt++);
+ if (cnt>0) strcpy(tmp,tmp+cnt);
+END
+
+ Boolean ProcessedEmpty(CMDProcessed Processed)
+BEGIN
+ int z;
+
+ for (z=1; z<=ParamCount; z++)
+ if (Processed[z]) return False;
+ return True;
+END
+
+ static void ProcessFile(char *Name_O, CMDRec *Def, Integer Cnt, CMDErrCallback ErrProc);
+
+ static CMDResult ProcessParam(CMDRec *Def, Integer Cnt, char *O_Param,
+ char *O_Next, Boolean AllowLink,
+ CMDErrCallback ErrProc)
+BEGIN
+ int Start;
+ Boolean Negate;
+ int z,Search;
+ CMDResult TempRes;
+ String s,Param,Next;
+
+ strncpy(Param,O_Param,255);
+ strncpy(Next,O_Next,255);
+
+ if ((*Next == '-') OR (*Next == '+') OR (*Next == '@')) *Next = '\0';
+ if (*Param == '@')
+ BEGIN
+ if (AllowLink)
+ BEGIN
+ ProcessFile(Param + 1, Def, Cnt, ErrProc);
+ return CMDOK;
+ END
+ else
+ BEGIN
+ fprintf(stderr, "%s\n", catgetmessage(&MsgCat, Num_ErrMsgNoKeyInFile));
+ return CMDErr;
+ END
+ END
+ if ((*Param == '-') OR (*Param == '+'))
+ BEGIN
+ Negate=(*Param=='+'); Start=1;
+
+ if (Param[Start]=='#')
+ BEGIN
+ for (z=Start+1; z<strlen(Param); z++) Param[z]=toupper(Param[z]);
+ Start++;
+ END
+ else if (Param[Start]=='~')
+ BEGIN
+ for (z=Start+1; z<strlen(Param); z++) Param[z]=tolower(Param[z]);
+ Start++;
+ END
+
+ TempRes=CMDOK;
+
+ Search=0;
+ strncpy(s,Param+Start,255);
+ for (z=0; z<strlen(s); z++) s[z]=toupper(s[z]);
+ for (Search=0; Search<Cnt; Search++)
+ if ((strlen(Def[Search].Ident)>1) AND (strcmp(s,Def[Search].Ident)==0)) break;
+ if (Search<Cnt)
+ TempRes=Def[Search].Callback(Negate,Next);
+
+ else
+ for (z=Start; z<strlen(Param); z++)
+ if (TempRes!=CMDErr)
+ BEGIN
+ Search=0;
+ for (Search=0; Search<Cnt; Search++)
+ if ((strlen(Def[Search].Ident)==1) AND (Def[Search].Ident[0]==Param[z])) break;
+ if (Search>=Cnt) TempRes=CMDErr;
+ else
+ switch (Def[Search].Callback(Negate,Next))
+ BEGIN
+ case CMDErr: TempRes=CMDErr; break;
+ case CMDArg: TempRes=CMDArg; break;
+ case CMDOK: break;
+ case CMDFile: break; /** **/
+ END
+ END
+ return TempRes;
+ END
+ else return CMDFile;
+END
+
+ static void DecodeLine(CMDRec *Def, Integer Cnt, char *OneLine,
+ CMDErrCallback ErrProc)
+BEGIN
+ int z;
+ char *EnvStr[256],*start,*p;
+ int EnvCnt=0;
+
+ ClrBlanks(OneLine);
+ if ((*OneLine!='\0') AND (*OneLine!=';'))
+ BEGIN
+ start=OneLine;
+ while (*start!='\0')
+ BEGIN
+ EnvStr[EnvCnt++]=start;
+ p=strchr(start,' '); if (p==Nil) p=strchr(start, '\t');
+ if (p!=Nil)
+ BEGIN
+ *p='\0'; start=p+1;
+ while (isspace((unsigned int) *start)) start++;
+ END
+ else start+=strlen(start);
+ END
+ EnvStr[EnvCnt]=start;
+
+ for (z=0; z<EnvCnt; z++)
+ switch (ProcessParam(Def, Cnt, EnvStr[z], EnvStr[z+1], False, ErrProc))
+ BEGIN
+ case CMDErr:
+ case CMDFile: ErrProc(True,EnvStr[z]); break;
+ case CMDArg: z++; break;
+ case CMDOK: break;
+ END
+ END
+END
+
+ static void ProcessFile(char *Name_O, CMDRec *Def, Integer Cnt, CMDErrCallback ErrProc)
+BEGIN
+ FILE *KeyFile;
+ String Name, OneLine;
+
+ strmaxcpy(Name, Name_O, 255);
+ ClrBlanks(OneLine);
+
+ KeyFile=fopen(Name, "r");
+ if (KeyFile == Nil) ErrProc(True, catgetmessage(&MsgCat, Num_ErrMsgKeyFileNotFound));
+ while (NOT feof(KeyFile))
+ BEGIN
+ errno = 0; ReadLn(KeyFile, OneLine);
+ if ((errno != 0) AND (NOT feof(KeyFile)))
+ ErrProc(True, catgetmessage(&MsgCat, Num_ErrMsgKeyFileError));
+ DecodeLine(Def, Cnt, OneLine, ErrProc);
+ END
+ fclose(KeyFile);
+END
+
+ void ProcessCMD(CMDRec *Def, Integer Cnt, CMDProcessed Unprocessed,
+ char *EnvName, CMDErrCallback ErrProc)
+BEGIN
+ int z;
+ String OneLine;
+
+ if (getenv(EnvName)==Nil) OneLine[0]='\0';
+ else strncpy(OneLine,getenv(EnvName),255);
+
+ if (OneLine[0]=='@')
+ ProcessFile(OneLine + 1, Def, Cnt, ErrProc);
+ else DecodeLine(Def,Cnt,OneLine,ErrProc);
+
+ for (z=0; z<=ParamCount; Unprocessed[z++]=(z!=0));
+ for (z=1; z<=ParamCount; z++)
+ if (Unprocessed[z])
+ switch (ProcessParam(Def, Cnt, ParamStr[z], (z < ParamCount) ? ParamStr[z + 1] : "",
+ True, ErrProc))
+ BEGIN
+ case CMDErr: ErrProc(False,ParamStr[z]); break;
+ case CMDOK: Unprocessed[z]=False; break;
+ case CMDArg: Unprocessed[z]=Unprocessed[z+1]=False; break;
+ case CMDFile: break; /** **/
+ END
+END
+
+ char *GetEXEName(void)
+BEGIN
+ static String s;
+ char *pos;
+
+ strcpy(s,ParamStr[0]);
+ do
+ BEGIN
+ pos=strchr(s,'/');
+ if (pos!=Nil) strcpy(s,pos+1);
+ END
+ while (pos!=Nil);
+ pos=strchr(s,'.'); if (pos!=Nil) *pos='\0';
+ return s;
+END
+
+ void cmdarg_init(char *ProgPath)
+BEGIN
+ opencatalog(&MsgCat,"cmdarg.msg",ProgPath,MsgId1,MsgId2);
+END
+