Initial submission of source code, no bugs found

This commit is contained in:
aixiao 2019-06-27 20:45:31 +08:00
parent 5105ad7eac
commit 71266f6d68
6 changed files with 162 additions and 1 deletions

15
Makefile Normal file
View File

@ -0,0 +1,15 @@
CROSS_COMPILE ?=
CC := $(CROSS_COMPILE)gcc
STRIP := $(CROSS_COMPILE)strip
AR := $(CROSS_COMPILE)ar
CFLAGS += -g -Wall
LIBS = libini.so
SLIB = libini.a
all: libini.o
$(CC) $(CFLAGS) -FPIC -shared $^ -o $(LIBS)
$(AR) -rc $(SLIB) $^
clean:
rm -rf *.o
rm $(LIBS) $(SLIB)

View File

@ -1 +1,13 @@
# libini
非常小的c语言读取、写入ini配置文件c库.
支持字符串、整形、长整型、浮点型.
注释是"//"、"#"、";".
会读取等号右边所有字符.
支持等号左右有若干空格.
# build
git clone https://github.com/niuyuling/libini
cd libini
make
gcc -Wall test.c -o test -L./ -lini -static
./test

7
config.ini Normal file
View File

@ -0,0 +1,7 @@
[CAT]
age=1343567
name=aixiao.me
a=10
b=1234567890
c=1.1234567

101
libini.c Normal file
View File

@ -0,0 +1,101 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "libini.h"
int getinikeystring(char *title, char *key, char *filename, char *buf)
{
FILE *fp;
int flag = 0;
char sTitle[64], *wTmp;
char sLine[1024];
sprintf(sTitle, "[%s]", title);
if (NULL == (fp = fopen(filename, "r"))) {
perror("fopen");
return -1;
}
while (NULL != fgets(sLine, 1024, fp)) {
if (0 == strncmp("//", sLine, 2))
continue;
if ('#' == sLine[0])
continue;
if (';' == sLine[0])
continue;
wTmp = strchr(sLine, '=');
if ((NULL != wTmp) && (1 == flag)) {
sLine[strlen(sLine) - 1] = '\0';
if (0 == strncmp(key, sLine, strlen(key)) && !(strncasecmp(strtok(sLine, "="), key, strlen(strtok(sLine, "="))))) {
//printf("%s\n", sLine);
fclose(fp);
while (*(wTmp + 1) == ' ') {
wTmp++;
}
strcpy(buf, wTmp + 1);
return 0;
}
} else {
if (0 == strncmp(sTitle, sLine, strlen(sTitle))) {
flag = 1;
}
}
}
fclose(fp);
return -1;
}
int putinikeystring(char *title, char *key, char *val, char *filename)
{
FILE *fpr;
FILE *fpw;
int flag = 0;
char sLine[1024], sTitle[32], *wTmp;
sprintf(sTitle, "[%s]", title);
if (NULL == (fpr = fopen(filename, "r")))
return -1;
sprintf(sLine, "%s.tmp", filename);
if (NULL == (fpw = fopen(sLine, "w")))
return -1;
while (NULL != fgets(sLine, 1024, fpr)) {
if (2 != flag) {
wTmp = strchr(sLine, '=');
if ((NULL != wTmp) && (1 == flag)) {
if (0 == strncmp(key, sLine, strlen(key))) {
flag = 2;
sprintf(wTmp + 1, " %s\n", val);
}
} else {
if (0 == strncmp(sTitle, sLine, strlen(sTitle))) {
flag = 1;
}
}
}
fputs(sLine, fpw);
}
fclose(fpr);
fclose(fpw);
sprintf(sLine, "%s.tmp", filename);
return rename(sLine, filename);
}
int getinikeyint(char *title, char *key, char *filename)
{
char buf[256];
getinikeystring(title, key, filename, buf);
return atoi(buf);
}
long int getinikeylong(char *title, char *key, char *filename)
{
char buf[256];
getinikeystring(title, key, filename, buf);
return atol(buf);
}
float getinikeyfloat(char *title, char *key, char *filename)
{
char buf[256];
getinikeystring(title, key, filename, buf);
return atof(buf);
}

9
libini.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef LIBINI_H
int getinikeystring(char *title, char *key, char *filename, char *buf);
int putinikeystring(char *title, char *key, char *val, char *filename);
int getinikeyint(char *title, char *key, char *filename);
long getinikeylong(char *title, char *key, char *filename);
float getinikeyfloat(char *title, char *key, char *filename);
#endif

17
test.c Normal file
View File

@ -0,0 +1,17 @@
#include "libini.h"
#include <stdio.h>
int main(void) {
char buf[50];
getinikeystring("CAT", "age", "config.ini", buf);
printf("%s\n", buf);
getinikeystring("CAT", "name", "config.ini", buf);
printf("%s\n", buf);
printf("%d\n", getinikeyint("CAT", "a", "config.ini"));
printf("%ld\n", getinikeylong("CAT", "b", "config.ini"));
printf("%f\n", getinikeyfloat("CAT", "c", "config.ini"));
return 1;
}