c语言.cfg文件转化为java.cfg_通用C语言函数:操作cfg/ini类型配置文件

#if __OS400__

#include "GCFTXTFH"

#else

#include "GCFTXTF.H"

#endif

struct txt_line_flds txt_line_fld[MAX_TXT_LINE_FLD];

char CFG_ssl = ’[’, CFG_ssr = ’]’;

int CFG_section_line_no, CFG_key_line_no, CFG_key_lines;

int fgetline(FILE *fp, USGC *buffer, int maxlen)

{

#if __OS400__

int i;

memset(buffer, 0x00, maxlen);

if(fgets(buffer, maxlen, fp) == NULL)

{

i = strlen(buffer);

if(feof(fp) != 0)

{

if(i == 0) return -1;

}

else return -2;

}

i = strlen(buffer);

if(i > 0 && buffer[i-1] == ’\n’)

buffer[--i] = ’\0’;

return i;

#else

int i, j;

USGC ch1;

for(i = 0, j = 0; i < maxlen; j++)

{

if(fread(&ch1, sizeof(USGC), 1, fp) != 1)

{

if(feof(fp) != 0)

{

if(j == 0) return -1;

else break;

}

if(ferror(fp) != 0) return -2;

return -2;

}

else

{

if(ch1 == ’\n’ || ch1 == 0x00) break;

if(ch1 == ’\f’ || ch1 == 0x1A)

{

buffer[i++] = ch1;

break;

}

if(ch1 != ’\r’) buffer[i++] = ch1;

}

}

buffer[i] = ’\0’;

return i;

#endif

}

int copy_txt_file(void *source_file, void *dest_file)

{

FILE *fp1, *fp2;

USGC buf[1024+1];

int rc;

if((fp1 = fopen((char *)source_file, "r")) == NULL)

return COPYF_ERR_OPEN_FILE;

rc = COPYF_ERR_CREATE_FILE;

#if __OS400__

if((fp2 = fopen((char *)dest_file, "w, lrecl=92, ccsid=935")) == NULL)

goto copy_end;

#else

if((fp2 = fopen((char *)dest_file, "w")) == NULL) goto copy_end;

#endif

while(1)

{

rc = COPYF_ERR_READ_FILE;

memset(buf, 0x00, 1024+1);

if(fgets((char *)buf, 1024, fp1) == NULL)

{

if(mstrlen(buf) == 0)

{

if(ferror(fp1) != 0) goto copy_end;

break;

}

}

rc = COPYF_ERR_WRITE_FILE;

if(fputs((char *)buf, fp2) == EOF) goto copy_end;

}

rc = COPYF_OK;

copy_end:

if(fp2 != NULL) fclose(fp2);

if(fp1 != NULL) fclose(fp1);

return rc;

}

int split_txt_line_fld(char *txt_line, char *sep_chars)

