📄 conf.c
字号:
if (strcmp(section,"ENV") == 0) { p=Getenv(name); if (p != NULL) return(p); } } vv.section="default"; vv.name=name; v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv); if (v != NULL) return(v->value); else return(NULL); } else return(Getenv(name)); }static CONF_VALUE *get_section(conf,section)LHASH *conf;char *section; { CONF_VALUE *v,vv; if ((conf == NULL) || (section == NULL)) return(NULL); vv.name=NULL; vv.section=section; v=(CONF_VALUE *)lh_retrieve(conf,(char *)&vv); return(v); }STACK *CONF_get_section(conf,section)LHASH *conf;char *section; { CONF_VALUE *v; v=get_section(conf,section); if (v != NULL) return((STACK *)v->value); else return(NULL); }long CONF_get_number(conf,section,name)LHASH *conf;char *section;char *name; { char *str; long ret=0; str=CONF_get_string(conf,section,name); if (str == NULL) return(0); for (;;) { if (IS_NUMER(*str)) ret=ret*10+(*str -'0'); else return(ret); str++; } }void CONF_free(conf)LHASH *conf; { if (conf == NULL) return; conf->down_load=0; /* evil thing to make sure the 'Free()' * works as expected */ lh_doall_arg(conf,(void (*)())value_free_hash,(char *)conf); /* We now have only 'section' entries in the hash table. * Due to problems with */ lh_doall_arg(conf,(void (*)())value_free_stack,(char *)conf); lh_free(conf); }static void value_free_hash(a,conf)CONF_VALUE *a;LHASH *conf; { if (a->name != NULL) { a=(CONF_VALUE *)lh_delete(conf,(char *)a); } }static void value_free_stack(a,conf)CONF_VALUE *a;LHASH *conf; { CONF_VALUE *vv; STACK *sk; int i; if (a->name != NULL) return; sk=(STACK *)a->value; for (i=sk_num(sk)-1; i>=0; i--) { vv=(CONF_VALUE *)sk_value(sk,i); Free(vv->value); Free(vv->name); Free(vv); } if (sk != NULL) sk_free(sk); Free(a->section); Free(a); }static void clear_comments(p)char *p; { char *to; to=p; for (;;) { if (IS_COMMENT(*p)) { *p='\0'; return; } if (IS_QUOTE(*p)) { p=scan_quote(p); continue; } if (IS_ESC(*p)) { p=scan_esc(p); continue; } if (IS_EOF(*p)) return; else p++; } }static int str_copy(conf,section,pto,from)LHASH *conf;char *section;char **pto,*from; { int q,r,rr=0,to=0,len=0; char *s,*e,*rp,*p,*rrp,*np,*cp,v; BUF_MEM *buf; if ((buf=BUF_MEM_new()) == NULL) return(0); len=strlen(from)+1; if (!BUF_MEM_grow(buf,len)) goto err; for (;;) { if (IS_QUOTE(*from)) { q= *from; from++; while ((*from != '\0') && (*from != q)) { if (*from == '\\') { from++; if (*from == '\0') break; } buf->data[to++]= *(from++); } } else if (*from == '\\') { from++; v= *(from++); if (v == '\0') break; else if (v == 'r') v='\r'; else if (v == 'n') v='\n'; else if (v == 'b') v='\b'; else if (v == 't') v='\t'; buf->data[to++]= v; } else if (*from == '\0') break; else if (*from == '$') { /* try to expand it */ rrp=NULL; s= &(from[1]); if (*s == '{') q='}'; else if (*s == '(') q=')'; else q=0; if (q) s++; cp=section; e=np=s; while (IS_ALPHA_NUMERIC(*e)) e++; if ((e[0] == ':') && (e[1] == ':')) { cp=np; rrp=e; rr= *e; *rrp='\0'; e+=2; np=e; while (IS_ALPHA_NUMERIC(*e)) e++; } r= *e; *e='\0'; rp=e; if (q) { if (r != q) { CONFerr(CONF_F_STR_COPY,CONF_R_NO_CLOSE_BRACE); goto err; } e++; } /* So at this point we have * ns which is the start of the name string which is * '\0' terminated. * cs which is the start of the section string which is * '\0' terminated. * e is the 'next point after'. * r and s are the chars replaced by the '\0' * rp and sp is where 'r' and 's' came from. */ p=CONF_get_string(conf,cp,np); if (rrp != NULL) *rrp=rr; *rp=r; if (p == NULL) { CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE); goto err; } BUF_MEM_grow(buf,(strlen(p)+len-(e-from))); while (*p) buf->data[to++]= *(p++); from=e; } else buf->data[to++]= *(from++); } buf->data[to]='\0'; if (*pto != NULL) Free(*pto); *pto=buf->data; Free(buf); return(1);err: if (buf != NULL) BUF_MEM_free(buf); return(0); }static char *eat_ws(p)char *p; { while (IS_WS(*p) && (!IS_EOF(*p))) p++; return(p); }static char *eat_alpha_numeric(p)char *p; { for (;;) { if (IS_ESC(*p)) { p=scan_esc(p); continue; } if (!IS_ALPHA_NUMERIC_PUNCT(*p)) return(p); p++; } }static unsigned long hash(v)CONF_VALUE *v; { return((lh_strhash(v->section)<<2)^lh_strhash(v->name)); }static int cmp(a,b)CONF_VALUE *a,*b; { int i; if (a->section != b->section) { i=strcmp(a->section,b->section); if (i) return(i); } if ((a->name != NULL) && (b->name != NULL)) { i=strcmp(a->name,b->name); return(i); } else if (a->name == b->name) return(0); else return((a->name == NULL)?-1:1); }static char *scan_quote(p)char *p; { int q= *p; p++; while (!(IS_EOF(*p)) && (*p != q)) { if (IS_ESC(*p)) { p++; if (IS_EOF(*p)) return(p); } p++; } if (*p == q) p++; return(p); }static CONF_VALUE *new_section(conf,section)LHASH *conf;char *section; { STACK *sk=NULL; int ok=0,i; CONF_VALUE *v=NULL,*vv; if ((sk=sk_new_null()) == NULL) goto err; if ((v=(CONF_VALUE *)Malloc(sizeof(CONF_VALUE))) == NULL) goto err; i=strlen(section)+1; if ((v->section=(char *)Malloc(i)) == NULL) goto err; memcpy(v->section,section,i); v->name=NULL; v->value=(char *)sk; vv=(CONF_VALUE *)lh_insert(conf,(char *)v); if (vv != NULL) {#if !defined(NO_STDIO) && !defined(WIN16) fprintf(stderr,"internal fault\n");#endif abort(); } ok=1;err: if (!ok) { if (sk != NULL) sk_free(sk); if (v != NULL) Free(v); v=NULL; } return(v); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -