Config_ini
This commit is contained in:
parent
cfb2aaabef
commit
2e1261f695
6 changed files with 140 additions and 0 deletions
14
config_ini/Makefile
Normal file
14
config_ini/Makefile
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
CC = gcc
|
||||||
|
CFLAGS = -Wall -O2
|
||||||
|
|
||||||
|
TARGET = main.elf
|
||||||
|
SRC = main.c conf.c
|
||||||
|
|
||||||
|
#LDFLAGS =
|
||||||
|
|
||||||
|
$(TARGET): $(SRC)
|
||||||
|
@echo CC $@
|
||||||
|
@$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(TARGET)
|
||||||
80
config_ini/conf.c
Normal file
80
config_ini/conf.c
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include "conf.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define MAX_LINE 256
|
||||||
|
#define MAX_VAL 128
|
||||||
|
|
||||||
|
/* Trim leading/trailing whitespace */
|
||||||
|
static char *trim(char *str) {
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
while (isspace((unsigned char)*str)) str++;
|
||||||
|
if (*str == 0)
|
||||||
|
return str; // only spaces
|
||||||
|
|
||||||
|
end = str + strnlen(str, MAX_VAL) - 1;
|
||||||
|
|
||||||
|
while (end > str && isspace((unsigned char)*end)) end--;
|
||||||
|
end[1] = '\0';
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load INI-style config */
|
||||||
|
Config *config_load(const char *filename) {
|
||||||
|
FILE *f = fopen(filename, "r");
|
||||||
|
if (!f)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
Config *cfg = calloc(1, sizeof(Config));
|
||||||
|
char line[MAX_LINE];
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line), f)) {
|
||||||
|
char *s = trim(line);
|
||||||
|
|
||||||
|
// Skip empty or comment lines
|
||||||
|
if (*s == '\0' || *s == '#' || *s == ';')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char *eq = strchr(s, '=');
|
||||||
|
if (!eq)
|
||||||
|
continue; // invalid line, skip
|
||||||
|
|
||||||
|
*eq = '\0';
|
||||||
|
char *key = trim(s);
|
||||||
|
char *val = trim(eq + 1);
|
||||||
|
|
||||||
|
ConfigEntry *entry = malloc(sizeof(ConfigEntry));
|
||||||
|
entry->key = strndup(key, MAX_VAL);
|
||||||
|
entry->value = strndup(val, MAX_VAL);
|
||||||
|
entry->next = cfg->head;
|
||||||
|
cfg->head = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get value for a key */
|
||||||
|
const char *config_get(Config *cfg, const char *key) {
|
||||||
|
for (ConfigEntry *e = cfg->head; e; e = e->next) {
|
||||||
|
if (strncmp(e->key, key, MAX_VAL) == 0)
|
||||||
|
return e->value;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free the config struct */
|
||||||
|
void config_free(Config *cfg) {
|
||||||
|
ConfigEntry *e = cfg->head;
|
||||||
|
while (e) {
|
||||||
|
ConfigEntry *next = e->next;
|
||||||
|
free(e->key);
|
||||||
|
free(e->value);
|
||||||
|
free(e);
|
||||||
|
e = next;
|
||||||
|
}
|
||||||
|
free(cfg);
|
||||||
|
}
|
||||||
13
config_ini/conf.h
Normal file
13
config_ini/conf.h
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
typedef struct ConfigEntry {
|
||||||
|
char *key;
|
||||||
|
char *value;
|
||||||
|
struct ConfigEntry *next;
|
||||||
|
} ConfigEntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ConfigEntry *head;
|
||||||
|
} Config;
|
||||||
|
|
||||||
|
Config *config_load(const char *filename);
|
||||||
|
const char *config_get(Config *cfg, const char *key);
|
||||||
|
void config_free(Config *cfg);
|
||||||
6
config_ini/config.ini
Normal file
6
config_ini/config.ini
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
# Example INI file
|
||||||
|
username = testuser
|
||||||
|
password = secret123
|
||||||
|
|
||||||
|
; comments work too
|
||||||
|
timeout = 30
|
||||||
7
config_ini/config_broken.ini
Normal file
7
config_ini/config_broken.ini
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Example INI file
|
||||||
|
username = testuser ; inline
|
||||||
|
password = secret123 # Comment
|
||||||
|
|
||||||
|
; comments work too
|
||||||
|
[aa]
|
||||||
|
timeout = 30
|
||||||
20
config_ini/main.c
Normal file
20
config_ini/main.c
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
#include "conf.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// Example usage
|
||||||
|
int main(void) {
|
||||||
|
Config *cfg = config_load("config.ini");
|
||||||
|
if (!cfg) {
|
||||||
|
fprintf(stderr, "Failed to load config.ini\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *user = config_get(cfg, "username");
|
||||||
|
const char *pass = config_get(cfg, "password");
|
||||||
|
|
||||||
|
printf("Username: %s\n", user ? user : "(not set)");
|
||||||
|
printf("Password: %s\n", pass ? pass : "(not set)");
|
||||||
|
|
||||||
|
config_free(cfg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue