#include "tstring.h" #include #include #include #include #include tstring* tstring_create(size_t sz) { tstring* buffer = malloc(sizeof(tstring)+sz); memset(buffer, 0, sizeof(tstring)+sz); buffer->size = sz; return buffer; } tstring* tstring_copy(tstring* src) { tstring* buffer = tstring_create(src->size); memcpy(buffer->data, src->data, src->size+1); return buffer; } tstring* cstring_to_tstring(char* src) { size_t sz = strlen(src); tstring* buffer = tstring_create(sz); memcpy(buffer->data, src, sz); buffer->size = sz; return buffer; } tstring* integer_to_tstring(int64_t val) { char conversion[20]; bool sign = val < 0; char* it = conversion; if(sign) { val *= -1; } if(val == 0) { tstring* ret = tstring_create(1); ret->data[0] = '0'; return ret; } while(val != 0) { *(it++) = val%10+'0'; val/=10; } tstring* ret = tstring_create((it-conversion) + sign); char* dest_it = ret->data; if(sign) { *(dest_it++) = '-'; } do { *(dest_it++) = *(it--); } while(it != conversion); return ret; } tstring* tstring_concatenate(tstring* lhs, tstring* rhs) { tstring* ret = tstring_create(lhs->size + rhs->size); memcpy(ret->data, lhs->data, lhs->size); memcpy(ret->data + lhs->size, rhs->data, rhs->size); return ret; } tstring* tstring_n_concatenate(size_t count, ...) { va_list strs; va_start(strs, count); size_t tot_sz = 0; size_t idx; for(idx = 0; idx < count; idx++) { tot_sz += va_arg(strs, tstring*)->size; } tstring* ret = tstring_create(tot_sz); va_end(strs); va_start(strs, count); char* it = ret->data; for(idx = 0; idx < count; idx++) { tstring* curr = va_arg(strs, tstring*); memcpy(it, curr->data, curr->size); it+=curr->size; } va_end(strs); ret->size = tot_sz; return ret; } int tstring_n_write(FILE* file, size_t count, ...) { va_list strs; va_start(strs, count); size_t idx; for(idx = 0; idx < count; idx++) { tstring* curr = va_arg(strs, tstring*); if(fwrite(curr->data,1, curr->size, file) != curr->size) { return ferror(file); } } va_end(strs); return 0; } tstring* tstring_n_compose(const char* count, ...) { va_list strs; size_t nb = strlen(count); va_start(strs, count); size_t tot_sz = 0; size_t idx; for(idx = 0; idx < nb; idx++) { switch(count[idx]){ case 't': tot_sz += va_arg(strs, tstring*)->size; break; case 'c': tot_sz += strlen(va_arg(strs, char*)); break; default: va_end(strs); exit(EXIT_FAILURE); break; } } tstring* ret = tstring_create(tot_sz); char* it = ret->data; va_end(strs); va_start(strs, count); for(idx = 0; idx < nb; idx++) { switch(count[idx]){ case 't': { tstring* curr = va_arg(strs, tstring*); memcpy(it, curr->data, curr->size); it+=curr->size; } break; case 'c': { char* curr = va_arg(strs, char*); size_t sz = strlen(curr); memcpy(it, curr, sz); it+=sz; } break; default: perror("Invalid tstring concatenation"); exit(EXIT_FAILURE); break; } } va_end(strs); ret->size = tot_sz; return ret; } void tstring_destroy(tstring* del) { free(del); }