00001
00002 #if DO_USE_TEMPLATES==1
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 struct DS_NoArg{ DS_NoArg(){ } };
00014
00015 DynStr& AppendArg( DS_NoArg dsna, const char *fmt=NULL ){
00016
00017 return *this;
00018 }
00019
00020
00021 template<class A1, class A2, class A3, class A4>
00022 DynStr& PrintfAppend( int& len, const char* fmt, A1 a1, A2 a2, A3 a3, A4 a4 ){
00023 if( !fmt || !*fmt ) { len=0; return *this; }
00024
00025 const char* pcnt = strchr(fmt,'%');
00026 int len_prv = Length();
00027 if( !pcnt ){ Append(fmt); len=Length()-len_prv; return *this; }
00028
00029
00030 Insert( STR_AT_END, fmt, pcnt-fmt );
00031 int len_lead = Length()-len_prv;
00032 const char* arg_fmt_end = pcnt+1;
00033 if( *arg_fmt_end=='%' ){
00034 Append( '%' );
00035 PrintfAppend(len, pcnt+2, a1, a2, a3, a4);
00036 len += len_lead + 1;
00037 return *this;
00038 }
00039
00040
00041
00042 while( strchr(" -+0123456789.#",*arg_fmt_end) )
00043 arg_fmt_end++;
00044
00045 if( !strchr("cdiEfgGosupxX",*arg_fmt_end) )
00046 return *this;
00047 arg_fmt_end++;
00048
00049 char fmt_buf[64];
00050 int fmt_len = arg_fmt_end-pcnt;
00051 if( fmt_len>63 ) return *this;
00052 strncpy(fmt_buf,pcnt,fmt_len);
00053 fmt_buf[fmt_len]=0;
00054
00055 AppendArg( a1, fmt_buf );
00056 PrintfAppend( len, arg_fmt_end, a2, a3, a4, DS_NoArg() );
00057 len = Length()-len_prv;
00058
00059 return *this;
00060 }
00061
00062
00063
00064
00065
00066 template<class A1>
00067 DynStr& PrintfAppend( int& len, const char* fmt, A1 a1 ){ return PrintfAppend(len,fmt,a1, DS_NoArg(),DS_NoArg(),DS_NoArg() ); }
00068
00069
00070 template<class A1, class A2>
00071 DynStr& PrintfAppend( int& len, const char* fmt, A1 a1, A2 a2 ){ return PrintfAppend(len,fmt,a1,a2, DS_NoArg(),DS_NoArg() ); }
00072
00073
00074 template<class A1, class A2, class A3>
00075 DynStr& PrintfAppend( int& len, const char* fmt, A1 a1, A2 a2, A3 a3 ){ return PrintfAppend(len,fmt,a1,a2,a3, DS_NoArg() ); }
00076
00077
00078
00079
00080 template<class A1>
00081 DynStr& PrintfAppend( const char* fmt, A1 a1 ){ int len; return PrintfAppend(len,fmt,a1, DS_NoArg(),DS_NoArg(),DS_NoArg() ); }
00082
00083
00084 template<class A1, class A2>
00085 DynStr& PrintfAppend( const char* fmt, A1 a1, A2 a2 ){ int len; return PrintfAppend(len,fmt,a1,a2, DS_NoArg(),DS_NoArg() ); }
00086
00087
00088 template<class A1, class A2, class A3>
00089 DynStr& PrintfAppend( const char* fmt, A1 a1, A2 a2, A3 a3 ){ int len; return PrintfAppend(len,fmt,a1,a2,a3, DS_NoArg() ); }
00090
00091
00092 template<class A1, class A2, class A3, class A4>
00093 DynStr& PrintfAppend( const char* fmt, A1 a1, A2 a2, A3 a3, A4 a4 ){ int len; return PrintfAppend( len, fmt, a1, a2, a3, a4 ); }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 template<class A1>
00104 DynStr& Printf( int& len, const char* fmt, A1 a1 ){ Reset(); return PrintfAppend(len,fmt,a1, DS_NoArg(),DS_NoArg(),DS_NoArg() ); }
00105
00106
00107 template<class A1, class A2>
00108 DynStr& Printf( int& len, const char* fmt, A1 a1, A2 a2 ){ Reset(); return PrintfAppend(len,fmt,a1,a2, DS_NoArg(),DS_NoArg() ); }
00109
00110
00111 template<class A1, class A2, class A3>
00112 DynStr& Printf( int& len, const char* fmt, A1 a1, A2 a2, A3 a3 ){ Reset(); return PrintfAppend(len,fmt,a1,a2,a3, DS_NoArg() ); }
00113
00114
00115 template<class A1, class A2, class A3, class A4>
00116 DynStr& Printf( int& len, const char* fmt, A1 a1, A2 a2, A3 a3, A4 a4 ){ Reset(); return PrintfAppend(len,fmt,a1,a2,a3,a4); }
00117
00118
00119
00120
00121 template<class A1>
00122 DynStr& Printf( const char* fmt, A1 a1 ){ Reset(); int len; return PrintfAppend(len,fmt,a1, DS_NoArg(),DS_NoArg(),DS_NoArg() ); }
00123
00124
00125 template<class A1, class A2>
00126 DynStr& Printf( const char* fmt, A1 a1, A2 a2 ){ Reset(); int len; return PrintfAppend(len,fmt,a1,a2, DS_NoArg(),DS_NoArg() ); }
00127
00128
00129 template<class A1, class A2, class A3>
00130 DynStr& Printf( const char* fmt, A1 a1, A2 a2, A3 a3 ){ Reset(); int len; return PrintfAppend(len,fmt,a1,a2,a3, DS_NoArg() ); }
00131
00132
00133 template<class A1, class A2, class A3, class A4>
00134 DynStr& Printf( const char* fmt, A1 a1, A2 a2, A3 a3, A4 a4 ){ Reset(); int len; return PrintfAppend( len, fmt, a1, a2, a3, a4 ); }
00135
00136 #endif // DO_USE_TEMPLATES==1