读文件KEY VALUE对的小模块

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

#define CHAR_IS_IN_STR(c, s)  (NULL != strchr((s), (c)))
#define CHAR_ISNOT_IN_STR(c, s)  (NULL == strchr((s), (c)))
#define ARRAY_SIZE(A) (sizeof (p) / sizeof (*p))
#define SKIP_WHITESPACE(s) \
    do {\
        while (*s == ' ' \
                || *s == '\t') \
            ++s;\
    } while (0)

static bool find_token(char const **p, const char *strTok)
{
    const char *s1 =*p, *s2;
    
    SKIP_WHITESPACE(s1);
    
    for (s2 = strTok; ;s1++, s2++)
    {
        if (*s2 == '\0')
            break;
        
        if (*s1 != *s2)
            return false;
    }

    SKIP_WHITESPACE(s1);
    
    *p = s1;
    return true;
}

static bool do_parse(char *strValue, char *strBuf, const char *strKey, int nLen)
{
    int n1 = 0, n2 = 0, i;
    const char *p = strBuf;
    const char *pp[] = {"[", strKey, "]", "="};

    for (i = 0; i < ARRAY_SIZE(pp); i++)
        if (find_token(&p, pp[i]) == false)
            return false;

    for (i = 0; 
            i < nLen && 
            CHAR_ISNOT_IN_STR(*p, " \t\r\n") && 
            ('\0' != *p); 
            i++)
        *strValue++ = *p++;

    return true;
}

static bool read_value(const char *fname, const char *strKey, char *strValue, int nLen)
{
    static char buf[1024];
    FILE *fp = fopen(fname, "r");
    bool ret = false;
    
    while (fgets(buf, 1024, fp))
    {
        if (buf[0] == '\0')
            continue;
        
        ret = do_parse(strValue, buf, strKey, nLen);
        buf[0] = '\0';
        if (ret == true)
            break;
    }

    fclose(fp);
    return ret;
}

int main(int argc, char **argv)
{
    char s[100] = "";
    
    if (read_value(argv[1], argv[2], s, 100))
        printf("%s\n", s);

    return 0;
}

读类似

[keyname1] = value1 

    [   keyname2    ]     =               value2 

[keyname3   ] =          value3             


键值对文件的可移植的小模块
供以后备查

你可能感兴趣的:(File,null,token,include,FP,whitespace)