src/format.c

00001 /* $Id: format.c,v 1.15 2006/05/30 14:12:48 piotras Exp $
00002  *
00003  * midgard-lib: database access for Midgard clients
00004  *
00005  * Copyright (C) 1999 Jukka Zitting <jukka.zitting@iki.fi>
00006  * Copyright (C) 2000 The Midgard Project ry
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Library General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2 of the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Library General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with this library; see the file COPYING.  If not, write to
00020  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00021  * Boston, MA 02111-1307, USA.
00022  */
00023 #include <config.h>
00024 #include "midgard/midgard_legacy.h"
00025 
00026 #ifdef WIN32
00027 #include "win32/win95nt.h"
00028 #endif
00029 
00030 midgard_pool *mgd_pool(midgard * mgd)
00031 {
00032         assert(mgd);
00033         return mgd->pool;
00034 }
00035 
00036 midgard_pool *mgd_res_pool(midgard_res * res)
00037 {
00038         assert(res);
00039         return res->pool;
00040 }
00041 
00042 typedef char *charp;
00043 typedef int *intp;
00044 typedef void *voidp;
00045 
00046 char *mgd_format_ext(mgd_parser * parser, midgard_pool * pool, const char *fmt,
00047                      ...)
00048 {
00049         char *str;
00050         va_list args;
00051         va_start(args, fmt);
00052         str = mgd_vformat_ext(parser, pool, fmt, args);
00053         va_end(args);
00054         return str;
00055 }
00056 
00057 char *mgd_format(midgard * mgd, midgard_pool * pool, const char *fmt, ...)
00058 {
00059         char *str;
00060         va_list args;
00061         va_start(args, fmt);
00062         str = mgd_vformat(mgd, pool, fmt, args);
00063         va_end(args);
00064         return str;
00065 }
00066 
00067 static char mgd_parser_EntTable[][7] = {
00068         "nbsp", "iexcl", "cent", "pound", "curren", "yen", "brvbar",
00069         "sect", "uml", "copy", "ordf", "laquo", "not", "shy", "reg",
00070         "macr", "deg", "plusmn", "sup2", "sup3", "acute", "micro",
00071         "para", "middot", "cedil", "sup1", "ordm", "raquo", "frac14",
00072         "frac12", "frac34", "iquest", "Agrave", "Aacute", "Acirc",
00073         "Atilde", "Auml", "Aring", "AElig", "Ccedil", "Egrave",
00074         "Eacute", "Ecirc", "Euml", "Igrave", "Iacute", "Icirc",
00075         "Iuml", "ETH", "Ntilde", "Ograve", "Oacute", "Ocirc", "Otilde",
00076         "Ouml", "times", "Oslash", "Ugrave", "Uacute", "Ucirc", "Uuml",
00077         "Yacute", "THORN", "szlig", "agrave", "aacute", "acirc",
00078         "atilde", "auml", "aring", "aelig", "ccedil", "egrave",
00079         "eacute", "ecirc", "euml", "igrave", "iacute", "icirc",
00080         "iuml", "eth", "ntilde", "ograve", "oacute", "ocirc", "otilde",
00081         "ouml", "divide", "oslash", "ugrave", "uacute", "ucirc",
00082         "uuml", "yacute", "thorn", "yuml"
00083 };
00084 
00085 char mgd_parser_HexTable[16] = "0123456789ABCDEF";
00086 
00087 static char *fmtbuf = NULL;
00088 static int fmtlen = 0, fmtsiz = 0;
00089 
00090 static char *accbuf = NULL;
00091 static int acclen = 0, accsiz = 0, acccol = 0;
00092 
00093 int mgd_parser_addchar(mgd_parser * parser, char ch)
00094 {
00095         char *fmttmp;
00096         if (fmtlen == fmtsiz) {
00097                 fmttmp = realloc(fmtbuf, fmtsiz + 1024);
00098                 if (!fmttmp)
00099                         return 0;
00100                 fmtbuf = fmttmp;
00101                 fmtsiz += 1024;
00102         }
00103         fmtbuf[fmtlen++] = ch;
00104         return 1;
00105 }
00106 
00107 int mgd_parser_accchar(mgd_parser * parser, char ch)
00108 {
00109         char *acctmp;
00110         if (acclen == accsiz) {
00111 
00112                 acctmp = realloc(accbuf, accsiz + 1024);
00113                 if (!acctmp)
00114                         return 0;
00115                 accbuf = acctmp;
00116                 accsiz += 1024;
00117         }
00118         accbuf[acclen++] = ch;
00119         if (ch == '\n')
00120                 acccol = 0;
00121         else
00122                 acccol++;
00123         return 1;
00124 }
00125 
00126 int mgd_parser_addint(mgd_parser * parser, int num)
00127 {
00128         int begin, end;
00129         char tmp;
00130         if (num < 0) {
00131                 num = -num;
00132                 if (!mgd_parser_addchar(parser, '-'))
00133                         return 0;
00134         }
00135         begin = fmtlen;
00136         do {
00137                 if (!mgd_parser_addchar(parser, '0' + num % 10))
00138                         return 0;
00139                 num /= 10;
00140         } while (num);
00141         for (end = fmtlen - 1; begin < end; begin++, end--) {
00142                 tmp = fmtbuf[begin];
00143                 fmtbuf[begin] = fmtbuf[end];
00144                 fmtbuf[end] = tmp;
00145         }
00146         return 1;
00147 }
00148 
00149 int mgd_parser_adddate(mgd_parser * parser, const char *str)
00150 {
00151         int d, m, y;
00152         if (!str || !*str || sscanf(str, "%d.%d.%d", &d, &m, &y) != 3) {
00153                 mgd_parser_addchar(parser, '\'');
00154       /*[eeh] Add string verbatim if it can't be parsed */
00155       mgd_parser_addstr(parser, str);
00156                 mgd_parser_addchar(parser, '\'');
00157                 return 0;
00158         }
00159         if (y < 100)
00160                 y += 1900;
00161         mgd_parser_addchar(parser, '\'');
00162         mgd_parser_addint(parser, y);
00163         mgd_parser_addchar(parser, '-');
00164         mgd_parser_addint(parser, m);
00165         mgd_parser_addchar(parser, '-');
00166         mgd_parser_addint(parser, d);
00167         mgd_parser_addchar(parser, '\'');
00168         return 1;
00169 }
00170 
00171 int mgd_parser_addstr(mgd_parser * parser, const char *str)
00172 {
00173         if (str)
00174                 while (*str)
00175                         if (!mgd_parser_addchar(parser, *str++))
00176                                 return 0;
00177         return 1;
00178 }
00179 
00180 int mgd_parser_addsql(mgd_parser * parser, const char *str)
00181 {
00182         if (str)
00183                 while (*str)
00184                         switch (*str) {
00185                                 case '\'':
00186                                 if (!mgd_parser_addstr(parser, "\\\'"))
00187                                         return 0;
00188                                 str++;
00189                                 break;
00190                                 case '\"':
00191                                 if (!mgd_parser_addstr(parser, "\\\""))
00192                                         return 0;
00193                                 str++;
00194                                 break;
00195                                 case '\\':
00196                                 if (!mgd_parser_addstr(parser, "\\\\"))
00197                                         return 0;
00198                                 str++;
00199                                 break;
00200                                 default:
00201                                 if (!mgd_parser_addchar(parser, *str))
00202                                         return 0;
00203                                 str++;
00204                                 break;
00205                         }
00206         return 1;
00207 }
00208 
00209 /* This function is different from mgd_parser_addsql in that it
00210    tries to eat all '\n'. This is needed for 'Q' formatter
00211 */
00212 
00213 int mgd_parser_addcleansql(mgd_parser * parser, const char *str)
00214 {
00215         if (str)
00216                 while (*str)
00217                         switch (*str) {
00218                                 case '\'':
00219                                 if (!mgd_parser_addstr(parser, "\\\'"))
00220                                         return 0;
00221                                 str++;
00222                                 break;
00223                                 case '\"':
00224                                 if (!mgd_parser_addstr(parser, "\\\""))
00225                                         return 0;
00226                                 str++;
00227                                 break;
00228                                 case '\\':
00229                                 if (!mgd_parser_addstr(parser, "\\\\"))
00230                                         return 0;
00231                                 str++;
00232                                 break;
00233                                 case '\n':
00234                                 /* Skip '\n' and do not put into output stream */
00235                                 str++;
00236                                 break;
00237                                 default:
00238                                 if (!mgd_parser_addchar(parser, *str))
00239                                         return 0;
00240                                 str++;
00241                                 break;
00242                         }
00243         return 1;
00244 }
00245 
00246 static int addplain(mgd_parser * parser, const char *str, int html)
00247 {
00248         if (!str)
00249                 return 0;
00250         while (*str) {
00251                 for (; *str && (!html || (*str != '[' || *(str + 1) != '<'));
00252                      str++)
00253                         if (*str == '&')
00254                                 mgd_parser_addstr(parser, "&amp;");
00255                         else if (*str == '<')
00256                                 mgd_parser_addstr(parser, "&lt;");
00257                         else if (*str == '>')
00258                                 mgd_parser_addstr(parser, "&gt;");
00259                         else if (*str == '\"')
00260                                 mgd_parser_addstr(parser, "&quot;");
00261                         else if (((unsigned char) *str) >= 160) {
00262                                 mgd_parser_addchar(parser, '&');
00263                                 mgd_parser_addstr(parser,
00264                                                   mgd_parser_EntTable[
00265                                                                       ((unsigned
00266                                                                         char)
00267                                                                        *str) -
00268                                                                       160]);
00269                                 mgd_parser_addchar(parser, ';');
00270                         }
00271                         else
00272                                 mgd_parser_addchar(parser, *str);
00273                 if (*str && html && *str == '[' && *(str + 1) == '<') {
00274                         for (str += 2;
00275                              *str && (*str != '>' || *(str + 1) != ']'); str++)
00276                                 if (((unsigned char) *str) >= 160) {
00277                                         mgd_parser_addchar(parser, '&');
00278                                         mgd_parser_addstr(parser,
00279                                                           mgd_parser_EntTable[
00280                                                                               (
00281                                                                                (unsigned
00282                                                                                 char)
00283                                                                                *str)
00284 - 160]);
00285                                         mgd_parser_addchar(parser, ';');
00286                                 }
00287                                 else
00288                                         mgd_parser_addchar(parser, *str);
00289                 }
00290                 if (*str && html && *str == '>' && *(str + 1) == ']')
00291                         str += 2;
00292         }
00293         return 1;
00294 }
00295 
00296 static int addhtml(mgd_parser * parser, const char *str)
00297 {
00298         if (!str)
00299                 return 0;
00300         for (; *str; str++)
00301                 if (((unsigned char) *str) >= 160) {
00302                         mgd_parser_addchar(parser, '&');
00303                         mgd_parser_addstr(parser,
00304                                           mgd_parser_EntTable[
00305                                                               ((unsigned char)
00306                                                                *str) - 160]);
00307                         mgd_parser_addchar(parser, ';');
00308                 }
00309                 else
00310                         mgd_parser_addchar(parser, *str);
00311         return 1;
00312 }
00313 
00314 
00315 static const char *skipws(const char *str)
00316 {
00317         while (*str == ' ' || *str == '\t')
00318                 str++;
00319         return str;
00320 }
00321 
00322 static int accline = 0, accword = 0, acclist = 0, accpara = 0;
00323 
00324 static int crlf(const char *str)
00325 {
00326         if (*str == '\n')
00327                 return 1;
00328         if (*str == '\r' && *(str + 1) == '\n')
00329                 return 2;
00330         return 0;
00331 }
00332 
00333 static const char *doline(mgd_parser * parser, const char *str)
00334 {
00335         str = skipws(str);
00336         while (*str && !crlf(str)) {
00337                 if (accword++)
00338                         mgd_parser_accchar(parser, acccol > 70 ? '\n' : ' ');
00339                 while (*str && *str != ' ' && *str != '\t' && !crlf(str)) {
00340                         if (*str == '.')
00341                                 accpara = 1;
00342                         mgd_parser_accchar(parser, *str++);
00343                 }
00344                 str = skipws(str);
00345         }
00346         str += crlf(str);
00347         str = skipws(str);
00348         return str;
00349 }
00350 
00351 int mgd_parser_addtext(mgd_parser * parser, const char *str, int headers)
00352 {
00353         if (!str)
00354                 return 0;
00355         acclist = 0;
00356         do {
00357                 acclen = 0;
00358                 accline = 0;
00359                 accword = 0;
00360                 acccol = 0;
00361                 accpara = 0;
00362                 for (str = skipws(str); crlf(str);) {
00363                         str += crlf(str);
00364                         str = skipws(str);
00365                 }
00366                 if (*str == '-') {
00367                         if (!acclist++)
00368                                 mgd_parser_addstr(parser, "<ul>\n");
00369                         str = skipws(str + 1);
00370                 }
00371                 do {
00372                         accline++;
00373                         str = doline(parser, str);
00374                 } while (*str && *str != '-' && !crlf(str));
00375                 mgd_parser_accchar(parser, '\0');
00376                 if (acclist) {
00377                         mgd_parser_addstr(parser, "  <li>");
00378                         parser->callbacks['P'].func(parser, accbuf);
00379                         mgd_parser_addstr(parser, "</li>\n");
00380                 }
00381                 else if (headers && !accpara && accline == 1 && accword > 0
00382                          && accword < 10) {
00383                         mgd_parser_addstr(parser, "<h2>");
00384                         parser->callbacks['P'].func(parser, accbuf);
00385                         mgd_parser_addstr(parser, "</h2>\n");
00386                 }
00387                 else if (accword > 0) {
00388                         mgd_parser_addstr(parser, "<p>");
00389                         parser->callbacks['P'].func(parser, accbuf);
00390                         mgd_parser_addstr(parser, "\n</p>\n");
00391                 }
00392                 if (acclist && *str != '-') {
00393                         acclist = 0;
00394                         mgd_parser_addstr(parser, "</ul>\n");
00395                 }
00396         } while (*str);
00397         return 1;
00398 }
00399 
00400 static int mgd_parser_std_d(mgd_parser * parser, void *data)
00401 {
00402         return mgd_parser_addint(parser, (int) data);
00403 }
00404 
00405 static int mgd_parser_std_D(mgd_parser * parser, void *data)
00406 {
00407         int *ids = (int *) data;
00408         mgd_parser_addchar(parser, '(');
00409         if (ids && *ids) {
00410                 mgd_parser_addint(parser, *ids);
00411                 for (ids++; *ids; ids++) {
00412                         mgd_parser_addchar(parser, ',');
00413                         mgd_parser_addint(parser, *ids);
00414                 }
00415         }
00416         else
00417                 mgd_parser_addstr(parser, "-1");
00418         mgd_parser_addchar(parser, ')');
00419         return 1;
00420 }
00421 
00422 static int mgd_parser_std_t(mgd_parser * parser, void *data)
00423 {
00424         return mgd_parser_adddate(parser, (const char *) data);
00425 }
00426 
00427 static int mgd_parser_std_s(mgd_parser * parser, void *data)
00428 {
00429         return mgd_parser_addstr(parser, (const char *) data);
00430 }
00431 
00432 static int mgd_parser_std_q(mgd_parser * parser, void *data)
00433 {
00434         mgd_parser_addchar(parser, '\'');
00435         mgd_parser_addsql(parser, (const char *) data);
00436         mgd_parser_addchar(parser, '\'');
00437         return 1;
00438 }
00439 
00440 static int mgd_parser_std_Q(mgd_parser * parser, void *data)
00441 {
00442         mgd_parser_addcleansql(parser, (const char *) data);
00443         return 1;
00444 }
00445 
00446 static int mgd_parser_std_p(mgd_parser * parser, void *data)
00447 {
00448         return addplain(parser, (const char *) data, 0);
00449 }
00450 
00451 static int mgd_parser_std_P(mgd_parser * parser, void *data)
00452 {
00453         return addplain(parser, (const char *) data, 1);
00454 }
00455 
00456 static int mgd_parser_std_h(mgd_parser * parser, void *data)
00457 {
00458         return addplain(parser, (const char *) data, 1);
00459 }
00460 
00461 static int mgd_parser_std_H(mgd_parser * parser, void *data)
00462 {
00463         return addhtml(parser, (const char *) data);
00464 }
00465 
00466 static int mgd_parser_std_f(mgd_parser * parser, void *data)
00467 {
00468         return mgd_parser_addtext(parser, (const char *) data, 0);
00469 }
00470 
00471 static int mgd_parser_std_F(mgd_parser * parser, void *data)
00472 {
00473         return mgd_parser_addtext(parser, (const char *) data, 1);
00474 }
00475 
00476 static int mgd_parser_std_u(mgd_parser * parser, void *data)
00477 {
00478         const char *str;
00479         for (str = (const char *) data; str && *str; str++)
00480                 if (*str == '\n')
00481                         mgd_parser_addstr(parser, "%0D%0A");
00482                 else if (isalnum(*str))
00483                         mgd_parser_addchar(parser, *str);
00484                 else {
00485                         mgd_parser_addchar(parser, '%');
00486                         mgd_parser_addchar(parser,
00487                                            mgd_parser_HexTable[
00488                                                                (((unsigned
00489                                                                   char) *str) &
00490                                                                 0xF0) >> 4]);
00491                         mgd_parser_addchar(parser,
00492                                            mgd_parser_HexTable[((unsigned char)
00493                                                                 *str) & 0x0F]);
00494                 }
00495         return 1;
00496 }
00497 
00498 static mgd_parser *parserdb = NULL;
00499 
00500 mgd_parser *mgd_parser_create(const char *name, const char *encoding,
00501                               int need_qp)
00502 {
00503         mgd_parser *parser, *fparser;
00504         int i;
00505         midgard_pool *pool;
00506 
00507         pool = mgd_alloc_pool();
00508         parser = (mgd_parser *) mgd_alloc(pool, sizeof (mgd_parser)); /* LEAK */
00509         parser->pool = pool;
00510         parser->next = NULL;
00511         parser->name = mgd_strdup(pool, name);
00512         parser->encoding = mgd_strdup(pool, encoding);
00513         parser->need_qp = need_qp;
00514         parser->callbacks = (mgd_parser_callback_info *) mgd_alloc(pool,
00515                                                                    256 *
00516                                                                    sizeof
00517                                                                    (mgd_parser_callback_info));
00518 
00519         for (i = 0; i < 256; i++)
00520                 parser->callbacks[i].func = NULL;
00521 
00522         mgd_parser_setcallback(parser, 'd', MGD_INT, mgd_parser_std_d);
00523         mgd_parser_setcallback(parser, 'D', MGD_PTR, mgd_parser_std_D);
00524         mgd_parser_setcallback(parser, 'i', MGD_INT, mgd_parser_std_d);
00525         mgd_parser_setcallback(parser, 't', MGD_STR, mgd_parser_std_t);
00526         mgd_parser_setcallback(parser, 's', MGD_STR, mgd_parser_std_s);
00527         mgd_parser_setcallback(parser, 'q', MGD_STR, mgd_parser_std_q);
00528         mgd_parser_setcallback(parser, 'Q', MGD_STR, mgd_parser_std_Q);
00529         mgd_parser_setcallback(parser, 'p', MGD_STR, mgd_parser_std_p);
00530         mgd_parser_setcallback(parser, 'P', MGD_STR, mgd_parser_std_P);
00531         mgd_parser_setcallback(parser, 'h', MGD_STR, mgd_parser_std_h);
00532         mgd_parser_setcallback(parser, 'H', MGD_STR, mgd_parser_std_H);
00533         mgd_parser_setcallback(parser, 'f', MGD_STR, mgd_parser_std_f);
00534         mgd_parser_setcallback(parser, 'F', MGD_STR, mgd_parser_std_F);
00535         mgd_parser_setcallback(parser, 'u', MGD_STR, mgd_parser_std_u);
00536 
00537         if (!parserdb) {
00538                 parserdb = parser;
00539         }
00540         else {
00541                 fparser = parserdb;
00542                 while (fparser->next) {
00543                         fparser = fparser->next;
00544                 }
00545                 fparser->next = parser;
00546         }       
00547         return parser;
00548 }
00549 
00550 void mgd_parser_free(mgd_parser * parser)
00551 {
00552         mgd_parser *fparser;
00553         if (parser) {
00554                 fparser = parserdb;
00555                 while (fparser->next && fparser->next != parser) {
00556                         fparser = fparser->next;
00557                 }
00558                 if (fparser->next == parser) {
00559                         fparser->next = parser->next;
00560                 }
00561                 mgd_free_pool(parser->pool);
00562         }       
00563 }
00564 
00565 void mgd_parser_free_all()
00566 {
00567         mgd_parser *parser = NULL, *fparser;
00568 
00569         if (!parserdb)
00570                 return;
00571         fparser = parserdb;
00572         while (fparser->next) {
00573                 parser = fparser;
00574                 fparser = fparser->next;
00575                 mgd_free_pool(parser->pool);
00576         }
00577         
00578         g_free(parser->name);
00579         g_free(parser->encoding);
00580         g_free(parser->callbacks);
00581         g_free(parser);
00582         
00583         parserdb = NULL;
00584 }
00585 
00586 void mgd_parser_setcallback(mgd_parser * parser, char symbol,
00587                             mgd_parser_type ptype, mgd_parser_callback callback)
00588 {
00589         if (parser) {
00590                 parser->callbacks[(int) symbol].func = callback;
00591                 parser->callbacks[(int) symbol].ptype = ptype;
00592         }
00593 }
00594 
00595 void mgd_parser_clearcallback(mgd_parser * parser, char symbol)
00596 {
00597         if (parser) {
00598                 parser->callbacks[(int) symbol].func = NULL;
00599         }
00600 }
00601 
00602 mgd_parser *mgd_parser_get(const char *name)
00603 {
00604         mgd_parser *fparser;
00605         fparser = parserdb;
00606         while (fparser) {
00607                 if (!strcasecmp(name, fparser->name)) {
00608                         return fparser;
00609                 }
00610                 fparser = fparser->next;
00611         }
00612         return NULL;
00613 }
00614 
00615 mgd_parser *mgd_parser_list()
00616 {
00617         return parserdb;
00618 }
00619 
00620 int mgd_parser_activate(midgard * mgd, const char *name)
00621 {
00622         mgd_parser *parser;
00623         if (mgd) {
00624                 parser = mgd_parser_get(name);
00625                 if (parser) {
00626                         mgd->parser = parser;
00627                 }
00628                 else {
00629                         if (!mgd->parser)
00630                                 mgd->parser = parserdb;
00631                 }
00632                 return (parser != NULL);
00633         }
00634         return 0;
00635 }
00636 
00637 char *mgd_vformat_ext(mgd_parser * parser, midgard_pool * pool, const char *fmt,
00638                       va_list args)
00639 {
00640         char *str;
00641         assert(pool);
00642    assert(parser);
00643         if (!fmt)
00644                 return NULL;
00645 
00646         fmtlen = 0;
00647         while (*fmt)
00648                 if (*fmt == '$') {
00649                         if (*(fmt + 1) == '$') {
00650                                 fmt++;  /* fall thru */
00651                         }
00652                         else {
00653                                 /* Force manual selection of system-vital parsers */
00654                                 switch (*(fmt + 1)) {
00655                                         case 'd':
00656                                         case 'i':
00657                                         mgd_parser_std_d(parser, (void *)
00658                                                          va_arg(args, int));
00659                                         fmt += 2;
00660                                         break;
00661                                         case 'q':
00662                                         mgd_parser_std_q(parser, (void *)
00663                                                          va_arg(args, charp));
00664                                         fmt += 2;
00665                                         break;
00666                                         case 'D':
00667                                         mgd_parser_std_D(parser, (void *)
00668                                                          va_arg(args, intp));
00669                                         fmt += 2;
00670                                         break;
00671                                         default:
00672                                         if (parser->callbacks
00673                                             [(int) (*(fmt + 1))].func)
00674                                                 switch (parser->callbacks[(int)
00675                                                                           
00676                                                                           (*
00677                                                                            (fmt
00678                                                                             +
00679                                                                             1))].
00680                                                         ptype) {
00681                                                         case
00682                                                         MGD_CHAR:
00683                                                         parser->callbacks[(int)
00684                                                                           
00685                                                                           (*
00686                                                                            (fmt
00687                                                                             +
00688                                                                             1))].
00689                                                            func(parser,
00690                                                                 (void *) ((int)
00691                                                                           va_arg
00692                                                                           (args,
00693                                                                            int)));
00694                                                         fmt += 2;
00695                                                         break;
00696                                                         case
00697                                                         MGD_INT:
00698                                                         parser->callbacks[(int)
00699                                                                           
00700                                                                           (*
00701                                                                            (fmt
00702                                                                             +
00703                                                                             1))].
00704                                                            func(parser, (void *)
00705                                                                 va_arg(args,
00706                                                                        int));
00707                                                         fmt += 2;
00708                                                         break;
00709                                                         case
00710                                                         MGD_INTPTR:
00711                                                         parser->callbacks[(int)
00712 
00713                                                                           (*
00714                                                                            (fmt
00715                                                                             +
00716                                                                             1))].func
00717                                                            (parser, (void *)
00718                                                             va_arg(args, intp));
00719                                                         fmt += 2;
00720                                                         break;
00721                                                         case
00722                                                         MGD_STR:
00723                                                         parser->callbacks[(int)
00724 
00725                                                                           (*
00726                                                                            (fmt
00727                                                                             +
00728                                                                             1))].func
00729                                                            (parser, (void *)
00730                                                             va_arg(args,
00731                                                                    charp));
00732                                                         fmt += 2;
00733                                                         break;
00734                                                         case
00735                                                         MGD_PTR:
00736                                                         parser->callbacks[(int)
00737 
00738                                                                           (*
00739                                                                            (fmt
00740                                                                             +
00741                                                                             1))].func
00742                                                            (parser, (void *)
00743                                                             va_arg(args,
00744                                                                    voidp));
00745                                                         fmt += 2;
00746                                                         break;
00747                                                 }
00748                                         else
00749                                                 mgd_parser_addchar(parser,
00750                                                                    *fmt++);
00751                                         break;
00752                                 }
00753                         }
00754                 }
00755                 else
00756                         mgd_parser_addchar(parser, *fmt++);
00757 
00758         str = mgd_stralloc(pool, fmtlen);
00759         if (!str)
00760                 return NULL;
00761         strncpy(str, fmtbuf, fmtlen);
00762         str[fmtlen] = '\0';
00763 
00764         return str;
00765 }
00766 
00767 char *mgd_vformat(midgard * mgd, midgard_pool * pool, const char *fmt,
00768                   va_list args)
00769 {
00770         char *str;
00771         assert(pool);
00772    assert(mgd);
00773    assert(mgd->parser);
00774         if (!fmt)
00775                 return NULL;
00776         fmtlen = 0;
00777         while (*fmt) {
00778                 if (*fmt == '$') {
00779                         if (*(fmt + 1) == '$') {
00780                                 fmt++;  /* fall thru */
00781                         }
00782                         else {
00783                                 /* Force manual selection of system-vital parsers */
00784                                 switch (*(fmt + 1)) {
00785                                         case 'd':
00786                                         case 'i':
00787                                         mgd_parser_std_d(mgd->parser, (void *)
00788                                                          va_arg(args, int));
00789                                         fmt += 2;
00790                                         break;
00791                                         case 'q':
00792                                         mgd_parser_std_q(mgd->parser, (void *)
00793                                                          va_arg(args, charp));
00794                                         fmt += 2;
00795                                         break;
00796                                         case 'D':
00797                                         mgd_parser_std_D(mgd->parser, (void *)
00798                                                          va_arg(args, intp));
00799                                         fmt += 2;
00800                                         break;
00801                                         default:
00802                                         if (mgd->parser->callbacks[(int)
00803                                                                    (*(fmt + 1))].func)
00804                                                 switch (mgd->parser->callbacks[
00805                                                                                (int)
00806                                                                                (*
00807                                                                                 (fmt
00808                                                                                  +
00809                                                                                  1))].ptype)
00810                                                 {
00811                                                         case
00812                                                         MGD_CHAR:
00813                                                         mgd->parser->callbacks
00814                                                            [(int)
00815                                                             (*(fmt + 1))].func
00816                                                            (mgd->parser,
00817                                                             (void *) ((int)
00818                                                                       va_arg
00819                                                                       (args,
00820                                                                        int)));
00821                                                         fmt += 2;
00822                                                         break;
00823                                                         case
00824                                                         MGD_INT:
00825                                                         mgd->parser->callbacks
00826                                                            [(int)
00827                                                             (*(fmt + 1))].func
00828                                                            (mgd->parser,
00829                                                             (void *)
00830                                                             va_arg(args, int));
00831                                                         fmt += 2;
00832                                                         break;
00833                                                         case
00834                                                         MGD_INTPTR:
00835                                                         mgd->parser->callbacks
00836                                                            [(int)
00837                                                             (*(fmt + 1))].func
00838                                                            (mgd->parser,
00839                                                             (void *)
00840                                                             va_arg(args, intp));
00841                                                         fmt += 2;
00842                                                         break;
00843                                                         case
00844                                                         MGD_STR:
00845                                                         mgd->parser->callbacks
00846                                                            [(int)
00847                                                             (*(fmt + 1))].func
00848                                                            (mgd->parser,
00849                                                             (void *)
00850                                                             va_arg(args,
00851                                                                    charp));
00852                                                         fmt += 2;
00853                                                         break;
00854                                                         case
00855                                                         MGD_PTR:
00856                                                         mgd->parser->callbacks
00857                                                            [(int)
00858                                                             (*(fmt + 1))].func
00859                                                            (mgd->parser,
00860                                                             (void *)
00861                                                             va_arg(args,
00862                                                                    voidp));
00863                                                         fmt += 2;
00864                                                         break;
00865                                                 }
00866                                         else
00867                                                 mgd_parser_addchar(mgd->parser,
00868                                                                    *fmt++);
00869                                         break;
00870                                 }
00871                         }
00872                 }
00873                 else
00874                         mgd_parser_addchar(mgd->parser, *fmt++);
00875         }
00876 
00877         str = mgd_stralloc(pool, fmtlen);
00878         if (!str)
00879                 return NULL;
00880         strncpy(str, fmtbuf, fmtlen);
00881         str[fmtlen] = '\0';
00882         return str;
00883     //return g_strdup(fmtbuf);
00884     //return fmtbuf;
00885 }
00886 
00887 int mgd_sql2id(midgard_res * res, int col)
00888 {
00889         const char *value;
00890         value = mgd_colvalue(res, col);
00891         if (!value)
00892                 return 0;
00893         return strtol(value, NULL, 10);
00894 }
00895 
00896 int mgd_sql2int(midgard_res * res, int col)
00897 {
00898         const char *value;
00899         value = mgd_colvalue(res, col);
00900         if (!value)
00901                 return 0;
00902         return strtol(value, NULL, 10);
00903 }
00904 
00905 const char *mgd_sql2str(midgard_res * res, int col)
00906 {
00907         assert(res);
00908         return mgd_colvalue(res, col);
00909 }
00910 
00911 time_t mgd_sql2date(midgard_res * res, int col)
00912 {
00913         assert(res);
00914         return (time_t) 0;
00915 }
00916 
00917 time_t mgd_sql2time(midgard_res * res, int col)
00918 {
00919         assert(res);
00920         return (time_t) 0;
00921 }
00922 
00923 time_t mgd_sql2datetime(midgard_res * res, int col)
00924 {
00925         assert(res);
00926         return (time_t) 0;
00927 }

Generated on Thu Feb 22 06:15:14 2007 for midgard-core by  doxygen 1.4.6