00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025 #include <string.h>
00026 #include "Text.hh"
00027 #include "compatibility.hh"
00028 #include <string>
00029 #include <vector>
00030 #include <iostream>
00031 #include <sstream>
00032 #include <assert.h>
00033
00034 #include "floats.hh"
00035
00036 extern bool gInternDoubleSwitch;
00037
00038 static string substitution (const string& model, const vector<string>& args)
00039 {
00040 char c;
00041 int i=0, ilast = model.length()-1;
00042 string result;
00043
00044 while (i < ilast) {
00045 c = model[i++];
00046 if (c != '$') {
00047 result += c;
00048 } else {
00049 c = model[i++];
00050 if (c >= '0' && c <= '9') {
00051 result += args[c - '0'];
00052 } else {
00053 result += c;
00054 }
00055 }
00056 }
00057 if (i == ilast) result += model[i];
00058 return result;
00059 }
00060 string subst (const string& model, const vector<string>& args)
00061 {
00062 return substitution(model, args);
00063 }
00064
00065 string subst (const string& model, const string& a0)
00066 {
00067 vector<string> args(10);
00068 args[0] = a0;
00069 return substitution (model, args);
00070 }
00071
00072 string subst (const string& model, const string& a0, const string& a1)
00073 {
00074 vector<string> args(10);
00075 args[0] = a0;
00076 args[1] = a1;
00077
00078 return substitution (model, args);
00079 }
00080
00081 string subst (const string& model, const string& a0, const string& a1, const string& a2)
00082 {
00083 vector<string> args(10);
00084
00085 args[0] = a0;
00086 args[1] = a1;
00087 args[2] = a2;
00088
00089 return substitution (model, args);
00090 }
00091
00092 string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3)
00093 {
00094 vector<string> args(10);
00095
00096 args[0] = a0;
00097 args[1] = a1;
00098 args[2] = a2;
00099 args[3] = a3;
00100
00101 return substitution (model, args);
00102 }
00103
00104 string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4)
00105 {
00106 vector<string> args(10);
00107
00108 args[0] = a0;
00109 args[1] = a1;
00110 args[2] = a2;
00111 args[3] = a3;
00112 args[4] = a4;
00113
00114 return substitution (model, args);
00115 }
00116
00117 string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4, const string& a5)
00118 {
00119 vector<string> args(10);
00120
00121 args[0] = a0;
00122 args[1] = a1;
00123 args[2] = a2;
00124 args[3] = a3;
00125 args[4] = a4;
00126 args[5] = a5;
00127
00128 return substitution (model, args);
00129 }
00130
00131 string subst (const string& model, const string& a0, const string& a1, const string& a2, const string& a3, const string& a4, const string& a5, const string& a6)
00132 {
00133 vector<string> args(10);
00134
00135 args[0] = a0;
00136 args[1] = a1;
00137 args[2] = a2;
00138 args[3] = a3;
00139 args[4] = a4;
00140 args[5] = a5;
00141 args[6] = a6;
00142
00143 return substitution (model, args);
00144 }
00145
00146
00153 static void zdel(char* c)
00154 {
00155 int l = strlen(c) - 1;
00156 bool f = (c[l] == 'f');
00157
00158 if (f) c[l--] = 0;
00159 while ( l>1 && c[l-1] != '.' && c[l] == '0') c[l--] = 0;
00160 if (f) c[++l] = 'f';
00161 }
00162
00163 string T (char* c) { return string(c); }
00164 string T (int n) { char c[64]; snprintf(c, 63, "%d",n); return string(c); }
00165 string T (long n) { char c[64]; snprintf(c, 63, "%ld",n); return string(c); }
00166
00167 #if 0
00168 string T (float n)
00169 {
00170 char c[64];
00171 if (n < 0.1 && n > -0.1 && n != 0.0) {
00172 snprintf(c, 63, "%ef", n);
00173 } else {
00174 snprintf(c, 63, "%ff", n);
00175 zdel(c);
00176 }
00177 return string(c);
00178 }
00179 #endif
00180
00185 string T (double n)
00186 {
00187 char c[64];
00188 if (n < 0.1 && n > -0.1 && n != 0.0) {
00189 snprintf(c, 63, "%e%s", n, inumix());
00190 } else {
00191 snprintf(c, 63, "%f%s", n, inumix());
00192 zdel(c);
00193 }
00194 return string(c);
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00220 string unquote(const string& s)
00221 {
00222 assert(s.size() >= 2);
00223 assert(s[0] == '"');
00224 assert(s[s.size()-1] == '"');
00225 return s.substr(1, s.size()-2);
00226 }
00227
00228
00232 string quote(const string& s)
00233 {
00234 string q("\"");
00235 q += s;
00236 q += "\"";
00237 return q;
00238 }
00239