?? inifileprocess.cpp
字號:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "INIFileProcess.h"
#include <atlconv.h>
#include "INIFIleHandler.h"
#define SuccessRet 1
#define FailedRet 0
#define MAX_CFG_BUF 512
#define CFG_OK 0
#define CFG_SECTION_NOT_FOUND -1
#define CFG_KEY_NOT_FOUND -2
#define CFG_ERR -10
#define CFG_ERR_FILE -10
#define CFG_ERR_OPEN_FILE -10
#define CFG_ERR_CREATE_FILE -11
#define CFG_ERR_READ_FILE -12
#define CFG_ERR_WRITE_FILE -13
#define CFG_ERR_FILE_FORMAT -14
#define CFG_ERR_SYSTEM -20
#define CFG_ERR_SYSTEM_CALL -20
#define CFG_ERR_INTERNAL -21
#define CFG_ERR_EXCEED_BUF_SIZE -22
#define COPYF_OK 0
#define COPYF_ERR_OPEN_FILE -10
#define COPYF_ERR_CREATE_FILE -11
#define COPYF_ERR_READ_FILE -12
#define COPYF_ERR_WRITE_FILE -13
#define TXTF_OK 0
#define TXTF_ERR_OPEN_FILE -1
#define TXTF_ERR_READ_FILE -2
#define TXTF_ERR_WRITE_FILE -3
#define TXTF_ERR_DELETE_FILE -4
#define TXTF_ERR_NOT_FOUND -5
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;
//extern void INIFileTstmain(void);
/**********************************************************************
* 函數名稱: strtrimr
* 功能描述: 去除字符串右邊的空字符
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: char * buf 字符串指針
* 輸出參數: 無
* 返 回 值: 字符串指針
* 其它說明: 無
***********************************************************************/
char * strtrimr(char * buf)
{
int len,i;
char * tmp = NULL;
len = strlen(buf);
tmp = (char*)malloc(len);
memset(tmp,0x00,len);
for(i = 0;i < len;i++)
{
if (buf[i] !=' ')
break;
}
if (i < len) {
strncpy(tmp,(buf+i),(len-i));
}
strncpy(buf,tmp,len);
free(tmp);
return buf;
}
/**********************************************************************
* 函數名稱: strtriml
* 功能描述: 去除字符串左邊的空字符
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: char * buf 字符串指針
* 輸出參數: 無
* 返 回 值: 字符串指針
* 其它說明: 無
***********************************************************************/
char * strtriml(char * buf)
{
int len,i;
char * tmp=NULL;
len = strlen(buf);
tmp = (char*)malloc(len);
memset(tmp,0x00,len);
for(i = 0;i < len;i++)
{
if (buf[len-i-1] !=' ')
break;
}
if (i < len) {
strncpy(tmp,buf,len-i);
}
strncpy(buf,tmp,len);
free(tmp);
return buf;
}
/**********************************************************************
* 函數名稱: FileGetLine
* 功能描述: 從文件中讀取一行
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: FILE *fp 文件句柄;int maxlen 緩沖區最大長度
* 輸出參數: char *buffer 一行字符串
* 返 回 值: 實際讀的長度
* 其它說明: 無
***********************************************************************/
int FileGetLine(FILE *fp, char *buffer, int maxlen)
{
int i, j;
char ch1;
for(i = 0, j = 0; i < maxlen; j++)
{
if(fread(&ch1, sizeof(char), 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;
}
/**********************************************************************
* 函數名稱: FileCopy
* 功能描述: 文件拷貝
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: void *source_file 源文件 void *dest_file 目標文件
* 輸出參數: 無
* 返 回 值: 0 -- OK,非0--失敗
* 其它說明: 無
***********************************************************************/
int FileCopy(void *source_file, void *dest_file)
{
FILE *fp1, *fp2;
char buf[1024+1];
int ret;
if((fp1 = fopen((char *)source_file, "r")) == NULL)
return COPYF_ERR_OPEN_FILE;
ret = COPYF_ERR_CREATE_FILE;
if((fp2 = fopen((char *)dest_file, "w")) == NULL) goto copy_end;
while(1)
{
ret = COPYF_ERR_READ_FILE;
memset(buf, 0x00, 1024+1);
if(fgets((char *)buf, 1024, fp1) == NULL)
{
if(strlen(buf) == 0)
{
if(ferror(fp1) != 0) goto copy_end;
break; /* 文件尾 */
}
}
ret = COPYF_ERR_WRITE_FILE;
if(fputs((char *)buf, fp2) == EOF) goto copy_end;
}
ret = COPYF_OK;
copy_end:
if(fp2 != NULL) fclose(fp2);
if(fp1 != NULL) fclose(fp1);
return ret;
}
/**********************************************************************
* 函數名稱: SplitSectionToNameIndex
* 功能描述: 分離section為name和index
* [section]
* / \
* name:index
* jack : 12
* | | |
* k1 k2 i
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: char *section
* 輸出參數: char **name, char **index
* 返 回 值: 1 --- ok
* 0 --- blank line
* -1 --- no name, ":index"
* -2 --- only name, no ':'
* 其它說明: 無
***********************************************************************/
int SplitSectionToNameIndex(char *section, char **name, char **index)
{
int i, k1, k2, n;
if((n = strlen((char *)section)) < 1) return 0;
for(i = 0; i < n; i++)
if(section[i] != ' ' && section[i] != '\t') break;
if(i >= n) return 0;
if(section[i] == CFG_nis) return -1;
k1 = i;
for(i++; i < n; i++)
if(section[i] == CFG_nis) break;
if(i >= n) return -2;
k2 = i;
for(i++; i < n; i++)
if(section[i] != ' ' && section[i] != '\t') break;
section[k2] = '\0';
*name = section + k1;
*index = section + i;
return 1;
}
/**********************************************************************
* 函數名稱: JoinNameIndexToSection
* 功能描述: 合成name和indexsection為section
* jack : 12
* name:index
* \ /
* [section]
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: char *name, char *index
* 輸出參數: char **section
* 返 回 值: 1 --- ok
* 0 --- blank line
* 其它說明: 無
***********************************************************************/
int JoinNameIndexToSection(char **section, char *name, char *index)
{
int n1,n2;
if((n1 = strlen((char *)name)) < 1) return 0;
if((n2 = strlen((char *)index)) < 1) return 0;
strcat(*section,name);
strcat(*section+n1,":");
strcat(*section+n1+1,index);
*(*section+n1+1+n2) = '\0';
return 1;
}
/**********************************************************************
* 函數名稱: 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;
}
/**********************************************************************
* 函數名稱: ConfigGetKey
* 功能描述: 獲得key的值
* 訪問的表: 無
* 修改的表: 無
* 輸入參數: void *CFG_file 文件;void *section 項值;void *key 鍵值
* 輸出參數: void *buf key的值
* 返 回 值: 0 --- ok 非0 --- error
* 其它說明: 無
***********************************************************************/
INIFILEHANDLER_API int ConfigGetKey(void *CFG_file, void *section, void *key, void *buf)
{
FILE *fp;
char buf1[MAX_CFG_BUF + 1], buf2[MAX_CFG_BUF + 1];
char *key_ptr, *val_ptr;
int line_no, n, ret;
line_no = 0;
CFG_section_line_no = 0;
CFG_key_line_no = 0;
CFG_key_lines = 0;
if((fp = fopen((char *)CFG_file, "rb")) == NULL) return CFG_ERR_OPEN_FILE;
while(1) /* 搜找項section */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(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(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, (const char *)section) == 0)
break; /* 找到項section */
}
}
CFG_section_line_no = line_no;
while(1) /* 搜找key */
{
ret = CFG_ERR_READ_FILE;
n = FileGetLine(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++;
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(fp, buf2, MAX_CFG_BUF);
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] == '+') /* 遇+號表示下一行繼續 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -