#include #include #include "common.h" #include "string.h" enum { STRING_HASH_MULTIPLIER = 31 }; static char string_escaped_character(char ch) { switch(ch) { case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; } return ch; } char *string_convert_escaped(char *str) { char *output = str; char *input = str; assert_valid(str); while(*input != '\0') { if(*input == '\\') { ++input; *output = string_escaped_character(*input); } else if(output != input) { *output = *input; } ++input; ++output; } *output = '\0'; return str; } char *string_convert_single_escaped(char *str, char escaped, char replace) { char *output = str; char *input = str; assert_valid(str); while(*input != '\0') { if(*input == '\\') { ++input; if(*input == escaped) { *output = replace; } else { *output = '\\'; *(++output) = *input; } } else if(output != input) { *output = *input; } ++input; ++output; } *output = '\0'; return str; } char *string_skip_leading(char *str, char leading) { assert_valid(str); if(*str != leading) { return str; } return str + 1; } char *string_nullify_if_found(char *str, char ch) { char *pos; assert_valid(str); pos = strchr(str, ch); if(pos != nil) { *pos = '\0'; } return pos; } uint string_hash(void *p) { char *c; uint hash = 0; assert_valid(p); for(c = (char *)p; *c != '\0'; ++c) { hash = STRING_HASH_MULTIPLIER * hash + *c; } return hash; } bool string_isequal(void *p1, void *p2) { assert_valid(p1); assert_valid(p2); return strcmp((char *)p1, (char *)p2) == 0; } char *string_after_last(char *str, char last) { char *lastpos; assert_valid(str); lastpos = strrchr(str, last); if(lastpos != nil) { ++lastpos; } return lastpos; }