/************************************************************* Function: 获得所有section Input: char *filename 文件,int max 最大可返回的section的个数 Output: char *sections[] 存放section名字 Return: 返回section个数。若出错,返回负数。 -10 文件打开出错 -12 文件读取错误 -14 文件格式错误 Note: *************************************************************/ int ini_get_sections(char *filedata, unsigned char * sections[], int max) { //FILE *fp; char buf1[MAX_CFG_BUF + 1]; int n, n_sections = 0, ret; int dataoff = 0; int i = 0; // if((fp = fopen(filename, "rb")) == NULL) // return CFG_ERR_OPEN_FILE; while(i<5) {/*搜找项section */ ret = CFG_ERR_READ_FILE; n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); dataoff += n; if(n < -1) goto cfg_scts_end; if(n < 0) break;/* 文件尾 */ n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); if(n == 0 || buf1[0] == CFG_NTS) continue; /* 空行 或 注释行 */ ret = CFG_ERR_FILE_FORMAT; if(n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) goto cfg_scts_end; if(buf1[0] == CFG_SSL) { if (max!=0){ buf1[n-1] = 0x00; strcpy((char *)sections[n_sections], buf1+1); if (n_sections>=max) break; /* 超过可返回最大个数 */ } n_sections++; } i++; } ret = n_sections; cfg_scts_end: // if(fp != NULL) // fclose(fp); return ret; }
/************************************************************* Function: Read all the parameters and values to the structure. Return: Returns the number of key. If you go wrong, return a negative number. -10 File open failed -12 File read failed -14 File format error Note: *************************************************************/ int ini_get_key_data(char *filedata) { //FILE *fp; char buf1[MAX_CFG_BUF + 1]= {0}; int n=0; int ret=0; //n_sections = 0, int dataoff = 0; int iEqualSign = 0; int i = 0; char tmpSectionName[MAX_CFG_BUF + 1]= {0}; // if((fp = fopen(filename, "rb")) == NULL) // return CFG_ERR_OPEN_FILE; FTS_TEST_FUNC_ENTER(); ret = init_key_data();/*init*/ if (ret < 0) { return -1; } g_used_key_num = 0; while (1) /*find section */ { ret = CFG_ERR_READ_FILE; n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); if (n < -1) goto cfg_scts_end; if (n < 0) break;/* file end */ if (n >= MAX_CFG_BUF) { FTS_TEST_DBG("Error Length:%d\n", n); goto cfg_scts_end; } dataoff += n; n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); if (n == 0 || buf1[0] == CFG_NTS) continue; /* A blank line or a comment line */ ret = CFG_ERR_FILE_FORMAT; //get section name if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) { FTS_TEST_DBG("Bad Section:%s\n", buf1); goto cfg_scts_end;//bad section } if (buf1[0] == CFG_SSL) { g_st_ini_file_data[g_used_key_num].iSectionNameLen = n-2; if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iSectionNameLen) { ret = CFG_ERR_OUT_OF_LEN; FTS_TEST_DBG("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); goto cfg_scts_end; } buf1[n-1] = 0x00; strcpy((char *)tmpSectionName, buf1+1); //FTS_TEST_DBG("Section Name:%s, Len:%d\n", tmpSectionName, n-2); continue; } //get section name end strcpy( g_st_ini_file_data[g_used_key_num].pSectionName, tmpSectionName); g_st_ini_file_data[g_used_key_num].iSectionNameLen = strlen(tmpSectionName); iEqualSign = 0; for (i=0; i < n; i++) { if (buf1[i] == CFG_EQS ) { iEqualSign = i; break; } } if (0 == iEqualSign) continue; /* before equal sign is assigned to the key name*/ g_st_ini_file_data[g_used_key_num].iKeyNameLen = iEqualSign; if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iKeyNameLen) { ret = CFG_ERR_OUT_OF_LEN; FTS_TEST_DBG("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); goto cfg_scts_end; } memcpy(g_st_ini_file_data[g_used_key_num].pKeyName, buf1, g_st_ini_file_data[g_used_key_num].iKeyNameLen); /* After equal sign is assigned to the key value*/ g_st_ini_file_data[g_used_key_num].iKeyValueLen = n-iEqualSign-1; if (MAX_KEY_VALUE_LEN < g_st_ini_file_data[g_used_key_num].iKeyValueLen) { ret = CFG_ERR_OUT_OF_LEN; FTS_TEST_DBG("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); goto cfg_scts_end; } memcpy(g_st_ini_file_data[g_used_key_num].pKeyValue, buf1+ iEqualSign+1, g_st_ini_file_data[g_used_key_num].iKeyValueLen); ret = g_used_key_num; g_used_key_num++; /*Parameter number accumulation*/ if (MAX_KEY_NUM < g_used_key_num) { ret = CFG_ERR_TOO_MANY_KEY_NUM; FTS_TEST_DBG("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); goto cfg_scts_end; } } //ret = n_sections; //print_key_data(); FTS_TEST_FUNC_EXIT(); return 0; cfg_scts_end: FTS_TEST_FUNC_EXIT(); return ret; }
/************************************************************* Function: 获得key的值 Input: char * filedata 文件;char * section 项值;char * key 键值 Output: char * value key的值 Return: 0 SUCCESS -1 未找到section -2 未找到key -10 文件打开失败 -12 读取文件失败 -14 文件格式错误 -22 超出缓冲区大小 Note: *************************************************************/ int ini_get_key(char *filedata, char * section, char * key, char * value) { char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1]; char *key_ptr, *val_ptr; int n, ret; int dataoff = 0; int i = 0; *value='\0'; while(i<5) { /* 搜找项section */ ret = CFG_ERR_READ_FILE; n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); dataoff += n; if(n < -1) goto r_cfg_end; ret = CFG_SECTION_NOT_FOUND; if(n < 0) goto r_cfg_end; /* 文件尾,未发现 */ n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); if(n == 0 || buf1[0] == CFG_NTS) continue; /* 空行 或 注释行 */ ret = CFG_ERR_FILE_FORMAT; if(n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) goto r_cfg_end; if(buf1[0] == CFG_SSL) { buf1[n-1] = 0x00; if(strcmp(buf1+1, section) == 0) break; /* 找到项section */ } i++; } i = 0; while(1){ /* 搜找key */ ret = CFG_ERR_READ_FILE; n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); dataoff += n; if(n < -1) goto r_cfg_end; ret = CFG_KEY_NOT_FOUND; if(n < 0) goto r_cfg_end;/* 文件尾,未发现key */ n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); if(n == 0 || buf1[0] == CFG_NTS) continue; /* 空行 或 注释行 */ ret = CFG_KEY_NOT_FOUND; if(buf1[0] == CFG_SSL) goto r_cfg_end; if(buf1[n-1] == '+') { /* 遇+号表示下一行继续 */ buf1[n-1] = 0x00; while(1) { ret = CFG_ERR_READ_FILE; n = ini_file_get_line(filedata+dataoff, buf2, MAX_CFG_BUF); dataoff += n; if(n < -1) goto r_cfg_end; if(n < 0) break;/* 文件结束 */ n = strlen(ini_str_trim_r(buf2)); ret = CFG_ERR_EXCEED_BUF_SIZE; if(n > 0 && buf2[n-1] == '+'){/* 遇+号表示下一行继续 */ buf2[n-1] = 0x00; if( (strlen(buf1) + strlen(buf2)) > MAX_CFG_BUF) goto r_cfg_end; strcat(buf1, buf2); continue; } if(strlen(buf1) + strlen(buf2) > MAX_CFG_BUF) goto r_cfg_end; strcat(buf1, buf2); break; } } ret = CFG_ERR_FILE_FORMAT; if(ini_split_key_value(buf1, &key_ptr, &val_ptr) != 1) goto r_cfg_end; ini_str_trim_l(ini_str_trim_r(key_ptr)); if(strcmp(key_ptr, key) != 0) continue; /* 和key值不匹配 */ strcpy(value, val_ptr); break; } ret = CFG_OK; r_cfg_end: //if(fp != NULL) fclose(fp); return ret; }