📄 configur.c
字号:
{ "kanji", F_KANJI, B_GLOBAL},
{ "longname", B_LONGNAME, B_GLOBAL},
{ "monocase", F_ONECASE, B_GLOBAL},
{ "multiqueue", F_MULTI, B_GLOBAL},
{ "multitask", F_MULTITASK, B_GLOBAL},
{ "senddebug", F_SENDDEBUG, B_GLOBAL},
{ "snews", F_SNEWS, B_GLOBAL},
{ "syslog", F_SYSLOG, B_GLOBAL},
{ "symmetricgrades",
F_SYMMETRICGRADES,
B_GLOBAL},
{ nil(char) }
} ;
/*--------------------------------------------------------------------*/
/* p r o c e s s c o n f i g */
/* */
/* Handle a single line of a configuration file */
/*--------------------------------------------------------------------*/
boolean processconfig(char *buff,
SYSMODE sysmode,
CONFIGBITS program,
CONFIGTABLE *table,
FLAGTABLE *btable)
{
CONFIGTABLE *tptr;
char *cp;
char *keyword;
ENV_TYPE target_env;
/*--------------------------------------------------------------------*/
/* break out the keyword from its value */
/*--------------------------------------------------------------------*/
if ((cp = strchr(buff, '=')) == nil(char))
{
printmsg(0,"Missing equals sign after keyword \"%s\", ignored",
buff);
return TRUE;
}
*cp++ = '\0';
strlwr(buff);
/*--------------------------------------------------------------------*/
/* Determine if the keyword should processed in this environment */
/*--------------------------------------------------------------------*/
keyword = strchr( buff, '.' ); /* Look for environment */
if ( keyword == NULL ) /* No environment? */
{
keyword = buff; /* Then buffer starts with keyword */
target_env = active_env;
}
else {
typedef struct _ENVLIST {
char *name;
int value;
} ENVLIST;
static ENVLIST envtable[] = {
{ "dos", ENV_DOS },
{ "16bit", ENV_BIT16 },
{ "32bit", ENV_BIT32 },
{ "32bitos2", ENV_OS2_16BIT},
{ "16bitos2", ENV_OS2_32BIT},
{ "os2", ENV_OS2 },
{ "win32", ENV_WIN_32BIT},
{ "win16", ENV_WIN_16BIT},
{ "32bitwin", ENV_WIN_32BIT},
{ "16bitwin", ENV_WIN_16BIT},
{ "win", ENV_WIN },
{ NULL, ENV_UNKNOWN }
};
short subscript = 0;
*keyword++ = '\0'; /* Terminate environment string */
target_env = ENV_UNKNOWN;
while( envtable[subscript].name != NULL)
{
if (equal( envtable[subscript].name, buff ))
{
target_env = envtable[subscript].value;
break;
}
else
subscript ++;
} /* while */
if ( target_env == ENV_UNKNOWN )
{
printmsg(0,"Unknown environment \"%s\", keyword \"%s\" ignored",
buff, keyword );
return FALSE;
}
} /* else */
/*--------------------------------------------------------------------*/
/* Scan the table for its value */
/*--------------------------------------------------------------------*/
for (tptr = table; tptr->sym != nil(char); tptr++)
{
boolean error = FALSE;
if (equal(keyword, tptr->sym)) {
/*--------------------------------------------------------------------*/
/* Skip the keyword because of the environment? */
/*--------------------------------------------------------------------*/
if (!(active_env & target_env) )
printmsg(2,"%s-environment keyword \"%s\" skipped.",
strupr(buff), keyword);
/*--------------------------------------------------------------------*/
/* Handle obsolete options */
/*--------------------------------------------------------------------*/
else if (tptr->bits & B_OBSOLETE)
printmsg(2,"Obsolete keyword \"%s\" ignored.", keyword);
/*--------------------------------------------------------------------*/
/* Handle mis-placed system options */
/*--------------------------------------------------------------------*/
else if ((tptr->bits & B_GLOBAL) && (sysmode != SYSTEM_CONFIG))
printmsg(0,
"User specified system keyword \"%s\" ignored.",
keyword);
/*--------------------------------------------------------------------*/
/* Handle Boolean options */
/*--------------------------------------------------------------------*/
else {
if (tptr->bits & B_BOOLEAN)
options(cp, sysmode, btable, (boolean *) tptr->loc);
/*--------------------------------------------------------------------*/
/* Handle integer values */
/*--------------------------------------------------------------------*/
else if (tptr->bits & (B_SHORT|B_LONG))
{
long foo;
cp = strtok(cp,WHITESPACE);
if ( equal(cp,"0"))
foo = 0;
else {
foo = atol(cp);
if ( foo == 0)
{
printmsg(0,
"Unable to convert \"%s\" value \"%s\" to integer",
keyword, cp);
error = TRUE;
} /* if */
} /* else */
if (tptr->bits & B_LONG)
*((long *) tptr->loc) = foo;
else
*((KEWSHORT *) tptr->loc) = (KEWSHORT) foo;
} /* else */
/*--------------------------------------------------------------------*/
/* Handle lists of tokens */
/*--------------------------------------------------------------------*/
else if ((tptr->bits & program) && (tptr->bits & (B_LIST | B_CLIST)))
{
char **list = malloc( (MAXLIST+1) * sizeof (*list));
char *colon;
int words;
checkref( list );
if (tptr->bits & B_CLIST) /* Use colon as delimiter? */
while ( (colon = strchr( cp , ':')) != NULL)
*colon = ' '; /* Make colons spaces ... */
words = getargs(cp, list);
if( words > MAXLIST)
panic();
if (words > 0)
{
if ( *(tptr->loc) )
free( *(tptr->loc) );
list = realloc( list, (words+1) * sizeof(*list));
checkref( list );
*(tptr->loc) = (char *) list;
list[words] = NULL;
while( *list != NULL)
{
if (strlen(*list))
{
*list = newstr(*list);
checkref( *list++ );
}
else
*list++ = "";
} /* while */
} /* if (words > 0) */
else {
printmsg(0,"No parameters given for keyword \"%s\"",
keyword);
error = TRUE;
} /* else */
} /* else if */
/*--------------------------------------------------------------------*/
/* Handle single tokens and strings */
/*--------------------------------------------------------------------*/
else if (tptr->bits & program)
{
while( *cp == ' ' ) /* Trim leading whitespace */
cp++;
if (*cp == '\0')
{
error = TRUE;
printmsg(0,"No parameter given for keyword \"%s\""
", ignored.",
keyword);
} /* if */
if (tptr->bits & B_TOKEN) /* One word value? */
cp = strtok(cp,WHITESPACE); /* Yes --> Tokenize */
if (tptr->bits & B_NORMAL) /* Normalize path? */
cp = normalize( cp );
if (tptr->bits & B_MALLOC) /* Allocate normally? */
{
*(tptr->loc) = strdup(cp); /* Save string */
checkref( *(tptr->loc) ); /* Verify malloc() */
}
else
*(tptr->loc) = newstr(cp); /* Save string */
} /* else */
} /* else */
if (!error)
tptr->bits |= B_FOUND;
return TRUE; /* Report we found the keyword */
} /* if (equal(keyword, tptr->sym)) */
} /* for */
/*--------------------------------------------------------------------*/
/* We didn't find the keyword; report failure to the caller */
/*--------------------------------------------------------------------*/
return FALSE;
} /* processconfig */
/*--------------------------------------------------------------------*/
/* g e t c o n f i g */
/* */
/* Process a single configuration file */
/*--------------------------------------------------------------------*/
boolean getconfig(FILE *fp,
SYSMODE sysmode,
CONFIGBITS program,
CONFIGTABLE *table,
FLAGTABLE *btable)
{
char buff[BUFSIZ];
char *cp;
while(!(fgets(buff, sizeof buff, fp) == nil(char))) {
/*--------------------------------------------------------------------*/
/* Ingore comment lines */
/*--------------------------------------------------------------------*/
if (*buff == '#')
continue; /* comment line */
/*--------------------------------------------------------------------*/
/* Drop trailing new line */
/*--------------------------------------------------------------------*/
if (*(cp = buff + strlen(buff) - 1) == '\n')
*cp = '\0';
/*--------------------------------------------------------------------*/
/* Drop leading blanks on input line */
/*--------------------------------------------------------------------*/
cp = buff;
while( isspace( *cp ) )
cp ++ ;
/*--------------------------------------------------------------------*/
/* If line was not blank, process it. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -