#include "tstring.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
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);
|
|
}
|