00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
00210
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
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, "&");
00255 else if (*str == '<')
00256 mgd_parser_addstr(parser, "<");
00257 else if (*str == '>')
00258 mgd_parser_addstr(parser, ">");
00259 else if (*str == '\"')
00260 mgd_parser_addstr(parser, """);
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));
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++;
00651 }
00652 else {
00653
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++;
00781 }
00782 else {
00783
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
00884
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 }