{

int i, j, k, n, stat = 0, quote_stat = 0;

char quote;

n = strlen(txt_line);

for(i = 0, j = 0, k = 0; i <= n; i++)

{

if(i >= n ||

(strchr(sep_chars, txt_line[i]) != NULL && quote_stat == 0))

{

if(stat == 0) continue;

stat = 0;

txt_line_fld[k].fldsp = j;

txt_line_fld[k].fldlen = i - j;

k++;

}

else

{

if(txt_line[i] == ’\’’ || txt_line[i] == ’\"’)

{

if(quote_stat == 0)

{

quote = txt_line[i];

quote_stat = 1;

}

else

{

if(txt_line[i] == quote)

quote_stat = 0;

}

}

if(stat == 1) continue;

stat = 1;

j = i;

}

}

return k;

}

char *get_txt_line_fld(char *txt_line, int fldno, char *buf)

{

memmove(buf, txt_line + txt_line_fld[fldno].fldsp,

txt_line_fld[fldno].fldlen);

buf[txt_line_fld[fldno].fldlen] = ’\0’;

return buf;

}

int split_key_val(USGC *buf, USGC **key, USGC **val)

{

int i, k1, k2, n;

if((n = strlen((char *)buf)) < 1) return 0;

for(i = 0; i < n; i++)

if(buf[i] != ’ ’ && buf[i] != ’\t’) break;

if(i >= n) return 0;

if(buf[i] == ’=’) return -1;

k1 = i;

for(i++; i < n; i++)

if(buf[i] == ’=’) break;

if(i >= n) return -2;

k2 = i;

for(i++; i < n; i++)

if(buf[i] != ’ ’ && buf[i] != ’\t’) break;

buf[k2] = ’\0’;

*key = buf + k1;

*val = buf + i;

return 1;

}

int CFG_get_key(void *CFG_file, void *section, void *key, void *buf)

{

FILE *fp;

USGC buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];

USGC *key_ptr, *val_ptr;

int line_no, n, rc;

line_no = 0;

CFG_section_line_no = 0;

CFG_key_line_no = 0;

CFG_key_lines = 0;

#if __OS400__

if((fp = fopen((char *)CFG_file, "r")) == NULL) return CFG_ERR_OPEN_FILE;

#else

if((fp = fopen((char *)CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;

#endif

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf1, MAX_CFG_BUF);

if(n < -1) goto r_cfg_end;

rc = CFG_SECTION_NOT_FOUND;

if(n < 0) goto r_cfg_end;

line_no++;

n = mstrlen(ltrimstr(rtrimstr(buf1)));

if(n == 0 || buf1[0] == ’;’) continue;

rc = CFG_ERR_FILE_FORMAT;

if(n > 2 && ((buf1[0] == ’[’ && buf1[n-1] != ’]’) ||

(buf1[0] == ’{’ && buf1[n-1] != ’}’)))

goto r_cfg_end;

if(buf1[0] == ’[’ || buf1[0] == ’{’)

{

buf1[n-1] = 0x00;

if(mstrcmp(buf1+1, section) == 0)

break;

}

}

CFG_section_line_no = line_no;

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf1, MAX_CFG_BUF);

if(n < -1) goto r_cfg_end;

rc = CFG_KEY_NOT_FOUND;

if(n < 0) goto r_cfg_end;

line_no++;

CFG_key_line_no = line_no;

CFG_key_lines = 1;

n = mstrlen(ltrimstr(rtrimstr(buf1)));

if(n == 0 || buf1[0] == ’;’) continue;

rc = CFG_KEY_NOT_FOUND;

if(buf1[0] == ’[’ || buf1[0] == ’{’) goto r_cfg_end;

if(buf1[n-1] == ’+’)

{

buf1[n-1] = 0x00;

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf2, MAX_CFG_BUF);

if(n < -1) goto r_cfg_end;

if(n < 0) break;

line_no++;

CFG_key_lines++;

n = mstrlen(rtrimstr(buf2));

rc = CFG_ERR_EXCEED_BUF_SIZE;

if(n > 0 && buf2[n-1] == ’+’)

{

buf2[n-1] = 0x00;

if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF)

goto r_cfg_end;

mstrcat(buf1, buf2);

continue;

}

if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF)

goto r_cfg_end;

mstrcat(buf1, buf2);

break;

}

}

rc = CFG_ERR_FILE_FORMAT;

if(split_key_val(buf1, &key_ptr, &val_ptr) != 1)

goto r_cfg_end;

ltrimstr(rtrimstr(key_ptr));

if(mstrcmp(key_ptr, key) != 0)

continue;

mstrcpy(buf, val_ptr);

break;

}

rc = CFG_OK;

r_cfg_end:

if(fp != NULL) fclose(fp);

return rc;

}

int CFG_set_key(void *CFG_file, void *section, void *key, void *buf)

{

FILE *fp1, *fp2;

USGC buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];

int line_no, line_no1, n, rc, rc2;

char *tmpfname;

rc = CFG_get_key(CFG_file, section, key, buf1);

if(rc <= CFG_ERR && rc != CFG_ERR_OPEN_FILE) return rc;

if(rc == CFG_ERR_OPEN_FILE || rc == CFG_SECTION_NOT_FOUND)

