📄 config_phase.c
字号:
/* config_phase.c: phase config.txt
*/
#include <stdio.h>
#include <string.h>#include <stdlib.h>
#include <unistd.h>
#include "config_phase.h"
#include "sysconf.h"
char trace_string[200];
void swap(config_item *a[], int i, int j)
{
config_item *temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int partition(config_item *a[], int p, int r)
{
int x = a[r]->index;
int i = p-1;
int j;
for(j=p; j<r; j++)
{
if(a[j]->index <= x)
{
i++;
swap(a, i, j);
}
}
swap(a, i+1, r);
return i+1;
}
void quicksort(config_item *a[], int p, int r)
{
int q;
if(p < r)
{
q = partition(a, p, r);
quicksort(a, p, q-1);
quicksort(a, q+1, r);
}
}
FILE *OpenGlobeConfig() // return NULL for open error
{
FILE * fp;
fp = fopen(CONFIG_FILE_NAME, "rb");
return fp;
}
void CloseGlobeConfig(FILE * fp)
{
fclose(fp);
}
int ReadGlobeConfig(FILE *fp, int config_num, config_item *items[])
{
int i;
int j=0;
char temp_line[MAX_LINE_LENGTH];
char *fake_index, *fake_data;
quicksort(items, 0, config_num-1);
for(i=0; i<items[config_num-1]->index; i++) // index must start from 1
{
memset(temp_line, 0, MAX_LINE_LENGTH);
if( fgets(temp_line, MAX_LINE_LENGTH, fp))
{
if(items[j]->index == i+1)
{
fake_index = strtok(temp_line, "=");
fake_data = strtok(NULL, "=");
if(fake_data == NULL)
fake_data = "";
memset(items[j]->data, 0, strlen(items[j]->data));
strncpy(items[j]->data, fake_data, strlen(fake_data)); //with '/n'
items[j]->data[strlen(items[j]->data)-1] = 0;
//sscanf(temp_line, "%s=%s", fake_index, items[j]->data);
j++;
}
}
else
{
ASSERT("read NULL line\n");
return 0;
}
}
return 1;
}
FILE *OpenTempConfig() // return NULL for open error
{
FILE * fp;
char temp_file_name[MAX_FILE_NAME_LEN];
memset(temp_file_name, 0, MAX_FILE_NAME_LEN);
sprintf(temp_file_name, "%s%d", CONFIG_TEMP_FILE_PROFIX, getpid());
fp = fopen(temp_file_name, "wb");
return fp;
}
void CloseTempConfig(FILE * fp)
{
fclose(fp);
}
void UnlinkTempConfig()
{
char temp_file_name[MAX_FILE_NAME_LEN];
memset(temp_file_name, 0, MAX_FILE_NAME_LEN);
sprintf(temp_file_name, "%s%d", CONFIG_TEMP_FILE_PROFIX, getpid());
unlink(temp_file_name);
}
int WriteTempConfig(FILE *fp, int config_num, config_item *items[])
{
int i; //make sure we have sorted items in ReadGlobeConfig();
int j = 0;
for(i=0; i<config_num; i++) // index must start from 1
{
if(1 == items[i]->is_changed)
j++;
}
fprintf(fp, "%d\n", j);
for(i=0; i<config_num; i++)
{
if(1== items[i]->is_changed)
fprintf(fp, "%d=%s\n", items[i]->index, items[i]->data);
}
return 1;
}
int SaveTempConfig(int config_num, config_item *items[])
{
FILE * fp,*w_fd,*r_fd;
int i, j=0;
for(i=0; i<config_num; i++) // index must start from 1
{
if(1 == items[i]->is_changed )
j++;
}
if(j > 0){
fp = OpenTempConfig();
fprintf(fp, "%d\n", j);
for(i=0; i<config_num; i++)
{
if(1 == items[i]->is_changed )
fprintf(fp, "%d=%s\n", items[i]->index, items[i]->data);
}
fclose(fp);
r_fd = open_read_fifo();
w_fd = open_write_fifo();
notify_config(w_fd);
close_write_fifo(w_fd);
read_fifo(r_fd);
close_read_fifo();
UnlinkTempConfig();
}
return j;
}
config_item ** init_config_item(config_item *items[], int config_num, int *config_list)
{
int i;
items = malloc(sizeof(config_item *)*config_num);
for(i=0; i<config_num; i++)
{
items[i] = malloc(sizeof(config_item));
items[i]->data = malloc(MAX_LINE_LENGTH);
memset(items[i]->data, 0, MAX_LINE_LENGTH);
items[i]->index = config_list[i];
items[i]->is_changed = 0;
}
return items;
}
void set_config_item(config_item *items[], int config_num ,int index ,char * value)
{
int i;
for(i = 0; i < config_num ; i++)
if(items[i]->index == index)
strcat(items[i]->data,value);
}
void free_config_item(config_item *items[], int config_num)
{
int i;
for(i=0; i<config_num; i++)
{
free(items[i]->data);
items[i]->data = NULL;
free(items[i]);
items[i] = NULL;
}
free(items);
items = NULL;
}
int GetConfValues(int *config_list, config_item *items[], int config_num)
{
int i;
FILE * fp;
fp = OpenGlobeConfig();
if(!ReadGlobeConfig(fp, config_num, items))
{
ASSERT("read config error\n");
CloseGlobeConfig(fp);
return 0;
}
CloseGlobeConfig(fp);
return 1;
}
void item_update(int index, config_item *items[], int config_num, char *data)
{
int i;
for(i=0; i<config_num; i++)
{
if(items[i]->index == index)
{
if(strcmp(items[i]->data, data)) // what's the matter
{
memset(trace_string, 0, 200);
sprintf(trace_string, "old:%d: %d :%s\n", items[i]->index, strlen(items[i]->data),items[i]->data);
trace(trace_string);
memset(items[i]->data, 0, strlen(items[i]->data));
strcpy(items[i]->data, data);
items[i]->is_changed = 1;
memset(trace_string, 0, 200);
sprintf(trace_string, "new:%d: %d: %s?%d\n", items[i]->index, strlen(items[i]->data),items[i]->data,items[i]->is_changed);
trace(trace_string);
}
}
}
}
char *getdata(int index, config_item *items[], int config_num)
{
int i;
int len;
for(i=0; i<config_num; i++)
{
if(items[i]->index == index)
{
/*
if(!strcmp(items[i]->data, "\n"))
memcpy(items[i]->data, "NULL", sizeof("NULL"));
else
{
len = strlen(items[i]->data);
*(items[i]->data+len-1) = 0;
}
*/
return items[i]->data;
}
}
return NULL;
}
int SaveConfig(char **postvars, config_item **items, int *config_list, char **config_name, int config_num)
{
int i, j;
//GetConfValues(config_list, items, config_num);
if (postvars == 0)
return 0;
for (i=0; postvars[i]; i = i + 2)
{
for(j=0; j<config_num; j++)
{
if(!strcmp(postvars[i], config_name[j]))
item_update(config_list[j], items, config_num, postvars[i+1]);
}
}
return SaveTempConfig(config_num, items);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -