WONKY



LOG | FILES | OVERVIEW


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.h
unsigned 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;
+ }
#endif
F 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 Constant
char 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