Annotation of embedaddon/libxml2/xmlcatalog.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * xmlcatalog.c : a small utility program to handle XML catalogs
                      3:  *
                      4:  * See Copyright for the status of this software.
                      5:  *
                      6:  * daniel@veillard.com
                      7:  */
                      8: 
                      9: #include "libxml.h"
                     10: 
                     11: #include <string.h>
                     12: #include <stdio.h>
                     13: #include <stdarg.h>
                     14: 
                     15: #ifdef HAVE_STDLIB_H
                     16: #include <stdlib.h>
                     17: #endif
                     18: 
                     19: #ifdef HAVE_LIBREADLINE
                     20: #include <readline/readline.h>
                     21: #ifdef HAVE_LIBHISTORY
                     22: #include <readline/history.h>
                     23: #endif
                     24: #endif
                     25: 
                     26: #include <libxml/xmlmemory.h>
                     27: #include <libxml/uri.h>
                     28: #include <libxml/catalog.h>
                     29: #include <libxml/parser.h>
                     30: #include <libxml/globals.h>
                     31: 
                     32: #if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
                     33: static int shell = 0;
                     34: static int sgml = 0;
                     35: static int noout = 0;
                     36: static int create = 0;
                     37: static int add = 0;
                     38: static int del = 0;
                     39: static int convert = 0;
                     40: static int no_super_update = 0;
                     41: static int verbose = 0;
                     42: static char *filename = NULL;
                     43: 
                     44: 
                     45: #ifndef XML_SGML_DEFAULT_CATALOG
                     46: #define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
                     47: #endif
                     48: 
                     49: /************************************************************************
1.1.1.2 ! misho      50:  *                                                                     *
        !            51:  *                     Shell Interface                                 *
        !            52:  *                                                                     *
1.1       misho      53:  ************************************************************************/
                     54: /**
                     55:  * xmlShellReadline:
                     56:  * @prompt:  the prompt value
                     57:  *
                     58:  * Read a string
1.1.1.2 ! misho      59:  *
1.1       misho      60:  * Returns a pointer to it or NULL on EOF the caller is expected to
                     61:  *     free the returned string.
                     62:  */
                     63: static char *
                     64: xmlShellReadline(const char *prompt) {
                     65: #ifdef HAVE_LIBREADLINE
                     66:     char *line_read;
                     67: 
                     68:     /* Get a line from the user. */
                     69:     line_read = readline (prompt);
                     70: 
                     71:     /* If the line has any text in it, save it on the history. */
                     72:     if (line_read && *line_read)
                     73:        add_history (line_read);
                     74: 
                     75:     return (line_read);
                     76: #else
                     77:     char line_read[501];
                     78:     char *ret;
                     79:     int len;
                     80: 
                     81:     if (prompt != NULL)
                     82:        fprintf(stdout, "%s", prompt);
                     83:     if (!fgets(line_read, 500, stdin))
                     84:         return(NULL);
                     85:     line_read[500] = 0;
                     86:     len = strlen(line_read);
                     87:     ret = (char *) malloc(len + 1);
                     88:     if (ret != NULL) {
                     89:        memcpy (ret, line_read, len + 1);
                     90:     }
                     91:     return(ret);
                     92: #endif
                     93: }
                     94: 
                     95: static void usershell(void) {
                     96:     char *cmdline = NULL, *cur;
                     97:     int nbargs;
                     98:     char command[100];
                     99:     char arg[400];
                    100:     char *argv[20];
                    101:     int i, ret;
                    102:     xmlChar *ans;
                    103: 
                    104:     while (1) {
                    105:        cmdline = xmlShellReadline("> ");
                    106:        if (cmdline == NULL)
                    107:            return;
                    108: 
                    109:        /*
                    110:         * Parse the command itself
                    111:         */
                    112:        cur = cmdline;
                    113:        nbargs = 0;
                    114:        while ((*cur == ' ') || (*cur == '\t')) cur++;
                    115:        i = 0;
                    116:        while ((*cur != ' ') && (*cur != '\t') &&
                    117:               (*cur != '\n') && (*cur != '\r')) {
                    118:            if (*cur == 0)
                    119:                break;
                    120:            command[i++] = *cur++;
                    121:        }
                    122:        command[i] = 0;
                    123:        if (i == 0) {
                    124:            free(cmdline);
                    125:            continue;
                    126:        }
                    127: 
                    128:        /*
                    129:         * Parse the argument string
                    130:         */
                    131:        memset(arg, 0, sizeof(arg));
                    132:        while ((*cur == ' ') || (*cur == '\t')) cur++;
                    133:        i = 0;
                    134:        while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
                    135:            if (*cur == 0)
                    136:                break;
                    137:            arg[i++] = *cur++;
                    138:        }
                    139:        arg[i] = 0;
                    140: 
                    141:        /*
                    142:         * Parse the arguments
                    143:         */
                    144:        i = 0;
                    145:        nbargs = 0;
                    146:        cur = arg;
                    147:        memset(argv, 0, sizeof(argv));
                    148:        while (*cur != 0) {
                    149:            while ((*cur == ' ') || (*cur == '\t')) cur++;
                    150:            if (*cur == '\'') {
                    151:                cur++;
                    152:                argv[i] = cur;
                    153:                while ((*cur != 0) && (*cur != '\'')) cur++;
                    154:                if (*cur == '\'') {
                    155:                    *cur = 0;
                    156:                    nbargs++;
                    157:                    i++;
                    158:                    cur++;
                    159:                }
1.1.1.2 ! misho     160:            } else if (*cur == '"') {
1.1       misho     161:                cur++;
                    162:                argv[i] = cur;
                    163:                while ((*cur != 0) && (*cur != '"')) cur++;
                    164:                if (*cur == '"') {
                    165:                    *cur = 0;
                    166:                    nbargs++;
                    167:                    i++;
                    168:                    cur++;
                    169:                }
                    170:            } else {
                    171:                argv[i] = cur;
                    172:                while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
                    173:                    cur++;
                    174:                *cur = 0;
                    175:                nbargs++;
                    176:                i++;
                    177:                cur++;
                    178:            }
                    179:        }
                    180: 
                    181:        /*
                    182:         * start interpreting the command
                    183:         */
                    184:         if (!strcmp(command, "exit"))
                    185:            break;
                    186:         if (!strcmp(command, "quit"))
                    187:            break;
                    188:         if (!strcmp(command, "bye"))
                    189:            break;
                    190:        if (!strcmp(command, "public")) {
                    191:            if (nbargs != 1) {
                    192:                printf("public requires 1 arguments\n");
                    193:            } else {
                    194:                ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
                    195:                if (ans == NULL) {
                    196:                    printf("No entry for PUBLIC %s\n", argv[0]);
                    197:                } else {
                    198:                    printf("%s\n", (char *) ans);
                    199:                    xmlFree(ans);
                    200:                }
                    201:            }
                    202:        } else if (!strcmp(command, "system")) {
                    203:            if (nbargs != 1) {
                    204:                printf("system requires 1 arguments\n");
                    205:            } else {
                    206:                ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
                    207:                if (ans == NULL) {
                    208:                    printf("No entry for SYSTEM %s\n", argv[0]);
                    209:                } else {
                    210:                    printf("%s\n", (char *) ans);
                    211:                    xmlFree(ans);
                    212:                }
                    213:            }
                    214:        } else if (!strcmp(command, "add")) {
                    215:            if (sgml) {
                    216:                if ((nbargs != 3) && (nbargs != 2)) {
                    217:                    printf("add requires 2 or 3 arguments\n");
                    218:                } else {
                    219:                    if (argv[2] == NULL)
                    220:                        ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
                    221:                                            BAD_CAST argv[1]);
                    222:                    else
                    223:                        ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
                    224:                                            BAD_CAST argv[2]);
                    225:                    if (ret != 0)
                    226:                        printf("add command failed\n");
                    227:                }
                    228:            } else {
                    229:                if ((nbargs != 3) && (nbargs != 2)) {
                    230:                    printf("add requires 2 or 3 arguments\n");
                    231:                } else {
                    232:                    if (argv[2] == NULL)
                    233:                        ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
                    234:                                            BAD_CAST argv[1]);
                    235:                    else
                    236:                        ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
                    237:                                            BAD_CAST argv[2]);
                    238:                    if (ret != 0)
                    239:                        printf("add command failed\n");
                    240:                }
                    241:            }
                    242:        } else if (!strcmp(command, "del")) {
                    243:            if (nbargs != 1) {
                    244:                printf("del requires 1\n");
                    245:            } else {
                    246:                ret = xmlCatalogRemove(BAD_CAST argv[0]);
                    247:                if (ret <= 0)
                    248:                    printf("del command failed\n");
                    249: 
                    250:            }
                    251:        } else if (!strcmp(command, "resolve")) {
                    252:            if (nbargs != 2) {
                    253:                printf("resolve requires 2 arguments\n");
                    254:            } else {
                    255:                ans = xmlCatalogResolve(BAD_CAST argv[0],
                    256:                                        BAD_CAST argv[1]);
                    257:                if (ans == NULL) {
                    258:                    printf("Resolver failed to find an answer\n");
                    259:                } else {
                    260:                    printf("%s\n", (char *) ans);
                    261:                    xmlFree(ans);
                    262:                }
                    263:            }
                    264:        } else if (!strcmp(command, "dump")) {
                    265:            if (nbargs != 0) {
                    266:                printf("dump has no arguments\n");
                    267:            } else {
                    268:                xmlCatalogDump(stdout);
                    269:            }
                    270:        } else if (!strcmp(command, "debug")) {
                    271:            if (nbargs != 0) {
                    272:                printf("debug has no arguments\n");
                    273:            } else {
                    274:                verbose++;
                    275:                xmlCatalogSetDebug(verbose);
                    276:            }
                    277:        } else if (!strcmp(command, "quiet")) {
                    278:            if (nbargs != 0) {
                    279:                printf("quiet has no arguments\n");
                    280:            } else {
                    281:                if (verbose > 0)
                    282:                    verbose--;
                    283:                xmlCatalogSetDebug(verbose);
                    284:            }
                    285:        } else {
                    286:            if (strcmp(command, "help")) {
                    287:                printf("Unrecognized command %s\n", command);
                    288:            }
                    289:            printf("Commands available:\n");
                    290:            printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
                    291:            printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
                    292:            printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
                    293:            printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
                    294:            printf("\tdel 'values' : remove values\n");
                    295:            printf("\tdump: print the current catalog state\n");
                    296:            printf("\tdebug: increase the verbosity level\n");
                    297:            printf("\tquiet: decrease the verbosity level\n");
                    298:            printf("\texit:  quit the shell\n");
1.1.1.2 ! misho     299:        }
1.1       misho     300:        free(cmdline); /* not xmlFree here ! */
                    301:     }
                    302: }
                    303: 
                    304: /************************************************************************
1.1.1.2 ! misho     305:  *                                                                     *
        !           306:  *                     Main                                            *
        !           307:  *                                                                     *
1.1       misho     308:  ************************************************************************/
                    309: static void usage(const char *name) {
                    310:     /* split into 2 printf's to avoid overly long string (gcc warning) */
                    311:     printf("\
                    312: Usage : %s [options] catalogfile entities...\n\
                    313: \tParse the catalog file and query it for the entities\n\
                    314: \t--sgml : handle SGML Super catalogs for --add and --del\n\
                    315: \t--shell : run a shell allowing interactive queries\n\
                    316: \t--create : create a new catalog\n\
                    317: \t--add 'type' 'orig' 'replace' : add an XML entry\n\
                    318: \t--add 'entry' : add an SGML entry\n", name);
                    319:     printf("\
                    320: \t--del 'values' : remove values\n\
                    321: \t--noout: avoid dumping the result on stdout\n\
                    322: \t         used with --add or --del, it saves the catalog changes\n\
                    323: \t         and with --sgml it automatically updates the super catalog\n\
                    324: \t--no-super-update: do not update the SGML super catalog\n\
                    325: \t-v --verbose : provide debug informations\n");
                    326: }
                    327: int main(int argc, char **argv) {
                    328:     int i;
                    329:     int ret;
                    330:     int exit_value = 0;
                    331: 
                    332: 
                    333:     if (argc <= 1) {
                    334:        usage(argv[0]);
                    335:        return(1);
                    336:     }
                    337: 
                    338:     LIBXML_TEST_VERSION
                    339:     for (i = 1; i < argc ; i++) {
                    340:        if (!strcmp(argv[i], "-"))
                    341:            break;
                    342: 
                    343:        if (argv[i][0] != '-')
                    344:            break;
                    345:        if ((!strcmp(argv[i], "-verbose")) ||
                    346:            (!strcmp(argv[i], "-v")) ||
                    347:            (!strcmp(argv[i], "--verbose"))) {
                    348:            verbose++;
                    349:            xmlCatalogSetDebug(verbose);
                    350:        } else if ((!strcmp(argv[i], "-noout")) ||
                    351:            (!strcmp(argv[i], "--noout"))) {
                    352:             noout = 1;
                    353:        } else if ((!strcmp(argv[i], "-shell")) ||
                    354:            (!strcmp(argv[i], "--shell"))) {
                    355:            shell++;
                    356:             noout = 1;
                    357:        } else if ((!strcmp(argv[i], "-sgml")) ||
                    358:            (!strcmp(argv[i], "--sgml"))) {
                    359:            sgml++;
                    360:        } else if ((!strcmp(argv[i], "-create")) ||
                    361:            (!strcmp(argv[i], "--create"))) {
                    362:            create++;
                    363:        } else if ((!strcmp(argv[i], "-convert")) ||
                    364:            (!strcmp(argv[i], "--convert"))) {
                    365:            convert++;
                    366:        } else if ((!strcmp(argv[i], "-no-super-update")) ||
                    367:            (!strcmp(argv[i], "--no-super-update"))) {
                    368:            no_super_update++;
                    369:        } else if ((!strcmp(argv[i], "-add")) ||
                    370:            (!strcmp(argv[i], "--add"))) {
                    371:            if (sgml)
                    372:                i += 2;
                    373:            else
                    374:                i += 3;
                    375:            add++;
                    376:        } else if ((!strcmp(argv[i], "-del")) ||
                    377:            (!strcmp(argv[i], "--del"))) {
                    378:            i += 1;
                    379:            del++;
                    380:        } else {
                    381:            fprintf(stderr, "Unknown option %s\n", argv[i]);
                    382:            usage(argv[0]);
                    383:            return(1);
                    384:        }
                    385:     }
                    386: 
                    387:     for (i = 1; i < argc; i++) {
                    388:        if ((!strcmp(argv[i], "-add")) ||
                    389:            (!strcmp(argv[i], "--add"))) {
                    390:            if (sgml)
                    391:                i += 2;
                    392:            else
                    393:                i += 3;
                    394:            continue;
                    395:        } else if ((!strcmp(argv[i], "-del")) ||
                    396:            (!strcmp(argv[i], "--del"))) {
                    397:            i += 1;
                    398: 
                    399:            /* No catalog entry specified */
                    400:            if (i == argc || (sgml && i + 1 == argc)) {
                    401:                fprintf(stderr, "No catalog entry specified to remove from\n");
                    402:                usage (argv[0]);
                    403:                return(1);
                    404:            }
                    405: 
                    406:            continue;
                    407:        } else if (argv[i][0] == '-')
                    408:            continue;
                    409:        filename = argv[i];
                    410:            ret = xmlLoadCatalog(argv[i]);
                    411:            if ((ret < 0) && (create)) {
                    412:                xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
                    413:            }
                    414:        break;
                    415:     }
                    416: 
                    417:     if (convert)
                    418:         ret = xmlCatalogConvert();
                    419: 
                    420:     if ((add) || (del)) {
                    421:        for (i = 1; i < argc ; i++) {
                    422:            if (!strcmp(argv[i], "-"))
                    423:                break;
                    424: 
                    425:            if (argv[i][0] != '-')
                    426:                continue;
                    427:            if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
                    428:                strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
                    429:                continue;
                    430: 
                    431:            if (sgml) {
                    432:                /*
                    433:                 * Maintenance of SGML catalogs.
                    434:                 */
                    435:                xmlCatalogPtr catal = NULL;
                    436:                xmlCatalogPtr super = NULL;
                    437: 
                    438:                catal = xmlLoadSGMLSuperCatalog(argv[i + 1]);
                    439: 
                    440:                if ((!strcmp(argv[i], "-add")) ||
                    441:                    (!strcmp(argv[i], "--add"))) {
                    442:                    if (catal == NULL)
                    443:                        catal = xmlNewCatalog(1);
                    444:                    xmlACatalogAdd(catal, BAD_CAST "CATALOG",
                    445:                                         BAD_CAST argv[i + 2], NULL);
                    446: 
                    447:                    if (!no_super_update) {
                    448:                        super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
                    449:                        if (super == NULL)
                    450:                            super = xmlNewCatalog(1);
                    451: 
                    452:                        xmlACatalogAdd(super, BAD_CAST "CATALOG",
                    453:                                             BAD_CAST argv[i + 1], NULL);
                    454:                    }
                    455:                } else {
                    456:                    if (catal != NULL)
                    457:                        ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
                    458:                    else
                    459:                        ret = -1;
                    460:                    if (ret < 0) {
                    461:                        fprintf(stderr, "Failed to remove entry from %s\n",
                    462:                                argv[i + 1]);
                    463:                        exit_value = 1;
                    464:                    }
                    465:                    if ((!no_super_update) && (noout) && (catal != NULL) &&
                    466:                        (xmlCatalogIsEmpty(catal))) {
                    467:                        super = xmlLoadSGMLSuperCatalog(
                    468:                                   XML_SGML_DEFAULT_CATALOG);
                    469:                        if (super != NULL) {
                    470:                            ret = xmlACatalogRemove(super,
                    471:                                    BAD_CAST argv[i + 1]);
                    472:                            if (ret < 0) {
                    473:                                fprintf(stderr,
                    474:                                        "Failed to remove entry from %s\n",
                    475:                                        XML_SGML_DEFAULT_CATALOG);
                    476:                                exit_value = 1;
                    477:                            }
                    478:                        }
                    479:                    }
                    480:                }
                    481:                if (noout) {
                    482:                    FILE *out;
                    483: 
                    484:                    if (xmlCatalogIsEmpty(catal)) {
                    485:                        remove(argv[i + 1]);
                    486:                    } else {
                    487:                        out = fopen(argv[i + 1], "w");
                    488:                        if (out == NULL) {
                    489:                            fprintf(stderr, "could not open %s for saving\n",
                    490:                                    argv[i + 1]);
                    491:                            exit_value = 2;
                    492:                            noout = 0;
                    493:                        } else {
                    494:                            xmlACatalogDump(catal, out);
                    495:                            fclose(out);
                    496:                        }
                    497:                    }
                    498:                    if (!no_super_update && super != NULL) {
                    499:                        if (xmlCatalogIsEmpty(super)) {
                    500:                            remove(XML_SGML_DEFAULT_CATALOG);
                    501:                        } else {
                    502:                            out = fopen(XML_SGML_DEFAULT_CATALOG, "w");
                    503:                            if (out == NULL) {
                    504:                                fprintf(stderr,
                    505:                                        "could not open %s for saving\n",
                    506:                                        XML_SGML_DEFAULT_CATALOG);
                    507:                                exit_value = 2;
                    508:                                noout = 0;
                    509:                            } else {
1.1.1.2 ! misho     510: 
1.1       misho     511:                                xmlACatalogDump(super, out);
                    512:                                fclose(out);
                    513:                            }
                    514:                        }
                    515:                    }
                    516:                } else {
                    517:                    xmlACatalogDump(catal, stdout);
                    518:                }
                    519:                i += 2;
                    520:            } else {
                    521:                if ((!strcmp(argv[i], "-add")) ||
                    522:                    (!strcmp(argv[i], "--add"))) {
                    523:                        if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
                    524:                            ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL,
                    525:                                                BAD_CAST argv[i + 2]);
                    526:                        else
                    527:                            ret = xmlCatalogAdd(BAD_CAST argv[i + 1],
                    528:                                                BAD_CAST argv[i + 2],
                    529:                                                BAD_CAST argv[i + 3]);
                    530:                        if (ret != 0) {
                    531:                            printf("add command failed\n");
                    532:                            exit_value = 3;
                    533:                        }
                    534:                        i += 3;
                    535:                } else if ((!strcmp(argv[i], "-del")) ||
                    536:                    (!strcmp(argv[i], "--del"))) {
                    537:                    ret = xmlCatalogRemove(BAD_CAST argv[i + 1]);
                    538:                    if (ret < 0) {
                    539:                        fprintf(stderr, "Failed to remove entry %s\n",
                    540:                                argv[i + 1]);
                    541:                        exit_value = 1;
                    542:                    }
                    543:                    i += 1;
                    544:                }
                    545:            }
                    546:        }
1.1.1.2 ! misho     547: 
1.1       misho     548:     } else if (shell) {
                    549:        usershell();
                    550:     } else {
                    551:        for (i++; i < argc; i++) {
                    552:            xmlURIPtr uri;
                    553:            xmlChar *ans;
1.1.1.2 ! misho     554: 
1.1       misho     555:            uri = xmlParseURI(argv[i]);
                    556:            if (uri == NULL) {
                    557:                ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
                    558:                if (ans == NULL) {
                    559:                    printf("No entry for PUBLIC %s\n", argv[i]);
                    560:                    exit_value = 4;
                    561:                } else {
                    562:                    printf("%s\n", (char *) ans);
                    563:                    xmlFree(ans);
                    564:                }
                    565:            } else {
                    566:                 xmlFreeURI(uri);
                    567:                ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
                    568:                if (ans == NULL) {
                    569:                    printf("No entry for SYSTEM %s\n", argv[i]);
                    570:                    ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
                    571:                    if (ans == NULL) {
                    572:                        printf ("No entry for URI %s\n", argv[i]);
                    573:                        exit_value = 4;
                    574:                    } else {
                    575:                        printf("%s\n", (char *) ans);
                    576:                        xmlFree (ans);
                    577:                    }
                    578:                } else {
                    579:                    printf("%s\n", (char *) ans);
                    580:                    xmlFree(ans);
                    581:                }
                    582:            }
                    583:        }
                    584:     }
                    585:     if ((!sgml) && ((add) || (del) || (create) || (convert))) {
                    586:        if (noout && filename && *filename) {
                    587:            FILE *out;
                    588: 
                    589:            out = fopen(filename, "w");
                    590:            if (out == NULL) {
                    591:                fprintf(stderr, "could not open %s for saving\n", filename);
                    592:                exit_value = 2;
                    593:                noout = 0;
                    594:            } else {
                    595:                xmlCatalogDump(out);
                    596:            }
                    597:        } else {
                    598:            xmlCatalogDump(stdout);
                    599:        }
                    600:     }
                    601: 
                    602:     /*
                    603:      * Cleanup and check for memory leaks
                    604:      */
                    605:     xmlCleanupParser();
                    606:     xmlMemoryDump();
                    607:     return(exit_value);
                    608: }
                    609: #else
                    610: int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
                    611:     fprintf(stderr, "libxml was not compiled with catalog and output support\n");
                    612:     return(1);
                    613: }
                    614: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>