⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ini.c

📁 一个LINUX下的ini文件解析程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -