Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #define USE_STANDARD_TYPES
00040 #include <stdarg.h>
00041 #include <stdlib.h>
00042 #include <stdio.h>
00043 #include <string.h>
00044 #include "vstring.h"
00045 #include "errors.h"
00046
00047 #define MAX(a,b) ((a>=b)?a:b)
00048
00049 #define vstr_max(v) ((v).max+0)
00050 #define set_vstr_max(v,m) (v).max = m
00051 #define set_vstr_len(v,l) (v).len = l
00052 #define set_vstr_str(v,s) (v).str = s
00053
00054 static vstring current_vstring = {0,0,NULL};
00055
00056 static void
00057 Realloc_Vstring (vstring *v, int newlen)
00058 {
00059
00060 newlen = MAX (newlen, vstr_max(*v)+80);
00061 set_vstr_max(*v, newlen);
00062 set_vstr_str(*v, (char*) realloc(vstr_str(*v), vstr_max(*v)));
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 vstring
00075 vstr_begin (int len)
00076 {
00077 if (vstr_max(current_vstring) == 0) {
00078 set_vstr_str(current_vstring, (char*) malloc(len));
00079 set_vstr_max(current_vstring, len);
00080 }
00081 else if (vstr_len(current_vstring) != 0) {
00082 DevWarn("vstr_begin before finishing old one?\n");
00083 set_vstr_len(current_vstring, 0);
00084 }
00085 if (vstr_max(current_vstring) < len) {
00086 Realloc_Vstring (¤t_vstring, len);
00087 }
00088 return current_vstring;
00089 }
00090
00091
00092 void
00093 vstr_end (vstring v)
00094 {
00095 set_vstr_len(v, 0);
00096 v.str[0] = '\0';
00097 current_vstring = v;
00098 }
00099
00100
00101 vstring
00102 vstr_append (vstring v, const char c)
00103 {
00104 if (vstr_len(v) + 1 > vstr_max(v)) {
00105 Realloc_Vstring (&v, vstr_len(v) + 1);
00106 }
00107 v.str[v.len] = c;
00108 v.len++;
00109 return v;
00110 }
00111
00112
00113 vstring
00114 vstr_concat (vstring v, const char *s)
00115 {
00116 int slen = strlen(s);
00117 if (vstr_len(v) + slen > vstr_max(v)) {
00118 Realloc_Vstring (&v, vstr_len(v) + slen);
00119 }
00120
00121
00122 strcpy(vstr_str(v)+vstr_len(v), s);
00123 set_vstr_len(v, vstr_len(v) + slen);
00124 return v;
00125 }
00126
00127
00128
00129
00130
00131 int
00132 vstr_sprintf (vstring *v, int index, const char *format, ... )
00133 {
00134 int len;
00135 va_list ap;
00136 char *p;
00137 len = strlen(format);
00138 va_start (ap, format);
00139 p = (char*) format;
00140 while (*p != '\0') {
00141 if (*p == '%') {
00142 p++;
00143 if (*p == '%') ;
00144 else if (*p == 's') {
00145 len += strlen(va_arg(ap,char*));
00146 }
00147 else {
00148
00149 va_arg(ap,int);
00150 len += 16;
00151 }
00152 }
00153 p++;
00154 }
00155 va_end(ap);
00156 if (len > vstr_max(*v)) {
00157 Realloc_Vstring (v, len);
00158 }
00159 va_start (ap, format);
00160 len = vsprintf(v->str+index, format, ap);
00161 set_vstr_len(*v, index + len);
00162 va_end(ap);
00163 if (vstr_len(*v) > vstr_max(*v))
00164 Fatal_Error("vstr_sprintf overflowed");
00165 return len;
00166 }