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 #if defined(BUILD_OS_DARWIN)
00042 #include <stdlib.h>
00043 #else
00044 #include <malloc.h>
00045 #endif
00046 #include <stdio.h>
00047 #include <string.h>
00048 #include "vstring.h"
00049 #include "errors.h"
00050
00051 #define MAX(a,b) ((a>=b)?a:b)
00052
00053 #define vstr_max(v) ((v).max+0)
00054 #define set_vstr_max(v,m) (v).max = m
00055 #define set_vstr_len(v,l) (v).len = l
00056 #define set_vstr_str(v,s) (v).str = s
00057
00058 static vstring current_vstring = {0,0,NULL};
00059
00060 static void
00061 Realloc_Vstring (vstring *v, int newlen)
00062 {
00063
00064 newlen = MAX (newlen, vstr_max(*v)+80);
00065 set_vstr_max(*v, newlen);
00066 set_vstr_str(*v, (char*) realloc(vstr_str(*v), vstr_max(*v)));
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 vstring
00079 vstr_begin (int len)
00080 {
00081 if (vstr_max(current_vstring) == 0) {
00082 set_vstr_str(current_vstring, (char*) malloc(len));
00083 set_vstr_max(current_vstring, len);
00084 }
00085 else if (vstr_len(current_vstring) != 0) {
00086 DevWarn("vstr_begin before finishing old one?\n");
00087 set_vstr_len(current_vstring, 0);
00088 }
00089 if (vstr_max(current_vstring) < len) {
00090 Realloc_Vstring (¤t_vstring, len);
00091 }
00092 return current_vstring;
00093 }
00094
00095
00096 void
00097 vstr_end (vstring v)
00098 {
00099 set_vstr_len(v, 0);
00100 v.str[0] = '\0';
00101 current_vstring = v;
00102 }
00103
00104
00105 vstring
00106 vstr_append (vstring v, const char c)
00107 {
00108 if (vstr_len(v) + 1 > vstr_max(v)) {
00109 Realloc_Vstring (&v, vstr_len(v) + 1);
00110 }
00111 v.str[v.len] = c;
00112 v.len++;
00113 return v;
00114 }
00115
00116
00117 vstring
00118 vstr_concat (vstring v, const char *s)
00119 {
00120 int slen = strlen(s);
00121 if (vstr_len(v) + slen > vstr_max(v)) {
00122 Realloc_Vstring (&v, vstr_len(v) + slen);
00123 }
00124
00125
00126 strcpy(vstr_str(v)+vstr_len(v), s);
00127 set_vstr_len(v, vstr_len(v) + slen);
00128 return v;
00129 }
00130
00131
00132
00133
00134
00135 int
00136 vstr_sprintf (vstring *v, int index, const char *format, ... )
00137 {
00138 int len;
00139 va_list ap;
00140 char *p;
00141 len = strlen(format);
00142 va_start (ap, format);
00143 p = (char*) format;
00144 while (*p != '\0') {
00145 if (*p == '%') {
00146 p++;
00147 if (*p == '%') ;
00148 else if (*p == 's') {
00149 len += strlen(va_arg(ap,char*));
00150 }
00151 else {
00152
00153 va_arg(ap,int);
00154 len += 16;
00155 }
00156 }
00157 p++;
00158 }
00159 va_end(ap);
00160 if (len > vstr_max(*v)) {
00161 Realloc_Vstring (v, len);
00162 }
00163 va_start (ap, format);
00164 len = vsprintf(v->str+index, format, ap);
00165 set_vstr_len(*v, index + len);
00166 va_end(ap);
00167 if (vstr_len(*v) > vstr_max(*v))
00168 Fatal_Error("vstr_sprintf overflowed");
00169 return len;
00170 }