📄 ini.c
字号:
if (i < len) {
strncpy(tmp,buf,len-i);
}
strncpy(buf,tmp,len);
free(tmp);
return buf;
}
/*************************************************************
Function: 从文件中读取一行
Input: FILE *fp 文件句柄;s32 maxlen 缓冲区最大长度
Output: s8 *buffer 一行字符串
Return: >0 实际读的长度
-1 文件结束
-2 读文件出错
Note:
*************************************************************/
static s32 ini_file_get_line(FILE *fp, s8 *buffer, s32 maxlen)
{
s32 i, j;
s8 ch1;
for(i=0, j=0; i<maxlen; j++) {
if(fread(&ch1, sizeof(s8), 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) { /* '\f':换页符也算有效字符 */
buffer[i++] = ch1;
break;
}
if(ch1 != '\r') buffer[i++] = ch1; /* 忽略回车符 */
}
}
buffer[i] = '\0';
return i;
}
/*************************************************************
Function: 分离key和value
key=val
jack = liaoyuewang
| | |
k1 k2 i
Input: s8 *buf
Output: s8 **key, s8 **val
Return: 1 --- ok
0 --- blank line
-1 --- no key, "= val"
-2 --- only key, no '='
Note:
*************************************************************/
static s32 ini_split_key_value(s8 *buf, s8 **key, s8 **val){
s32 i, k1, k2, n;
if((n = strlen((s8 *)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;
}
/*************************************************************
Function: 文件拷贝
Input: s8 *source_file 源文件 s8 *dest_file 目标文件
Output:
Return: 0 -- OK,非0--失败
-10 文件打开失败
-11 创建文件失败
-12 拷贝文件失败
-13 写文件失败
Note:
*************************************************************/
static s32 ini_file_copy(FILE *source_fp, s8 *dest_file)
{
FILE *fp1, *fp2;
s8 buf[1024+1];
s32 ret;
if(source_fp==NULL)
return COPYF_ERR_OPEN_FILE;
rewind(source_fp); fp1=source_fp;
ret = COPYF_ERR_CREATE_FILE;
if((fp2 = fopen((s8 *)dest_file, "w")) == NULL)
goto COPY_END;
while(1) {
ret = COPYF_ERR_READ_FILE;
memset(buf, 0x00, 1024+1);
if(fgets((s8 *)buf, 1024, fp1) == NULL) {
if(strlen(buf) == 0) {
if(ferror(fp1) != 0)
goto COPY_END;
break; /* 文件尾 */
}
}
ret = COPYF_ERR_WRITE_FILE;
if(fputs((s8 *)buf, fp2) == EOF)
goto COPY_END;
}
ret = COPYF_OK;
COPY_END:
if(fp2 != NULL)
fclose(fp2);
// if(fp1 != NULL)
// fclose(fp1);
return ret;
}
/*************************************************************
Function: 查找key
Input: s8 * filename 文件;s8 * section 项值;s8 * key 键值
Output: struct ini_key_location *location key所在位置
Return: 0 SUCCESS
-1 未找到section
-2 未找到key
-10 文件打开失败
-12 读取文件失败
-14 文件格式错误
-22 超出缓冲区大小
Note:
*************************************************************/
static s32 ini_find_key(s8 *filename, s8 * section, s8 * key, struct ini_key_location *location)
{
FILE *fp;
s8 buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];
s8 *key_ptr, *val_ptr;
s32 line_no, n, ret;
line_no = 0;
location->ini_section_line_no = 0;
location->ini_key_line_no = 0;
location->ini_key_lines = 0;
if((fp = fopen(filename, "rb")) == NULL)
return CFG_ERR_OPEN_FILE;
while(1) { /* 搜找项section */
ret = CFG_ERR_READ_FILE;
n = ini_file_get_line(fp, buf1, MAX_CFG_BUF);
if(n < -1)
goto r_cfg_end;
ret = CFG_SECTION_NOT_FOUND;
if(n < 0)
goto r_cfg_end; /* 文件尾,未发现 */
line_no++;
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 */
}
}
location->ini_section_line_no = line_no;
while(1){ /* 搜找key */
ret = CFG_ERR_READ_FILE;
n = ini_file_get_line(fp, buf1, MAX_CFG_BUF);
if(n < -1)
goto r_cfg_end;
ret = CFG_KEY_NOT_FOUND;
if(n < 0)
goto r_cfg_end;/* 文件尾,未发现key */
line_no++;
location->ini_key_line_no = line_no;
location->ini_key_lines = 1;
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(fp, buf2, MAX_CFG_BUF);
if(n < -1)
goto r_cfg_end;
if(n < 0)
break;/* 文件结束 */
line_no++;
location->ini_key_lines++;
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值不匹配 */
break;
}
ret = CFG_OK;
r_cfg_end:
if(fp != NULL) fclose(fp);
return ret;
}
/*************************************************************
Function: 分离section为name和index
[section]
/ \
name:index
jack : 12
| | |
k1 k2 i
Input: s8 *section
Output: s8 **name, s8 **index
Return: 0 --- ok
-1 --- blank line
-2 --- no name, ":index"
-3 --- only name, no ':'
Note:
*************************************************************/
s32 ini_split_section(s8 *section, s8 **name, s8 **index)
{
s32 i, k1, k2, n;
if( (n=strlen(section)) < 1 )
return -1;
for(i=0; i<n; i++)
if(section[i] != ' ' && section[i] != '\t')
break;
if(i >= n)
return -1;
if(section[i] == CFG_NIS)
return -2;
k1 = i;
for(i++; i<n; i++)
if(section[i] == CFG_NIS)
break;
if(i >= n)
return -3;
k2 = i;
for(i++; i < n; i++)
if(section[i] != ' ' && section[i] != '\t')
break;
section[k2] = '\0';
*name = section + k1;
*index = section + i;
return 0;
}
/*************************************************************
Function: 合成name和index为section
jack : 12
name : index
\ /
[section]
Input: s8 *name, s8 *index
Output: s8 **section
Return: 0 --- ok
-1 --- error
Note:
*************************************************************/
s32 ini_join_section(s8 **section, s8 *name, s8 *index)
{
s32 n1,n2;
if((n1 = strlen((s8 *)name)) < 1)
return -1;
if((n2 = strlen((s8 *)index)) < 1)
return -1;
strcat(*section,name);
strcat(*section+n1,":");
strcat(*section+n1+1,index);
*(*section+n1+1+n2) = '\0';
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -