📄 cmdline.c
字号:
char *token;
int maxSwitchLen,tmp;
CmdLinePara *paraPtr;
CmdLineSwitch *switchPtr;
/* set minusFlag if switches are preceded by '-' */
minusFlag = (progName!=NULL || paraList!=NULL);
minusChar = (minusFlag) ? "-" : "";
fprintf(outStream,"\n");
maxSwitchLen = 0;
switchPtr = switchList;
while (switchPtr != NULL && switchPtr->switchName != NULL) {
if ((tmp=strlen(switchPtr->switchName)+
((switchPtr->argument!=NULL && switchPtr->format!=NULL)?4:0))
> maxSwitchLen)
maxSwitchLen = tmp;
switchPtr++;
}
if (progName != NULL)
fprintf(outStream,"usage: %s",progName);
else
fprintf(outStream,"token list format:");
fprintf(outStream," %sswitches",minusChar);
paraPtr = paraList;
while (paraPtr != NULL && paraPtr->argument != NULL) {
fprintf(outStream," %s",paraPtr->help);
if (paraPtr->format==NULL)
/* remaining args are not processed !!! */
break; /* while (paraPtr ...) */
paraPtr++;
}
fprintf(outStream,"\n");
/* display help for every switch */
switchPtr=switchList;
while (switchPtr != NULL && switchPtr->switchName != NULL) {
fprintf(outStream,"%9s %s%s%-*s ",
(switchPtr==switchList)?"switches:":"",
minusChar,switchPtr->switchName,
maxSwitchLen-strlen(switchPtr->switchName),
(switchPtr->format==NULL)?"":" <x>");
if (strchr(switchPtr->help,'\n')==NULL)
fprintf(outStream,"%s",switchPtr->help);
else {
/* multiple lines separated by '\n' */
strncpy(help,switchPtr->help,MAX_HELP_SIZE-1);
help[MAX_HELP_SIZE-1] = '\0';
token = strtok(help,"\n");
fprintf(outStream,"%s",token);
while (token!=NULL) {
token = strtok(NULL,"\n");
if (token!=NULL) {
fprintf(outStream,"\n");
if (strcmp(token,"\b")==0)
fprintf(outStream,"%9s %*s ",
"",maxSwitchLen+minusFlag,"");
else
fprintf(outStream,"%9s %*s %s",
"",maxSwitchLen+minusFlag,"",token);
}
}
}
if (switchPtr->argument!=NULL && switchPtr->defaultValue!=NULL)
fprintf(outStream," (dflt: %s)",switchPtr->defaultValue);
fprintf(outStream,"\n");
switchPtr++;
}
fprintf(outStream,"\n");
}
/* CmdLineParseString() */
/* Parse a copy of string into tokens separated by sepaChar. */
/* Resulting token list can be evaluated by CmdLineEval(). */
char **CmdLineParseString (
char *string, /* in: string to be parsed */
/* NOTE: string is not modified */
char *sepaChar, /* in: token separator characters */
int *count) /* out: number of tokens generated by parser */
/* (corresponds to argc) */
/* returns: */
/* list of tokens generated by parser */
/* (corresponds to argv[]) */
{
char *tmpTokenList[MAX_TOKEN_NUM];
char *firstChar;
char *stringBuf;
char **tokenList;
int i,size;
if (CLdebugLevel >= 1)
printf("CmdLineParseString: sepa=\"%s\"\n",sepaChar);
if (string == NULL)
stringBuf = NULL;
else {
/* find first non-sepaChar */
firstChar = string;
while (*firstChar!='\0' && strchr(sepaChar,*firstChar)!=NULL)
firstChar++;
size = strlen(firstChar);
/* copy string content */
if ((stringBuf = (char*)malloc((size+1)*sizeof(char))) == NULL)
CommonExit(1,"CmdLineParseString: memory allocation error (stringBuf)");
strcpy(stringBuf,firstChar);
}
/* parse string */
i = 0;
tmpTokenList[i] = (stringBuf==NULL)?(char*)NULL:strtok(stringBuf,sepaChar);
if (tmpTokenList[0]!=NULL && tmpTokenList[0]!=stringBuf)
CommonExit(1,"CmdLineParseString: internal error");
while (tmpTokenList[i]!=NULL) {
if (CLdebugLevel >= 2)
printf("%4d: \"%s\"\n",i,tmpTokenList[i]);
if (++i >= MAX_TOKEN_NUM)
CommonExit(1,"CmdLineParseString: too many tokens");
tmpTokenList[i] = strtok(NULL,sepaChar);
}
*count = i;
/* copy token list */
if ((tokenList = (char**)malloc((*count+1)*sizeof(char*))) == NULL)
CommonExit(1,"CmdLineParseString: memory allocation error (tokenList)");
for (i=0; i<*count; i++)
tokenList[i] = tmpTokenList[i];
tokenList[*count] = NULL;
if (CLdebugLevel >= 1)
printf("CmdLineParseString: tokenCount=%d\n",*count);
return tokenList;
}
/* CmdLineParseFile() */
/* Parse init file into tokens separated by sepaChar. */
/* Comments preceded by a commentSepaChar are ingnored. */
/* Resulting token list can be evaluated by CmdLineEval(). */
char **CmdLineParseFile (
char *fileName, /* in: file name of init file */
char *sepaChar, /* in: token separator characters */
char *commentSepaChar, /* in: comment separator characters */
int *count) /* out: number of tokens generated by parser */
/* (corresponds to argc) */
/* returns: */
/* list of tokens generated by parser */
/* (corresponds to argv[]) */
/* or NULL if file error */
{
FILE *initFile;
char lineBuf[MAX_LINE_SIZE];
char *comment;
char tmpFileBuf[MAX_FILE_SIZE];
char *firstChar;
char *fileBuf;
char *tmpTokenList[MAX_TOKEN_NUM];
char **tokenList;
int i,size,line;
if (CLdebugLevel >= 1)
printf("CmdLineParseFile: file=\"%s\" sepa=\"%s\" com=\"%s\"\n",
fileName,sepaChar,commentSepaChar);
/* open init file */
if ((initFile = fopen(fileName,"r")) == NULL) {
CommonWarning("CmdLineParseFile: error opening init file %s",fileName);
return NULL;
}
/* read init file */
line = 0;
size = 0;
tmpFileBuf[0] = '\0';
while (fgets(lineBuf,MAX_LINE_SIZE,initFile) != NULL) {
line++;
comment = strpbrk(lineBuf,commentSepaChar);
if (comment != NULL)
i = comment-lineBuf;
else {
i = strlen(lineBuf)-1;
if (lineBuf[i] != '\n')
CommonExit(1,"CmdLineParseFile: line %d too long",line);
}
if (size+i+1 >= MAX_FILE_SIZE)
CommonExit(1,"CmdLineParseFile: file too long");
strncat(tmpFileBuf+size,lineBuf,i);
strncat(tmpFileBuf+size+i,sepaChar,1);
size += i+1;
}
/* close init file */
if (fclose(initFile)) {
CommonWarning("CmdLineParseFile: error closing init file");
return NULL;
}
if (CLdebugLevel >= 1)
printf("CmdLineParseFile: initFileLineNum=%d\n",line);
/* find first non-sepaChar */
firstChar = tmpFileBuf;
while (*firstChar!='\0' && strchr(sepaChar,*firstChar)!=NULL)
firstChar++;
size -= firstChar-tmpFileBuf;
/* copy file content */
if ((fileBuf = (char*)malloc((size+1)*sizeof(char))) == NULL)
CommonExit(1,"CmdLineParseFile: memory allocation error (fileBuf)");
strcpy(fileBuf,firstChar);
/* parse string */
i = 0;
tmpTokenList[i] = strtok(fileBuf,sepaChar);
if (tmpTokenList[0]!=NULL && tmpTokenList[0]!=fileBuf)
CommonExit(1,"CmdLineParseFile: internal error");
while (tmpTokenList[i]!=NULL) {
if (CLdebugLevel >= 2)
printf("%4d: \"%s\"\n",i,tmpTokenList[i]);
if (++i >= MAX_TOKEN_NUM)
CommonExit(1,"CmdLineParseFile: too many tokens");
tmpTokenList[i] = strtok(NULL,sepaChar);
}
*count = i;
/* copy token list */
if ((tokenList = (char**)malloc((*count+1)*sizeof(char*))) == NULL)
CommonExit(1,"CmdLineParseFile: memory allocation error (tokenList)");
for (i=0; i<*count; i++)
tokenList[i] = tmpTokenList[i];
tokenList[*count] = NULL;
if (CLdebugLevel >= 1)
printf("CmdLineParseFile: tokenCount=%d\n",*count);
return tokenList;
}
/* CmdLineParseFree() */
/* Free memory allocated by CmdLineParseString() or CmdLineParseFile(). */
void CmdLineParseFree (
char **tokenList) /* in: token list returned by */
/* CmdLineParseString() or */
/* CmdLineParseFile() */
{
if (tokenList != NULL) {
if (*tokenList != NULL)
free(*tokenList);
free(tokenList);
}
if (CLdebugLevel >= 1)
printf("CmdLineParseFree: %s\n",
(tokenList) ? "free tokenList" : "no tokenList");
}
/* ComposeFileName() */
/* Compose filename using default path and extension if required. */
/* Handles Unix & DOS paths. "-" is passed through directly. */
int ComposeFileName (
char *inName, /* in: input filename */
int forceDefault, /* in: 0=keep input path and/or extension if */
/* available, otherwise use default(s) */
/* 1=force usage of default */
/* path and extension */
char *defaultPath, /* in: default path */
/* or NULL */
char *defaultExt, /* in: default extension */
/* or NULL */
char *fileName, /* out: composed filename */
unsigned int fileNameMaxLen) /* in: fileName max length */
/* returns: */
/* 0=OK 1=result too long */
{
char *name,*dot,*tmp;
char pathChar;
if (CLdebugLevel >= 1)
printf("ComposeFileName: in=\"%s\" forceDef=%d path=\"%s\" ext=\"%s\""
" len=%d\n",
inName,forceDefault,
(defaultPath!=NULL)?defaultPath:"(NULL)",
(defaultExt!=NULL)?defaultExt:"(NULL)",
fileNameMaxLen);
if (strcmp(inName,"-")==0) {
if (fileNameMaxLen<2)
return 1;
strcpy(fileName,inName);
return 0;
}
/* compose path */
name = StripPath(inName);
if (name==inName || forceDefault) {
/* use default path */
if (defaultPath==NULL || *defaultPath=='\0')
*fileName = '\0';
else
if (strlen(defaultPath)+1 >= fileNameMaxLen)
return 1;
else {
strcpy(fileName,defaultPath);
tmp = fileName+strlen(fileName)-1;
if (strchr(fileName,'/')!=NULL || strchr(inName,'/')!=NULL)
pathChar = '/';
else
if (strchr(fileName,'\\')!=NULL || strchr(inName,'\\')!=NULL)
pathChar = '\\';
else
pathChar = '/';
if (*tmp!=pathChar) {
/* append pathChar to default path */
*(++tmp) = pathChar;
*(++tmp) = '\0';
}
}
if (strlen(fileName)+strlen(name) >= fileNameMaxLen)
return 1;
else
strcat(fileName,name);
}
else {
/* use input path */
if (strlen(inName) >= fileNameMaxLen)
return 1;
else
strcpy(fileName,inName);
}
/* compose extension */
dot = strchr(StripPath(fileName),'.');
if (dot!=NULL && forceDefault) {
/* remove input extension */
*dot = '\0';
dot = NULL;
}
if (dot==NULL && defaultExt!=NULL && *defaultExt!='\0') {
/* use default extension */
if (strlen(fileName)+strlen(defaultExt)+1 >= fileNameMaxLen)
return 1;
else {
if (strchr(defaultExt,'.') == NULL)
/* insert '.' before extension */
strcat(fileName,".");
strcat(fileName,defaultExt);
}
}
if (CLdebugLevel >= 1)
printf("ComposeFileName: fileName=\"%s\"\n",fileName);
return 0;
}
/* end of cmdline.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -