diff -r 7f29a65aa1e4 -r 0f6878b5395a project_files/hwc/rtl/misc.c --- a/project_files/hwc/rtl/misc.c Mon Feb 10 00:43:03 2014 +0400 +++ b/project_files/hwc/rtl/misc.c Mon Feb 10 23:02:49 2014 +0400 @@ -43,48 +43,54 @@ string255 fpcrtl_strconcat(string255 str1, string255 str2) { - //printf("str1 = %d, %d\n", str1.len, strlen(str1.str)); - //printf("str2 = %d, %d\n", str2.len, strlen(str2.str)); + int newlen = str1.len + str2.len; + if(newlen > 255) newlen = 255; -#ifdef FPCRTL_DEBUG - if(str1.len + (int)(str2.len) > 255){ - printf("String overflow\n"); - printf("str1(%d): %s\nstr2(%d): %s\n", str1.len, str1.str, str2.len, str2.str); - printf("String will be truncated.\n"); + memcpy(&(str1.str[str1.len]), str2.str, newlen - str1.len); + str1.len = newlen; - strbuf[0] = 0; - strcpy(strbuf, str1.str); - strcat(strbuf, str2.str); - memcpy(str1.str, strbuf, 255); - str1.str[254] = 0; + return str1; +} - return str1; - } -#endif +astring fpcrtl_strconcatA(astring str1, astring str2) +{ + int newlen = str1.len + str2.len; + if(newlen > MAX_ANSISTRING_LENGTH) newlen = MAX_ANSISTRING_LENGTH; - memcpy(&(str1.str[str1.len]), str2.str, str2.len); - str1.str[str1.len + str2.len] = 0; - str1.len += str2.len; + memcpy(&(str1.s[str1.len + 1]), str2.s[1], newlen - str1.len); + str1.len = newlen; return str1; } string255 fpcrtl_strappend(string255 s, char c) { - s.str[s.len] = c; - s.str[s.len + 1] = 0; - s.len ++; + if(s.len < 255) + { + s.s[s.len] = c; + ++s.len; + } + + return s; +} + +astring fpcrtl_strappendA(astring s, char c) +{ + if(s.len < MAX_ANSISTRING_LENGTH) + { + s.s[s.len] = c; + ++s.len; + } return s; } string255 fpcrtl_strprepend(char c, string255 s) { - FIX_STRING(s); - - memmove(s.str + 1, s.str, s.len + 1); // also move '/0' + uint8_t newlen = s.len < 255 ? s.len + 1 : 255; + memmove(s.str + 1, s.str, newlen); // also move '/0' s.str[0] = c; - s.len++; + s.len = newlen; return s; } @@ -96,19 +102,13 @@ result.len = 2; result.str[0] = a; result.str[1] = b; - result.str[2] = 0; return result; } bool fpcrtl_strcompare(string255 str1, string255 str2) { - //printf("str1 = %d, %d\n", str1.len, strlen(str1.str)); - //printf("str2 = %d, %d\n", str2.len, strlen(str2.str)); - FIX_STRING(str1); - FIX_STRING(str2); - - if(strcmp(str1.str, str2.str) == 0){ + if(strncmp(str1.str, str2.str, 256) == 0){ return true; } @@ -117,8 +117,6 @@ bool fpcrtl_strcomparec(string255 a, char b) { - FIX_STRING(a); - if(a.len == 1 && a.str[0] == b){ return true; } @@ -131,35 +129,93 @@ return !fpcrtl_strcompare(a, b); } -//char* fpcrtl_pchar(string255 s) -//{ -// return s.str; -//} +bool fpcrtl_strncompareA(astring a, astring b) +{ + return (a.len == b.len) && (strncmp(a.s, b.s, MAX_ANSISTRING_LENGTH) == 0); +} -string255 fpcrtl_pchar2str(char *s) + +string255 fpcrtl_pchar2str(const char *s) { string255 result; - int t = strlen(s); + int rlen = strlen(s); - if(t > 255){ - printf("pchar2str, length > 255\n"); - assert(0); + if(rlen > 255){ + rlen = 255; } - result.len = t; - memcpy(result.str, s, t); - result.str[t] = 0; + result.len = rlen; + memcpy(result.str, s, rlen); + + return result; +} + + +string255 fpcrtl_make_string(const char* s) { + return fpcrtl_pchar2str(s); +} + + +astring fpcrtl_pchar2astr(const char *s) +{ + astring result; + int rlen = strlen(s); + + if(rlen > MAX_ANSISTRING_LENGTH){ + rlen = MAX_ANSISTRING_LENGTH; + } + + result.len = rlen; + memcpy(result.s + 1, s, rlen); return result; } -string255 fpcrtl_make_string(const char* s) { +astring fpcrtl_str2astr(string255 s) +{ + astring result; + + result.str255 = s; + result.len = s.len; + + return result; +} + +string255 fpcrtl_astr2str(astring s) +{ string255 result; - strcpy(result.str, s); - result.len = strlen(s); + + result = s.str255; + result.len = s.len > 255 ? 255 : s.len; + return result; } +char __pcharBuf[256]; + +char* fpcrtl__pchar__vars(string255 * s) +{ + if(s->len < 255) + { + s->s[s->len] = 0; + return &s->s[1]; + } else + { + memcpy(__pcharBuf, s->s[1], 255); + __pcharBuf[255] = 0; + return &__pcharBuf; + } +} + +char* fpcrtl__pcharA__vars(astring * s) +{ + if(s->len == MAX_ANSISTRING_LENGTH) + --s->len; + + s->s[s->len] = 0; + return &s->s[1]; +} + #ifdef EMSCRIPTEN GLenum glewInit() {