{

#if __OS400__

if((fp1 = fopen((char *)CFG_file, "a, lrecl=92, ccsid=935")) == NULL)

#else

if((fp1 = fopen((char *)CFG_file, "a")) == NULL)

#endif

return CFG_ERR_CREATE_FILE;

#if __OS400__

CFG_ssl = ’{’;

CFG_ssr = ’}’;

#else

CFG_ssl = ’[’;

CFG_ssr = ’]’;

#endif

if(fprintf(fp1, "%c%s%c\n", CFG_ssl, section, CFG_ssr) == EOF)

{

fclose(fp1);

return CFG_ERR_WRITE_FILE;

}

if(fprintf(fp1, "%s=%s\n", key, buf) == EOF)

{

fclose(fp1);

return CFG_ERR_WRITE_FILE;

}

fclose(fp1);

return CFG_OK;

}

if((tmpfname = tmpnam(NULL)) == NULL)

return CFG_ERR_CREATE_FILE;

#if __OS400__

if((fp2 = fopen(tmpfname, "w, lrecl=92, ccsid=935")) == NULL)

#else

if((fp2 = fopen(tmpfname, "w")) == NULL)

#endif

return CFG_ERR_CREATE_FILE;

rc2 = CFG_ERR_OPEN_FILE;

#if __OS400__

if((fp1 = fopen((char *)CFG_file, "r")) == NULL) goto w_cfg_end;

#else

if((fp1 = fopen((char *)CFG_file, "rb")) == NULL) goto w_cfg_end;

#endif

if(rc == CFG_KEY_NOT_FOUND)

line_no1 = CFG_section_line_no;

else

line_no1 = CFG_key_line_no - 1;

for(line_no = 0; line_no < line_no1; line_no++)

{

rc2 = CFG_ERR_READ_FILE;

n = fgetline(fp1, buf1, MAX_CFG_BUF);

if(n < 0) goto w_cfg_end;

rc2 = CFG_ERR_WRITE_FILE;

if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end;

}

if(rc != CFG_KEY_NOT_FOUND)

for( ; line_no < line_no1+CFG_key_lines; line_no++)

{

rc2 = CFG_ERR_READ_FILE;

n = fgetline(fp1, buf1, MAX_CFG_BUF);

if(n < 0) goto w_cfg_end;

}

rc2 = CFG_ERR_WRITE_FILE;

if(fprintf(fp2, "%s=%s\n", key, buf) == EOF) goto w_cfg_end;

while(1)

{

rc2 = CFG_ERR_READ_FILE;

n = fgetline(fp1, buf1, MAX_CFG_BUF);

if(n < -1) goto w_cfg_end;

if(n < 0) break;

rc2 = CFG_ERR_WRITE_FILE;

if(fprintf(fp2, "%s\n", buf1) == EOF) goto w_cfg_end;

}

rc2 = CFG_OK;

w_cfg_end:

if(fp1 != NULL) fclose(fp1);

if(fp2 != NULL) fclose(fp2);

if(rc2 == CFG_OK)

{

rc = copy_txt_file(tmpfname, CFG_file);

if(rc != 0) return CFG_ERR_CREATE_FILE;

}

remove(tmpfname);

return rc2;

}

int CFG_get_sections(void *CFG_file, USGC *sections[])

{

FILE *fp;

USGC buf1[MAX_CFG_BUF + 1];

int n, n_sections = 0, rc;

#if __OS400__

if((fp = fopen(CFG_file, "r")) == NULL) return CFG_ERR_OPEN_FILE;

#else

if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;

#endif

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf1, MAX_CFG_BUF);

if(n < -1) goto cfg_scts_end;

if(n < 0) break;

n = mstrlen(ltrimstr(rtrimstr(buf1)));

if(n == 0 || buf1[0] == ’;’) continue;

rc = CFG_ERR_FILE_FORMAT;

if(n > 2 && ((buf1[0] == ’[’ && buf1[n-1] != ’]’) ||

(buf1[0] == ’{’ && buf1[n-1] != ’}’)))

goto cfg_scts_end;

