[LCP]dynamic string

Joachim Bauernberger bj at gmx.net
Mon Jun 3 17:53:04 UTC 2002


Hi Angus,
On Friday 31 May 2002 19:50, Angus Mackay wrote:
> why not just use glib (part of gtk) dynamic string class. it is worlds 
better
> than anything you will spin your self. the nicest thing about it is 
the support
> for sprintf style formatting without worry of buffer overflow:
> 
>   GString str = g_string_new("");
>   str = g_string_append(str, "testing ... ");
>   str = g_string_sprintfa(str, "%.2f %s %.2f", 1.0/3, "->", 2.0/3);
>   printf("str: %s\n", str->str);
> 
> output:
>   str: testing ... 0.33 -> 0.67
> 

I will try that too. However don't think I'll be able to link to this 
due to licensing issues.

Thanks,
Joachim

> cheers, Angus.


> 
> It would seem that Joachim Bauernberger (bj at gmx.net) said:
> > Hi,
> > I would like to implement a string object (structure) for a library 
> > which I can grow dynamically. 
> > I intend to use this in a situation where I don't want to worry 
whether
> > src is gonna fit into dst (str(n)cpy() problem).
> > So far I have come up with the following however I am not really 
sure 
> > how efficient/useful this is. 
> > 
> > #define MCHUNK 1024
> > 
> > typedef struct str_t
> > {
> >   char *ss;             /* Buffer holding the string */
> >   size_t count;      /* number of chars in buffer */
> >   size_t size;         /* current space allocated  */
> > } str_t __attribute__ ((aligned));
> > 
> > 
> > str_t *
> > str_t_alloc (size_t chunk)
> > {
> >     void *res;
> > 
> >     res = xmalloc (sizeof (str_t));
> >     if (res) {
> >         str_t *mbuft_p = (str_t *) res;
> > 
> >         if (chunk) mbuft_p->ss = xcalloc(chunk,sizeof(char));
> >         else mbuft_p->ss = NULL;
> >         mbuft_p->count = 0;
> >         mbuft_p->size = 0;
> >     }
> >     return res;
> > }
> > 
> > /* deallocate structure */
> > void
> > str_t_free (str_t * p)
> > {
> >     if (p) {
> >         if (p->ss) {
> >             xfree (p->ss);
> >         }
> >         xfree (p);
> >     }
> > }
> > 
> > /*
> >  * Append n bytes of *src to *bufref->ss
> >  * If n exceeds the space left in *bufref we realloc
> >  * If that fails exit.
> >  * NULL terminate bufref->msg
> >  * This function does not modify src.
> >  */
> > inline str_t *
> > str_t_napp(str_t ** bufref, const char *src, size_t n)
> > {
> >     /* no data */
> >     if (!src || !*src) return *bufref;
> > 
> >     /* check for space left */
> >     while (n >= ((buf->size)-(buf->count)) ) {   
> >         char *tmp=NULL;
> >         if ((tmp =
> > realloc(*bufref->ss,(*bufref->size+MCHUNK)*sizeof(char)))) {
> >             *bufref->ss = tmp;
> >             *bufref->size += MCHUNK;
> >         } else {
> >               /* error */
> >         }
> >     }
> >     strncpy(*bufref->ss+(*bufref->count),src,n);
> >     *bufref->ss[*bufref->count+n+1] = '\0';
> >     *bufref->count += n;
> >     return *bufref;
> > }
> > 
> > 
> > 
> > /* A function can use the above the following way */
> > 
> > void foo(void)
> > {
> >      int i;
> >      str_t *string=NULL;
> > 
> >      string = str_t_alloc(MCHUNK);
> >     for (i=0;i<100000;++1) {
> >       str_t_napp(&string,"Hello World",strlen("Hello World"));
> >     }
> >     .......
> >     str_t_free(string);
> >  return;
> > }
> > 
> > I have implemented xmalloc to terminate the program with an error 
> > message in case malloc fails. Since I can't think of any situation 
> > where I would want to carry on in this case, can you?
> > 
> > Any thoughts on doing things differently?
> > 
> > Thanks & Best regards,
> > /joachim
> > 
> > PS:
> > Sorry for all that code but thought it'd be better than trying to 
> > describe what I want to achieve ....
> > 
> > --
> > http://www.cis.gsu.edu/~shong/oojokes/
> > 
> > _______________________________________________
> > This is the Linux C Programming List
> > :  http://lists.linux.org.au/listinfo/linuxcprogramming List
> 
> _______________________________________________
> This is the Linux C Programming List
> :  http://lists.linux.org.au/listinfo/linuxcprogramming List
> 
> 





More information about the linuxCprogramming mailing list