c-preprocessor/pp_define.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;
}