⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 option.c

📁 htp是一个HTML预处理器。页面可以用htp扩展的类HTML的宏编写。这可以简化维护一个一致外观的Web页面集.
💻 C
字号:
/*//// option.c//// Program options and setting//// Copyright (c) 1995-96 Jim Nelson.  Permission to distribute// granted by the author.  No warranties are made on the fitness of this// source code.//*/#include "htp.h"static VARSTORE globalOption;static VARSTORE localOption;static VARSTORE *currentContext = NULL;/* option variable types */#define VAR_TYPE_OPTION                 (0)/* option strings (user, not internal names) */const char *OPT_STR_IMGXY = "IMGXY";const char *OPT_STR_NOIMGXY = "NOIMGXY";const char *OPT_STR_VERBOSE = "VERBOSE";const char *OPT_STR_QUIET = "QUIET";const char *OPT_STR_DEPEND = "DEPEND";const char *OPT_STR_NODEPEND = "NODEPEND";const char *OPT_STR_PRECIOUS = "PRECIOUS";const char *OPT_STR_NOPRECIOUS = "NOPRECIOUS";const char *OPT_STR_CONDENSE = "CONDENSE";const char *OPT_STR_NOCONDENSE = "NOCONDENSE";const char *OPT_STR_SET_DELIM = "DELIM";const char *OPT_STR_DELIM_HTML = "HTML";const char *OPT_STR_DELIM_SQUARE = "SQUARE";const char *OPT_STR_DELIM_CURLY = "CURLY";const char *OPT_STR_KEEP_TEMP = "KEEPTEMP";/* option string names */const char *OPT_N_IMGXY = "IMGXY";const char *OPT_N_QUIET = "QUIET";const char *OPT_N_DEPEND = "DEPEND";const char *OPT_N_PRECIOUS = "PRECIOUS";const char *OPT_N_CONDENSE = "CONDENSE";const char *OPT_N_USAGE = "USAGE";const char *OPT_N_SET_DELIM = "DELIM";const char *OPT_N_KEEP_TEMP = "KEEPTEMP";/* option string values */const char *OPT_V_TRUE = "TRUE";const char *OPT_V_FALSE = "FALSE";const char *OPT_V_DELIM_HTML = "HTML";const char *OPT_V_DELIM_SQUARE = "SQUARE";const char *OPT_V_DELIM_CURLY = "CURLY";/*//*/BOOL SetOption(const char *name, const char *value){    return StoreVariable(currentContext, name, value, VAR_TYPE_OPTION,        0, NULL, NULL);}BOOL InitOptionHelper(const char *name, const char *value, OPTION_CALLBACK optionCallback,    ulong userParam){    BOOL store;    store = TRUE;    if(optionCallback != NULL)    {        store = optionCallback(name, value, userParam);    }    if(store)    {        if(SetOption(name, value) == FALSE)        {            return FALSE;        }    }    return TRUE;}BOOL InitializeGlobalOption(OPTION_CALLBACK optionCallback, ulong userParam){    BOOL result;    if(InitializeVariableStore(&globalOption) == FALSE)    {        return FALSE;    }    currentContext = &globalOption;    /* set defaults for all options */    result = InitOptionHelper(OPT_N_IMGXY, OPT_V_TRUE, optionCallback, userParam);    result = InitOptionHelper(OPT_N_QUIET, OPT_V_FALSE, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_DEPEND, OPT_V_TRUE, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_PRECIOUS, OPT_V_FALSE, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_CONDENSE, OPT_V_FALSE, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_USAGE, OPT_V_FALSE, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_SET_DELIM, OPT_V_DELIM_HTML, optionCallback, userParam) && result;    result = InitOptionHelper(OPT_N_KEEP_TEMP, OPT_V_FALSE, optionCallback, userParam) && result;    /* if a problem occurred, back out */    if(result == FALSE)    {        DEBUG_PRINT(("Unable to store global defaults\n"));        DestroyGlobalOption();    }    return result;}void DestroyGlobalOption(void){    currentContext = NULL;    DestroyVariableStore(&globalOption);}BOOL InitializeLocalOption(void){    if(InitializeVariableStore(&localOption) == TRUE)    {        PushVariableStoreContext(&globalOption, &localOption);        currentContext = &localOption;        return TRUE;    }    return FALSE;}void DestroyLocalOption(void){    currentContext = &globalOption;    DestroyVariableStore(&localOption);}BOOL ParseToken(const char *token, OPTION_CALLBACK optionCallback, ulong userParam){    const char *name;    const char *value;    BOOL store;    char *tokenCopy;    char *tokenPtr;    char *tokenValue;    FIND_TOKEN findToken;    name = NULL;    value = NULL;    /* process the string ... probably a better way to do this */    /* rather than brute force, but for now, it works */    if(stricmp(token, OPT_STR_IMGXY) == 0)    {        name = OPT_N_IMGXY;        value = OPT_V_TRUE;    }    else if(stricmp(token, OPT_STR_NOIMGXY) == 0)    {        name = OPT_N_IMGXY;        value = OPT_V_FALSE;    }    else if(stricmp(token, OPT_STR_VERBOSE) == 0)    {        name = OPT_N_QUIET;        value = OPT_V_FALSE;    }    else if(stricmp(token, OPT_STR_QUIET) == 0)    {        name = OPT_N_QUIET;        value = OPT_V_TRUE;    }    else if(stricmp(token, OPT_STR_DEPEND) == 0)    {        name = OPT_N_DEPEND;        value = OPT_V_TRUE;    }    else if(stricmp(token, OPT_STR_NODEPEND) == 0)    {        name = OPT_N_DEPEND;        value = OPT_V_FALSE;    }    else if(stricmp(token, OPT_STR_PRECIOUS) == 0)    {        name = OPT_N_PRECIOUS;        value = OPT_V_TRUE;    }    else if(stricmp(token, OPT_STR_NOPRECIOUS) == 0)    {        name = OPT_N_PRECIOUS;        value = OPT_V_FALSE;    }    else if(stricmp(token, OPT_STR_CONDENSE) == 0)    {        name = OPT_N_CONDENSE;        value = OPT_V_TRUE;    }    else if(stricmp(token, OPT_STR_NOCONDENSE) == 0)    {        name = OPT_N_CONDENSE;        value = OPT_V_FALSE;    }    else if(stricmp(token, OPT_STR_KEEP_TEMP) == 0)    {        name = OPT_N_KEEP_TEMP;        value = OPT_V_TRUE;    }    else if((stricmp(token, "?") == 0) || (stricmp(token, "H") == 0))    {        name = OPT_N_USAGE;        value = OPT_V_TRUE;    }    else    {        tokenPtr = NULL;        tokenValue = NULL;        /* further break up the token, looking for an equal sign */        if((tokenCopy = DuplicateString(token)) == NULL)        {            DEBUG_PRINT(("unable to duplicate token string"));            return FALSE;        }        tokenPtr = StringFirstToken(&findToken, tokenCopy, "=");        if(tokenPtr != NULL)        {            tokenValue = StringNextToken(&findToken);        }        if((tokenPtr != NULL) && (tokenValue != NULL))        {            /* tokenPtr now points to the left side of the equal sign (if there */            /* is one */            if(stricmp(tokenPtr, OPT_STR_SET_DELIM) == 0)            {                name = OPT_N_SET_DELIM;                if(stricmp(tokenValue, OPT_STR_DELIM_HTML) == 0)                {                    value = OPT_V_DELIM_HTML;                }                else if(stricmp(tokenValue, OPT_STR_DELIM_SQUARE) == 0)                {                    value = OPT_V_DELIM_SQUARE;                }                else if(stricmp(tokenValue, OPT_STR_DELIM_CURLY) == 0)                {                    value = OPT_V_DELIM_CURLY;                }                else                {                    /* something screwy here! */                    name = NULL;                    value = NULL;                }            }        }        FreeMemory(tokenCopy);        tokenCopy = NULL;    }    if(name != NULL)    {        assert(value != NULL);        store = TRUE;        if(optionCallback != NULL)        {            store = optionCallback(name, value, userParam);        }        if(store)        {            return SetOption(name, value);        }        return TRUE;    }    else if(optionCallback != NULL)    {        /* report the bad string through the option callback */        return optionCallback(NULL, token, userParam);    }    /* FALSE indicates an error only */    return FALSE;}BOOL ParseTextOption(const char *string, OPTION_CALLBACK optionCallback,    ulong userParam){    char *tokenize;    char *ptr;    BOOL result;    FIND_TOKEN findToken;    /* copy the string to run through String...Token() */    if((tokenize = DuplicateString(string)) == NULL)    {        DEBUG_PRINT(("unable to allocate duplicate string"));        return FALSE;    }    result = TRUE;    ptr = StringFirstToken(&findToken, tokenize, " ");    while(ptr != NULL)    {        /* skip any leading slashes or dashes */        while((((*ptr == '/') || (*ptr == '-'))) && (*ptr != NUL))        {            ptr++;        }        /* parse this token */        if(ParseToken(ptr, optionCallback, userParam) == FALSE)        {            result = FALSE;            break;        }        /* do it till the cows come home */        ptr = StringNextToken(&findToken);    }    FreeMemory(tokenize);    return result;}BOOL ParseMarkupOption(const HTML_MARKUP *htmlMarkup, OPTION_CALLBACK optionCallback,    ulong userParam){    uint ctr;    char token[128];    BOOL result;    result = TRUE;    /* technically, would like to avoid iterating through the HTML_MARKUP */    /* structure for certain (future design) reasons, but really have to */    /* for this to work */    for(ctr = 0; ctr < htmlMarkup->attribCount; ctr++)    {        /* have to build the token as well ... kind of hurts to break up */        /* the attribute only to put it back together again */        StringCopy(token, htmlMarkup->attrib[ctr].name, sizeof(token));        if(htmlMarkup->attrib[ctr].value != NULL)        {            strncat(token, "=", sizeof(token));            strncat(token, htmlMarkup->attrib[ctr].value, sizeof(token));        }        if(ParseToken(token, optionCallback, userParam) == FALSE)        {            result = FALSE;            break;        }    }    return result;}BOOL IsOptionEnabled(const char *name){    const char *value;    value = GetVariableValue(currentContext, name);    /* !! ugh ... probably shouldnt assert() these, but for now ... */    /* first case means that the caller passed in a bogus option name */    /* second case means that the option isnt boolean */    if(value == NULL)    {        DEBUG_PRINT(("looking up %s", name));    }    assert(value != NULL);    assert((stricmp(value, OPT_V_TRUE) == 0) || (stricmp(value, OPT_V_FALSE) == 0));    if(stricmp(value, OPT_V_TRUE) == 0)    {        return TRUE;    }    return FALSE;}const char *GetOptionValue(const char *name){    const char *value;    value = GetVariableValue(currentContext, name);    assert(value != NULL);    return value;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -