00001 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00052 #include <stdlib.h>
00053 #include <string.h>
00054 #include "buf.h"
00055 
00058 #define MINSIZE 10
00059 
00063 int allocsize(int n) {
00064     if (n < MINSIZE)
00065         return MINSIZE;
00066     else
00067         return n;
00068 }
00069 
00074 ABuf *buf_new(unsigned int len)
00075 {
00076     ABuf *b = calloc(1, sizeof(ABuf));
00077     if (b) {
00078         b->b_len = allocsize(len);
00079         b->b_dat = calloc(1, b->b_len);
00080     }
00081     return b;
00082 }
00083 
00090 ABuf *buf_free(ABuf * buf)
00091 {
00092     if (buf) {
00093         if (buf->b_dat)
00094             free(buf->b_dat);
00095 
00096         free(buf);
00097     }
00098     return NULL;
00099 }
00100 
00112 ABuf *buf_check(ABuf * buf, unsigned int len)
00113 {
00114     if (!buf)
00115         return buf_new(len);
00116 
00117     if (buf->b_len < len) {
00118         ABuf *b = buf_new(len);
00119         memmove(b->b_dat, buf->b_dat, buf->b_len);
00120         buf_free(buf);
00121         return b;
00122     }
00123     return buf;
00124 }
00125 
00134 ABuf *buf_strcat(ABuf * buf, char *s)
00135 {
00136     ABuf *b = NULL;
00137     if (! buf)
00138         b = buf_new(strlen(s)+1);
00139     else
00140         b = buf_check(buf, strlen(buf->b_dat) + strlen(s) + 1);
00141 
00142     if (b) {
00143         strncat(b->b_dat, s, b->b_len);
00144         b = buf_terminate(b);
00145     }
00146 
00147     return b;
00148 }
00149 
00158 ABuf *buf_strcpy(ABuf * buf, char *s)
00159 {
00160     ABuf *b = NULL;
00161     int len;
00162 
00163     if (! s)
00164         return buf;
00165 
00166     len = strlen(s) + 1;
00167     if (! buf)
00168         b = buf_new(len);
00169     else
00170         b = buf_check(buf, len);
00171 
00172     if ((b) && (b->b_dat)) {
00173         if ((s) && (strlen(s) > 0)) {
00174             strncpy(b->b_dat, s, b->b_len);
00175             buf_terminate(b);
00176         }
00177         else
00178             *(b->b_dat) = '\0';
00179     }
00180     return b;
00181 }
00182 
00187 ABuf *buf_str_shrinkbyone(ABuf * buf) {
00188     if ((buf == NULL) || (buf->b_dat == NULL) || (strlen(buf->b_dat) < 1))
00189         return buf;
00190 
00191     buf->b_dat[strlen(buf->b_dat)-1] = '\0';
00192     return buf;
00193 }
00194 
00199 ABuf *buf_terminate(ABuf * buf)
00200 {
00201     if (buf) {
00202         if ((buf->b_dat) && (buf->b_len)) {
00203             buf->b_dat[buf->b_len - 1] = '\0';
00204         }
00205     }
00206     return buf;
00207 }