static inline void newstr_strcpy_ensurespace( newstr *s, unsigned long n ) { unsigned long m = n + 1; if ( !s->data || !s->dim ) newstr_initalloc( s, m ); else if ( n+1 > s->dim ) newstr_realloc( s, m ); }
void newstr_addchar( newstr *s, char newchar ) { assert( s ); if ( !s->data || s->dim==0 ) newstr_initalloc( s, newstr_initlen ); if ( s->len + 2 > s->dim ) newstr_realloc( s, s->len+2 ); s->data[s->len++] = newchar; s->data[s->len] = '\0'; }
void newstr_strcpy( newstr *s, char *addstr ) { unsigned long n; assert( s && addstr ); n = strlen( addstr ); if ( !s->data || !s->dim ) newstr_initalloc( s, n+1 ); else if ( n+1 > s->dim ) newstr_realloc( s, n+1 ); strncpy( s->data, addstr, n ); s->data[n] = '\0'; s->len = n; }
void newstr_strcat( newstr *s, char *addstr ) { unsigned long lenaddstr; assert( s && addstr ); lenaddstr = strlen( addstr ); if ( !s->data || !s->dim ) newstr_initalloc( s, lenaddstr+1 ); else { if ( s->len + lenaddstr + 1 > s->dim ) newstr_realloc( s, s->len + lenaddstr + 1 ); } strncpy( &(s->data[s->len]), addstr, lenaddstr ); s->len += lenaddstr; s->data[s->len]='\0'; }
int newstr_findreplace( newstr *s, char *find, char *replace ) { long diff; size_t findstart, searchstart; size_t p1, p2; size_t find_len, rep_len, curr_len; char empty[2] = ""; unsigned long minsize; char *p; int n = 0; assert( s && find ); if ( !s->data || !s->dim ) return n; if ( !replace ) replace = empty; find_len = strlen( find ); rep_len = strlen( replace ); diff = rep_len - find_len; if ( diff < 0 ) diff = 0; searchstart=0; while ((p=strstr(s->data + searchstart,find))!=NULL) { curr_len = strlen(s->data); findstart=(size_t) p - (size_t) s->data; minsize = curr_len + diff + 1; if (s->dim <= minsize) newstr_realloc( s, minsize ); if ( find_len > rep_len ) { p1 = findstart + rep_len; p2 = findstart + find_len; while( s->data[p2] ) s->data[p1++]=s->data[p2++]; s->data[p1]='\0'; n++; } else if ( find_len < rep_len ) { for ( p1=curr_len; p1>=findstart+find_len; p1-- ) s->data[p1+diff] = s->data[p1]; n++; } for (p1=0; p1<rep_len; p1++) s->data[findstart+p1]=replace[p1]; searchstart = findstart + rep_len; s->len += rep_len - find_len; } return n; }
void newstr_prepend( newstr *s, char *addstr ) { unsigned long lenaddstr, i; assert( s && addstr ); lenaddstr = strlen( addstr ); if ( !s->data || !s->dim ) newstr_initalloc( s, lenaddstr+1 ); else { if ( s->len + lenaddstr + 1 > s->dim ) newstr_realloc( s, s->len + lenaddstr + 1 ); for ( i=s->len+lenaddstr-1; i>=lenaddstr; i-- ) s->data[i] = s->data[i-lenaddstr]; } strncpy( s->data, addstr, lenaddstr ); s->len += lenaddstr; s->data[ s->len ] = '\0'; }
void newstr_segcat( newstr *s, char *startat, char *endat ) { size_t seglength; char *p, *q; assert( s && startat && endat ); assert( (size_t) startat < (size_t) endat ); seglength=(size_t) endat - (size_t) startat; if ( !s->data || !s->dim ) newstr_initalloc( s, seglength+1 ); else { if ( s->len + seglength + 1 > s->dim ) newstr_realloc( s, s->len + seglength+1 ); } q = &(s->data[s->len]); p = startat; while ( *p && p!=endat ) *q++ = *p++; *q = '\0'; s->len += seglength; }
/* newstr_segcpy( s, start, end ); * * copies [start,end) into s */ void newstr_segcpy( newstr *s, char *startat, char *endat ) { size_t seglength; char *p, *q; assert( s && startat && endat ); assert( ((size_t) startat) <= ((size_t) endat) ); seglength=(size_t) endat - (size_t) startat; if ( seglength==0 ) return; if (s->data==NULL || s->dim==0) newstr_initalloc( s, seglength+1 ); else { if ( seglength+1 > s->dim ) newstr_realloc( s, seglength+1 ); } q = s->data; p = startat; while ( *p && p!=endat ) *q++ = *p++; *q = '\0'; s->len = seglength; }