|
发表于 2003-8-27 00:26:27
|
显示全部楼层
写了一个模块,一开始没怎么规划,所以看着有点难受,比如函数的名字之类的,文件名也有点太短了。
配置按key=value的形式。
头文件:rc.h
- #ifndef RC_H
- #define RC_H
- int rc_init(const char *filename); /*初始化rc*/
- void rc_destroy(void); /*释放rc*/
- int rc_number(void); /*rc数目*/
- const char *rc_next(void); /*下一个条目*/
- void rc_rewind(void); /*回到开头*/
- const char *rc_getKey(void); /*取得当前的key*/
- const char *rc_getValue(void); /*取得当前的value*/
- const char *rc_getVByKey(const char *key); /*按key搜索value*/
- const char *rc_getKByNum(int index); /*按index取得key*/
- const char *rc_getVByNum(int index); /*anindex取得value*/
- int rc_exist(const char *key); /*测试key是否存在*/
- #endif
复制代码
.c文件:rc.c
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- #include "rc.h"
- static char *(*rc)[2];
- static int number;
- static int current;
- static int test(void);
- static int getrc(FILE *);
- static char *getstring(char *);
- int
- rc_init(const char *filename)
- {
- FILE *fp;
- char err[100];
- if((fp = fopen(filename, "r")) == NULL){
- sprintf(err, "connot open %s", filename);
- perror(err);
- return(-1);
- }
- if(getrc(fp)){
- fclose(fp);
- return(-1);
- }
- fclose(fp);
- return(0);
- }
- void
- rc_destroy(void)
- {
- int i;
- if(!test())
- return;
-
- for(i = 0; i < number; i++){
- free(rc[i][0]);
- free(rc[i][1]);
- }
- free(rc);
- }
- int
- rc_number(void)
- {
- if(!test())
- return(0);
-
- return(number);
- }
- const char *
- rc_next(void)
- {
- if(!test())
- return(0);
-
- if(++current < number)
- return(rc[current][0]);
- return(NULL);
- }
- void
- rc_rewind(void)
- {
- if(!test())
- return;
-
- current = 0;
- }
- const char *
- rc_getKey(void)
- {
- if(!test())
- return(0);
-
- return(rc[current][0]);
- }
- const char *
- rc_getValue(void)
- {
- if(!test())
- return(0);
-
- return(rc[current][1]);
- }
- const char *
- rc_getVByKey(const char *key)
- {
- int i;
- if(!test())
- return(0);
-
- for(i = 0; i < number; i++)
- if(!strcasecmp(key, rc[i][0]))
- return(rc[i][1]);
- return(NULL);
- }
- const char *
- rc_getKByNum(int index)
- {
- if(!test())
- return(0);
-
- return(rc[index][0]);
- }
- const char *
- rc_getVByNum(int index)
- {
- if(!test())
- return(0);
-
- return(rc[index][1]);
- }
- int
- rc_exist(const char *key)
- {
- int i;
- if(!test())
- return(0);
-
- for(i = 0; i < number; i++)
- if(!strcasecmp(key, rc[i][0]))
- return(1);
- return(0);
- }
- int
- getrc(FILE *fp)
- {
- char s[1024], *p, *t;
-
- while(fgets(s, 1023, fp)){
- if((p = strchr(s, '#')) != NULL)
- *p = '\0';
- t = s + strspn(s, " \t\n");
- if(*t == '\0')
- continue;
- if((p = strchr(t, '=')) != NULL)
- *p = '\0';
- if((t = getstring(t)) == NULL)
- continue;
- rc = (char *(*)[2])realloc(rc, (number + 1) * sizeof(char *[2]));
- rc[number][0] = (char *)malloc(strlen(t) + 1);
- strcpy(rc[number][0], t);
- if(p && (t = getstring(p + 1))){
- rc[number][1] = (char *)malloc(strlen(t) + 1);
- strcpy(rc[number][1], t);
- }else
- rc[number][1] = NULL;
- number++;
- }
- if(ferror(fp))
- return(-1);
- return(0);
- }
- int
- test(void)
- {
- if(number == 0 || rc == NULL)
- return(0);
- return(1);
- }
- char *
- getstring(char *s)
- {
- char *result, *t;
- int n;
- result = s + strspn(s, " \t\n");
- if(*result == '\0')
- return(NULL);
- s = result;
- while(*s){
- s = s + strcspn(s, " \t\n");
- t = s;
- s = s + strspn(s, " \t\n");
- }
- *t = '\0';
- return(result);
- }
复制代码 |
|