172 lines
2.7 KiB
C
172 lines
2.7 KiB
C
#include "pp_define.h"
|
|
#include "pp_defines.h"
|
|
#include "line_handler.h"
|
|
#include "pp_line_id.h"
|
|
#include "utils.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
|
|
int _collect_sym_mapp(void *def_map, char *def_line);
|
|
char *_get_sym(char *def_line);
|
|
char *_get_mapp(char *def_line);
|
|
|
|
int collect_def(char *line, void *def_map, FILE *source)
|
|
{
|
|
char *def_multiline;
|
|
char read_line[PP_LINE_LEN + 1];
|
|
|
|
int len;
|
|
int ret;
|
|
|
|
def_multiline = NULL;
|
|
len = strlen(line);
|
|
|
|
strip_spaces_in_def(line);
|
|
|
|
if (line[len - 2] != '\\') {
|
|
ret = _collect_sym_mapp(def_map, line);
|
|
if (ret == PP_FAILED) {
|
|
ret = PP_FAILED;
|
|
goto free_and_exit;
|
|
}
|
|
} else {
|
|
def_multiline = l_strdup(line);
|
|
if (!def_multiline)
|
|
return PP_FAILED;
|
|
|
|
while (fgets(read_line, PP_LINE_LEN, source)) {
|
|
strip_spaces_in_def(read_line);
|
|
|
|
len = strlen(def_multiline);
|
|
def_multiline[len - 2] = 0x00;
|
|
|
|
ret = a_strcat(&def_multiline, read_line);
|
|
if (ret == -1) {
|
|
ret = PP_FAILED;
|
|
goto free_and_exit;
|
|
}
|
|
|
|
|
|
len = strlen(read_line);
|
|
if (read_line[len - 2] != '\\')
|
|
break;
|
|
}
|
|
|
|
ret = _collect_sym_mapp(def_map, def_multiline);
|
|
if (ret == PP_FAILED) {
|
|
ret = PP_FAILED;
|
|
goto free_and_exit;
|
|
}
|
|
}
|
|
|
|
ret = PP_OK;
|
|
|
|
free_and_exit:
|
|
free(def_multiline);
|
|
return ret;
|
|
}
|
|
|
|
int apply_undef(char *line, void *map)
|
|
{
|
|
char *sym;
|
|
int sym_len;
|
|
|
|
int ret;
|
|
|
|
sym = line + UNDEF_LINE_START_SZ + 1;
|
|
sym_len = strlen(sym);
|
|
|
|
sym[sym_len - 1] = 0x00;
|
|
|
|
ret = hashmap_del(map, sym);
|
|
if (ret == MAP_BAD_ARGS) {
|
|
ret = PP_FAILED;
|
|
goto restore_undef_line_and_exit;
|
|
}
|
|
|
|
ret = PP_OK;
|
|
|
|
restore_undef_line_and_exit:
|
|
sym[sym_len - 1] = '\n';
|
|
return ret;
|
|
}
|
|
|
|
int _collect_sym_mapp(void *def_map, char *def_line)
|
|
{
|
|
int ret;
|
|
|
|
char *sym;
|
|
char *mapp;
|
|
|
|
sym = NULL;
|
|
mapp = NULL;
|
|
|
|
sym = _get_sym(def_line);
|
|
if (!sym)
|
|
goto free_and_exit;
|
|
|
|
mapp = _get_mapp(def_line);
|
|
if (!mapp) {
|
|
mapp = calloc(1, sizeof(char));
|
|
if (!mapp)
|
|
goto free_and_exit;
|
|
|
|
a_strcat(&mapp, "");
|
|
}
|
|
|
|
ret = hashmap_put(def_map, sym, mapp);
|
|
|
|
if (ret == MAP_OMEM)
|
|
goto free_and_exit;
|
|
|
|
return PP_OK;
|
|
|
|
free_and_exit:
|
|
free(sym);
|
|
free(mapp);
|
|
return PP_FAILED;
|
|
}
|
|
|
|
char *_get_sym(char *def_line)
|
|
{
|
|
char *sym;
|
|
int sym_end_index;
|
|
|
|
def_line = skip_word(def_line);
|
|
if (!(*def_line))
|
|
return NULL;
|
|
|
|
sym_end_index = get_next_whitespace_idx(def_line);
|
|
|
|
sym = calloc(sym_end_index + 1, sizeof(char));
|
|
if (!sym)
|
|
return NULL;
|
|
|
|
strncpy(sym, def_line, sym_end_index);
|
|
return sym;
|
|
}
|
|
|
|
char *_get_mapp(char *def_line)
|
|
{
|
|
char *mapp;
|
|
int mapp_len;
|
|
|
|
def_line = skip_word(def_line);
|
|
if (!(*def_line))
|
|
return NULL;
|
|
|
|
def_line = skip_word(def_line);
|
|
if (!(*def_line))
|
|
return NULL;
|
|
|
|
mapp_len = strlen(def_line) - 1;
|
|
|
|
mapp = calloc(strlen(def_line) + 1, sizeof(char));
|
|
if (!mapp)
|
|
return NULL;
|
|
|
|
strncpy(mapp, def_line, mapp_len);
|
|
return mapp;
|
|
}
|