if(buf1[0] == ’[’ || buf1[0] == ’{’)

{

buf1[n-1] = 0x00;

mstrcpy(sections[n_sections], buf1+1);

n_sections++;

}

}

rc = n_sections;

cfg_scts_end:

if(fp != NULL) fclose(fp);

return rc;

}

int CFG_get_keys(void *CFG_file, void *section, USGC *keys[])

{

FILE *fp;

USGC buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];

USGC *key_ptr, *val_ptr;

int n, n_keys = 0, rc;

#if __OS400__

if((fp = fopen(CFG_file, "r")) == NULL) return CFG_ERR_OPEN_FILE;

#else

if((fp = fopen(CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;

#endif

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf1, MAX_CFG_BUF);

if(n < -1) goto cfg_keys_end;

rc = CFG_SECTION_NOT_FOUND;

if(n < 0) goto cfg_keys_end;

n = mstrlen(ltrimstr(rtrimstr(buf1)));

if(n == 0 || buf1[0] == ’;’) continue;

rc = CFG_ERR_FILE_FORMAT;

if(n > 2 && ((buf1[0] == ’[’ && buf1[n-1] != ’]’) ||

(buf1[0] == ’{’ && buf1[n-1] != ’}’)))

goto cfg_keys_end;

if(buf1[0] == ’[’ || buf1[0] == ’{’)

{

buf1[n-1] = 0x00;

if(mstrcmp(buf1+1, section) == 0)

break;

}

}

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf1, MAX_CFG_BUF);

if(n < -1) goto cfg_keys_end;

if(n < 0) break;

n = mstrlen(ltrimstr(rtrimstr(buf1)));

if(n == 0 || buf1[0] == ’;’) continue;

rc = CFG_KEY_NOT_FOUND;

if(buf1[0] == ’[’ || buf1[0] == ’{’)

break;

if(buf1[n-1] == ’+’)

{

buf1[n-1] = 0x00;

while(1)

{

rc = CFG_ERR_READ_FILE;

n = fgetline(fp, buf2, MAX_CFG_BUF);

if(n < -1) goto cfg_keys_end;

if(n < 0) break;

n = mstrlen(rtrimstr(buf2));

rc = CFG_ERR_EXCEED_BUF_SIZE;

if(n > 0 && buf2[n-1] == ’+’)

{

buf2[n-1] = 0x00;

if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF)

goto cfg_keys_end;

mstrcat(buf1, buf2);

continue;

}

if(mstrlen(buf1) + mstrlen(buf2) > MAX_CFG_BUF)

goto cfg_keys_end;

mstrcat(buf1, buf2);

break;

}

}

rc = CFG_ERR_FILE_FORMAT;

if(split_key_val(buf1, &key_ptr, &val_ptr) != 1)

goto cfg_keys_end;

ltrimstr(rtrimstr(key_ptr));

mstrcpy(keys[n_keys], key_ptr);

n_keys++;

}

rc = n_keys;

cfg_keys_end:

if(fp != NULL) fclose(fp);

return rc;

}

int read_txt_line(void *TXT_file, int line_no, void *buf)

{

FILE *fp;

int lno, n1;

USGC buf1[256];

if((fp = fopen((char *)TXT_file, "r")) == NULL) return TXTF_ERR_OPEN_FILE;

for(lno = 0; lno < line_no; lno++)

{

memset(buf1, 0x00, 256);

if(fgets((char *)buf1, 255, fp) == NULL)

{

n1 = mstrlen(buf1);

if(n1 == 0)

{

if(ferror(fp) != 0)

{

fclose(fp);

return TXTF_ERR_READ_FILE;

}

break;

}

break;

}

}

if(lno < line_no)

{

fclose(fp);

return TXTF_ERR_NOT_FOUND;

}

n1 = mstrlen(buf1);

if(n1 > 0 && buf1[n1-1] == ’\n’) buf1[--n1] = 0x00;

mstrcpy(buf, buf1);

fclose(fp);

return n1;

}

int seek_txt_line(void *TXT_file, void *line_tag, void *buf)

{

FILE *fp;

int line_no, n, n1;

USGC buf1[256];

n = mstrlen(line_tag);

if((fp = fopen((char *)TXT_file, "r

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值