F diff --git a/src/misc/wonky_array.h b/src/misc/wonky_array.h --- a/src/misc/wonky_array.h +++ b/src/misc/wonky_array.hunsigned char bytes[];};+void* _wonky_arr wonky_arr_alloc(size_t number_of_elements,size_t element_size);void* _wonky_arr wonky_arr_expand(void * _wonky_arr arr,size_t expansion_size);void* _wonky_arr wonky_arr_resize(void * _wonky_arr arr,size_t new_size);F diff --git a/src/semantics/value/constant.c b/src/semantics/value/constant.c --- a/src/semantics/value/constant.c +++ b/src/semantics/value/constant.c#include <constant.h>+void delete_constant(struct Constant *constant){wonky_free(constant->value);return ret;}-- void resolve_char_escape_sequence(struct token *token,struct Translation_Data *translation_data)- {-- }char constant_is_null_pointer(struct Constant *constant){/*TODO make an abstraction over value==0*/return tree->type==OP_CONSTANT &&constant_is_null_pointer(AS_EXPRESSION_VALUE_CONSTANT(AS_AST_CONSTANT(tree)->value)->constant);}++struct Constant* extract_literal_string(char *data,size_t data_size){char *ret_component;ret=wonky_malloc(sizeof(struct Constant));- ret_component=gstrncpy(data,data_size);+ //ret_component=gstrncpy(data,data_size);+ ret_component=get_escaped_string(data,data_size);ret->value=ret_component;ret->type=(struct Type*)get_type_insecure(TS_CHAR,TSIGN_NONE,TC_NONE,CHAR_SIZE);return ret;}++ char escape_sequence_map[256]=+ {+ ['a'] = '\a',+ ['b'] = '\b',+ ['f'] = '\f',+ ['n'] = '\n',+ ['r'] = '\r',+ ['t'] = '\t',+ ['v'] = '\v',+ ['\''] = '\'',+ ['\"'] = '\"',+ ['\\'] = '\\',+ };++ char* get_escaped_string(char *data,size_t data_size)+ {+ wonky_assert(data!=NULL);+ wonky_assert(data_size!=0);+ wonky_assert(data[data_size-1]!='\\');++ size_t new_size=0;+ char *ret;+ size_t j;+ size_t i;++ /*calculate new length*/+ for(i=0;i<data_size;++i)+ {+ wonky_assert(data[i]!='\0');+ if(data[i]!='\\')+ ++new_size;+ }++ ret=wonky_malloc(new_size+1);++ for(i=0,j=0;i<data_size;++i,++j)+ {+ wonky_assert(j<new_size);+ if(data[i]!='\\')+ {+ ret[j]=data[i];+ }else+ {+ if(escape_sequence_map[data[i+1]])+ ret[j]=escape_sequence_map[data[i+1]];+ else+ ret[j]=' ';+ i+=2;+ }+ }+ wonky_assert(j==new_size);+ ret[new_size]='\0';+ return ret;+ }#endifF diff --git a/src/semantics/value/constant.h b/src/semantics/value/constant.h --- a/src/semantics/value/constant.h +++ b/src/semantics/value/constant.h#include <type.h>#include <common.h>#include <automata.h>+ #include <wonky_array.h>#include <ast.h>struct Constantchar constant_is_null_pointer(struct Constant *constant);- void resolve_char_escape_sequence(struct token *token,struct Translation_Data *translation_data);+void delete_constant(struct Constant *constant);+ char *get_escaped_string(char *data,size_t data_size);#endif