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 #include "string.h"
00029
00030
00031
00032 QStringList
00033 char_array_to_stringlist(char **arr, int len)
00034 {
00035 QStringList list;
00036 for (int i = 0; i < len; i++) {
00037 list << QString(arr[i]);
00038 }
00039 return list;
00040 }
00041
00042
00043
00044
00045 bool
00046 err(QString *str, QString errmsg)
00047 {
00048 if (str) {
00049 *str = errmsg;
00050 }
00051 return false;
00052 }
00053
00054
00055
00056
00057 QString
00058 ensure_valid_chars(QString str, QString validChars)
00059 {
00060 QString out = str;
00061 for (int i = 0; i < str.length(); i++) {
00062 QChar c = str.at(i);
00063 if (validChars.indexOf(c) < 0) {
00064 out.remove(c);
00065 }
00066 }
00067 return out;
00068 }
00069
00070
00071 QString
00072 scrub_email_addr(QString email)
00073 {
00074 QString scrubbed = email;
00075 scrubbed = scrubbed.replace("@", " at ");
00076 scrubbed = scrubbed.replace(".", " dot ");
00077 return scrubbed;
00078 }
00079
00080
00081
00082
00083 QString
00084 string_wrap(QString str, int width, QString sep, QString le)
00085 {
00086 QString wrapped;
00087 int pos, nextsep, wordlen, n;
00088 int seplen = sep.length();
00089
00090 if (str.length() < width) {
00091 return str;
00092 }
00093
00094 pos = 0;
00095 n = width;
00096 while (pos < str.length()) {
00097
00098 nextsep = str.indexOf(sep, pos);
00099 if (nextsep < 0) {
00100 nextsep = str.length();
00101 }
00102 wordlen = nextsep-pos;
00103
00104
00105 if (wordlen > n) {
00106
00107 wrapped.append(le);
00108 n = width;
00109 }
00110
00111
00112 wrapped.append(str.mid(pos, wordlen+seplen));
00113 n = n - wordlen - seplen;
00114 pos += wordlen + seplen;
00115 }
00116 return wrapped.trimmed();
00117 }
00118
00119
00120
00121
00122 QString
00123 base16_encode(const QByteArray buf)
00124 {
00125 QString hex;
00126 for (int i = 0; i < buf.size(); i++) {
00127 hex += "0123456789ABCDEF"[((quint8)buf[i]) >> 4];
00128 hex += "0123456789ABCDEF"[((quint8)buf[i]) & 0xf];
00129 }
00130 return hex;
00131 }
00132
00133
00134
00135 QString
00136 string_escape(const QString str)
00137 {
00138 QString out;
00139 out.append('\"');
00140 for (int i = 0; i < str.length(); i++) {
00141 if (str[i] == '\"' || str[i] == '\\')
00142 out.append('\\');
00143 out.append(str[i]);
00144 }
00145 out.append('\"');
00146 return out;
00147 }
00148
00149
00150
00151 QString
00152 string_unescape(const QString str, bool *ok)
00153 {
00154 QString out;
00155
00156
00157 if (str.length() < 2 || !str.startsWith("\"") || !str.endsWith("\"") ||
00158 (str.endsWith("\\\"") && !str.endsWith("\\\\\""))) {
00159 if (ok)
00160 *ok = false;
00161 return QString();
00162 }
00163 for (int i = 1; i < str.length()-1; i++) {
00164 if (str[i] == '\\')
00165 i++;
00166 out.append(str[i]);
00167 }
00168 if (ok)
00169 *ok = true;
00170 return out;
00171 }
00172
00173
00174
00175
00176 QHash<QString,QString>
00177 string_parse_keyvals(const QString str, bool *ok)
00178 {
00179 int i, len;
00180 bool tmp_ok;
00181 QHash<QString,QString> keyvals;
00182
00183 i = 0;
00184 len = str.length();
00185 while (i < len && str[i].isSpace())
00186 i++;
00187 while (i < len) {
00188 QString key, val;
00189
00190 while (i < len && !str[i].isSpace() && str[i] != '=')
00191 key.append(str[i++]);
00192
00193 if (i < len && str[i] == '=') {
00194 if (++i < len && str[i] == '\"') {
00195
00196 val.append(str[i]);
00197 while (++i < len) {
00198 val.append(str[i]);
00199 if (str[i] == '\\') {
00200 if (++i == len)
00201 goto error;
00202 val.append(str[i]);
00203 } else if (str[i] == '\"') {
00204 i++;
00205 break;
00206 }
00207 }
00208 val = string_unescape(val, &tmp_ok);
00209 if (!tmp_ok)
00210 goto error;
00211 keyvals.insert(key, val);
00212 } else {
00213
00214 while (i < len && !str[i].isSpace())
00215 val.append(str[i++]);
00216 keyvals.insert(key, val);
00217 }
00218 } else {
00219
00220 keyvals.insert(key, QString(""));
00221 }
00222 while (i < len && str[i].isSpace())
00223 i++;
00224 }
00225 if (ok)
00226 *ok = true;
00227 return keyvals;
00228
00229 error:
00230 if (ok)
00231 *ok = false;
00232 return QHash<QString,QString>();
00233 }
00234