📄 inioper.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "inioper.h"
#include "file_config.h"
#include "main.h"
#include <math.h>
char CFG_ssl = '[', CFG_ssr = ']'; /* 项标志符Section Symbol --可根据特殊需要进行定义更改,如 { }等*/
char CFG_nis = ':'; /*name 与 index 之间的分隔符 */
char CFG_nts = '#'; /*注释符*/
int CFG_section_line_no, CFG_key_line_no, CFG_key_lines;
_SITE_CONF g_site_conf; //当前系统配置对象
_SITE_CONF_EXTEND g_site_conf_extend; //当前系统配置对象
unsigned int cfghandle; //配置文件句柄
unsigned char cfgfilebuffer[MAX_CFG_BUF]; //每次从文件中读到的数据的缓冲区长度
int cfgfilebufpage;//读的页码
long cfgfilelen ; //配置文件的长度
/*********************************************************************
* 版权所有 (C)2009, 江门市伟创科技开发有限公司。
*
* 文件名称: INIoper.C
* 文件标识:
* 其它说明: INI文件的操作
* 当前版本: V1.0
* 作 者: lhh
* 完成日期:
*
* 修改记录1:
* 修改日期:2009年2月3日
* 版 本 号:V1.0
* 修 改 人:lhh
* 修改内容:创建
**********************************************************************/
void testfun(void)
{
int len,i;
// FILE *fp;
// char *tmp = NULL;
len = strlen("plugin.ini");
//tmp = (char*)malloc(len);
/*if((fp = fopen(tmp, "r")) == NULL)
{
printf("%s",tmp);
}*/
}
/**********************************************************************
* 函数名称: strtrimr
* 功能描述: 去除字符串右边的空字符
* 访问的表: 无
* 修改的表: 无
* 输入参数: char * buf 字符串指针
* 输出参数: 无
* 返 回 值: 字符串指针
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
*
*
***********************************************************************/
char * strtrimr(char * buf)
{
int len,i;
char tmp[MAX_CFG_BUF];
len = strlen(buf);
for(i = 0;i < len;i++)
{
if (buf[i] !=' ')
break;
}
if (i < len) {
strncpy(tmp,(buf+i),(len-i));
}
strncpy(buf,tmp,len);
return buf;
}
/**********************************************************************
* 函数名称: strtriml
* 功能描述: 去除字符串左边的空字符
* 访问的表: 无
* 修改的表: 无
* 输入参数: char * buf 字符串指针
* 输出参数: 无
* 返 回 值: 字符串指针
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
*
***********************************************************************/
char * strtriml(char * buf)
{
int len,i;
char tmp[MAX_CFG_BUF];
len = strlen(buf);
for(i = 0;i < len;i++)
{
if (buf[len-i-1] !=' ')
break;
}
if (i < len) {
strncpy(tmp,buf,len-i);
}
strncpy(buf,tmp,len);
return buf;
}
/**********************************************************************
* 函数名称: FileGetLine
* 功能描述: 从文件中读取一行
* 访问的表: 无
* 修改的表: 无
* 输入参数: unsigned int fhandle 文件句柄;long curpos 当前位置,int maxlen 缓冲区最大长度
* 输出参数: char *buffer 一行字符串
* 返 回 值: 实际读的长度 -1文件结束 -2是读出错
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
*
***********************************************************************/
int FileGetLine(unsigned int fhandle, long curpos, char *buffer, int maxlen)
{
int i, j;
char ch1;
for(i = 0, j = 0; i < maxlen; j++)
{
if(curpos == cfgfilelen)
{
return -1;
}
else
{
__setfpos(cfghandle, curpos);
__read(cfghandle, &ch1, 1);
if(ch1 == '\n' || ch1 == 0x00) break; /* 换行 */
if(ch1 == '\f' || ch1 == 0x1A) /* '\f':换页符也算有效字符 */
{
buffer[i++] = ch1;
break;
}
if(ch1 != '\r') buffer[i++] = ch1; /* 忽略回车符 */
}
curpos++;
}
buffer[i] = '\0';
return i;
}
/**********************************************************************
* 函数名称: SplitKeyValue
* 功能描述: 分离key和value
* key=val
* jack = liaoyuewang
* | | |
* k1 k2 i
* 访问的表: 无
* 修改的表: 无
* 输入参数: char *buf
* 输出参数: char **key;char **val
* 返 回 值: 1 --- ok
* 0 --- blank line
* -1 --- no key, "= val"
* -2 --- only key, no '='
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
*
***********************************************************************/
int SplitKeyValue(char *buf, char **key, char **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;
}
unsigned int getcsvlen(unsigned char *buf)
{
unsigned int i;
for (i = 0; i < MAX_CFG_BUF; i++)
{
if (buf[i] == ';')
return i + 1;
}
}
unsigned int getcsvlendot(unsigned char *buf)
{
unsigned int i;
for (i = 0; i < MAX_CFG_BUF; i++)
{
if (buf[i] == ',')
return i + 1;
}
}
/**********************************************************************
* 函数名称: ConfigGetKey
* 功能描述: 获得key的值
* 访问的表: 无
* 修改的表: 无
* 输入参数: unsigned fhandle 文件;void *section 项值;void *key 键值
* 输出参数: void *buf key的值
* 返 回 值: 0 --- ok 非0 --- error
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* -----------------------------------------------
* 2009/2/3 V1.0 李汉汉 创建
*
***********************************************************************/
int ConfigGetKey(unsigned fhandle, void *section, void *key, void *buf)
{
char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];
char *key_ptr, *val_ptr;
int line_no, n, ret;
int curpos = 0; //当前位置
line_no = 0;
CFG_section_line_no = 0;
CFG_key_line_no = 0;
CFG_key_lines = 0;
while(1) /* 搜找项section */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fhandle, curpos, buf1, MAX_CFG_BUF);
curpos += n + 2;
if(n < -1) goto r_cfg_end;
ret = CFG_SECTION_NOT_FOUND;
if(n < 0) goto r_cfg_end; /* 文件尾,未发现 */
line_no++;
n = strlen(strtriml(strtrimr(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, (char*)section) == 0)
break; /* 找到项section */
}
}
CFG_section_line_no = line_no;
//curpos = 0;
while(1) /* 搜找key */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(fhandle, curpos, buf1, MAX_CFG_BUF);
curpos += n + 2;
if(n < -1) goto r_cfg_end;
ret = CFG_KEY_NOT_FOUND;
if(n < 0) goto r_cfg_end; /* 文件尾,未发现key */
line_no++;
CFG_key_line_no = line_no;
CFG_key_lines = 1;
n = strlen(strtriml(strtrimr(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 = FileGetLine(fhandle, curpos, buf2, MAX_CFG_BUF);
curpos += n + 2;
if(n < -1) goto r_cfg_end;
if(n < 0) break; /* 文件结束 */
line_no++;
CFG_key_lines++;
n = strlen(strtrimr(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(SplitKeyValue(buf1, &key_ptr, &val_ptr) != 1)
goto r_cfg_end;
strtriml(strtrimr(key_ptr));
if(strcmp(key_ptr, key) != 0)
continue; /* 和key值不匹配 */
strcpy(buf, val_ptr);
break;
}
ret = CFG_OK;
r_cfg_end:
//if(fp != NULL) fclose(fp);
return ret;
}
/*
* 读取配置文件
*/
void config(void)
{
int ret, vv;
unsigned char i, j;
char config_file[20]="plugin.ini";
char buf[MAX_CFG_BUF];
char tmpbuf[50];
char tmppbuf[20];
cfghandle=__fopen((char *)config_file, FILE_A);
cfgfilelen =__get_flen(cfghandle);
if (cfgfilelen > 0)
cfgfilebufpage = (cfgfilelen / MAX_CFG_BUF) + 1;
else
{
cfgfilebufpage = 0;
//addexceptionmsg();
//showexception(char *rt, char * buf);
}
//__setfpos(ff_handle,0);
/*for (i = 0; i < cfgfilebufpage; i++)
{
__setfpos(cfghandle, CFG_BUF_LEN * i);
__read(cfghandle, cfgfilebuffer, MAX_CFG_BUF);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -