• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

rpmio/stringbuf.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include <rpmio.h>      /* XXX xisspace, _free */
00008 #include "stringbuf.h"
00009 #include "debug.h"
00010 
00011 #define BUF_CHUNK 1024
00012 
00013 struct StringBufRec {
00014 /*@owned@*/
00015     char * buf;
00016 /*@dependent@*/
00017     char * tail;     /* Points to first "free" char */
00018     size_t allocated;
00019     size_t free;
00020 };
00021 
00022 StringBuf newStringBuf(void)
00023 {
00024     StringBuf sb = xmalloc(sizeof(*sb));
00025 
00026     sb->free = sb->allocated = BUF_CHUNK;
00027     sb->buf = xcalloc(sb->allocated, sizeof(*sb->buf));
00028     sb->buf[0] = '\0';
00029     sb->tail = sb->buf;
00030     
00031     return sb;
00032 }
00033 
00034 StringBuf freeStringBuf(StringBuf sb)
00035 {
00036     if (sb) {
00037         sb->buf = _free(sb->buf);
00038         sb = _free(sb);
00039     }
00040     return sb;
00041 }
00042 
00043 void truncStringBuf(StringBuf sb)
00044 {
00045     sb->buf[0] = '\0';
00046     sb->tail = sb->buf;
00047     sb->free = sb->allocated;
00048 }
00049 
00050 void stripTrailingBlanksStringBuf(StringBuf sb)
00051 {
00052     while (sb->free != sb->allocated) {
00053         if (!xisspace((int)*(sb->tail - 1)))
00054             break;
00055         sb->free++;
00056         sb->tail--;
00057     }
00058     sb->tail[0] = '\0';
00059 }
00060 
00061 char * getStringBuf(StringBuf sb)
00062 {
00063     return sb->buf;
00064 }
00065 
00066 void appendStringBufAux(StringBuf sb, const char *s, size_t nl)
00067 {
00068     size_t l = strlen(s);
00069 
00070     /* If free == l there is no room for NULL terminator! */
00071     while ((l + nl) >= sb->free) {
00072         sb->allocated += BUF_CHUNK;
00073         sb->free += BUF_CHUNK;
00074         sb->buf = xrealloc(sb->buf, sb->allocated);
00075         sb->tail = sb->buf + (sb->allocated - sb->free);
00076     }
00077     
00078     /*@-mayaliasunique@*/ /* FIX: shrug */
00079     strcpy(sb->tail, s);
00080     /*@=mayaliasunique@*/
00081     sb->tail += l;
00082     sb->free -= l;
00083     if (nl) {
00084         *sb->tail++ = '\n';
00085         sb->free--;
00086         *sb->tail = '\0';
00087     }
00088 }

Generated on Mon Nov 29 2010 05:18:48 for rpm by  doxygen 1.7.2