Annotation of embedaddon/libxml2/testchar.c, revision 1.1

1.1     ! misho       1: /**
        !             2:  * Test the UTF-8 decoding routines
        !             3:  *
        !             4:  * author: Daniel Veillard
        !             5:  * copy: see Copyright for the status of this software.
        !             6:  */
        !             7: 
        !             8: #include <stdio.h>
        !             9: #include <string.h>
        !            10: #include <libxml/parser.h>
        !            11: #include <libxml/parserInternals.h>
        !            12: 
        !            13: int lastError;
        !            14: 
        !            15: static void errorHandler(void *unused, xmlErrorPtr err) {
        !            16:     if ((unused == NULL) && (err != NULL) && (lastError == 0)) {
        !            17:         lastError = err->code;
        !            18:     }
        !            19: }
        !            20: 
        !            21: char document1[100] = "<doc>XXXX</doc>";
        !            22: char document2[100] = "<doc foo='XXXX'/>";
        !            23: 
        !            24: static void testDocumentRangeByte1(xmlParserCtxtPtr ctxt, char *document,
        !            25:                   int len,  char *data, int forbid1, int forbid2) {
        !            26:     int i;
        !            27:     xmlDocPtr res;
        !            28: 
        !            29:     for (i = 0;i <= 0xFF;i++) {
        !            30:        lastError = 0;
        !            31:        xmlCtxtReset(ctxt);
        !            32: 
        !            33:         data[0] = i;
        !            34: 
        !            35:        res = xmlReadMemory(document, len, "test", NULL, 0);
        !            36: 
        !            37:        if ((i == forbid1) || (i == forbid2)) {
        !            38:            if ((lastError == 0) || (res != NULL))
        !            39:                fprintf(stderr,
        !            40:                    "Failed to detect invalid char for Byte 0x%02X: %c\n",
        !            41:                        i, i);
        !            42:        }
        !            43: 
        !            44:        else if ((i == '<') || (i == '&')) {
        !            45:            if ((lastError == 0) || (res != NULL))
        !            46:                fprintf(stderr,
        !            47:                    "Failed to detect illegal char %c for Byte 0x%02X\n", i, i);
        !            48:        }
        !            49:        else if (((i < 0x20) || (i >= 0x80)) &&
        !            50:            (i != 0x9) && (i != 0xA) && (i != 0xD)) {
        !            51:            if ((lastError != XML_ERR_INVALID_CHAR) && (res != NULL))
        !            52:                fprintf(stderr,
        !            53:                    "Failed to detect invalid char for Byte 0x%02X\n", i);
        !            54:        }
        !            55:        else if (res == NULL) {
        !            56:            fprintf(stderr,
        !            57:                "Failed to parse valid char for Byte 0x%02X : %c\n", i, i);
        !            58:        }
        !            59:        if (res != NULL)
        !            60:            xmlFreeDoc(res);
        !            61:     }
        !            62: }
        !            63: 
        !            64: static void testDocumentRangeByte2(xmlParserCtxtPtr ctxt, char *document,
        !            65:                   int len,  char *data) {
        !            66:     int i, j;
        !            67:     xmlDocPtr res;
        !            68: 
        !            69:     for (i = 0x80;i <= 0xFF;i++) {
        !            70:     for (j = 0;j <= 0xFF;j++) {
        !            71:        lastError = 0;
        !            72:        xmlCtxtReset(ctxt);
        !            73: 
        !            74:         data[0] = i;
        !            75:         data[1] = j;
        !            76: 
        !            77:        res = xmlReadMemory(document, len, "test", NULL, 0);
        !            78: 
        !            79:        /* if first bit of first char is set, then second bit must too */
        !            80:        if ((i & 0x80) && ((i & 0x40) == 0)) {
        !            81:            if ((lastError == 0) || (res != NULL))
        !            82:                fprintf(stderr,
        !            83:                "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
        !            84:                        i, j);
        !            85:        }
        !            86: 
        !            87:        /*
        !            88:         * if first bit of first char is set, then second char first
        !            89:         * bits must be 10
        !            90:         */
        !            91:        else if ((i & 0x80) && ((j & 0xC0) != 0x80)) {
        !            92:            if ((lastError == 0) || (res != NULL))
        !            93:                fprintf(stderr,
        !            94:            "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
        !            95:                        i, j);
        !            96:        }
        !            97: 
        !            98:        /*
        !            99:         * if using a 2 byte encoding then the value must be greater
        !           100:         * than 0x80, i.e. one of bits 5 to 1 of i must be set
        !           101:         */
        !           102:        else if ((i & 0x80) && ((i & 0x1E) == 0)) {
        !           103:            if ((lastError == 0) || (res != NULL))
        !           104:                fprintf(stderr,
        !           105:            "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
        !           106:                        i, j);
        !           107:        }
        !           108: 
        !           109:        /*
        !           110:         * if third bit of first char is set, then the sequence would need
        !           111:         * at least 3 bytes, but we give only 2 !
        !           112:         */
        !           113:        else if ((i & 0xE0) == 0xE0) {
        !           114:            if ((lastError == 0) || (res != NULL))
        !           115:                fprintf(stderr,
        !           116:            "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n",
        !           117:                        i, j);
        !           118:        }
        !           119: 
        !           120:        /*
        !           121:         * We should see no error in remaning cases
        !           122:         */
        !           123:        else if ((lastError != 0) || (res == NULL)) {
        !           124:            fprintf(stderr, 
        !           125:                "Failed to parse document for Bytes 0x%02X 0x%02X\n", i, j);
        !           126:        }
        !           127:        if (res != NULL)
        !           128:            xmlFreeDoc(res);
        !           129:     }
        !           130:     }
        !           131: }
        !           132: 
        !           133: /**
        !           134:  * testDocumentRanges:
        !           135:  *
        !           136:  * Test the correct UTF8 character parsing in context of XML documents
        !           137:  * Those are in-context injection tests checking the parser behaviour on
        !           138:  * edge case values at different point in content, beginning and end of
        !           139:  * CDATA in text or in attribute values.
        !           140:  */
        !           141: 
        !           142: static void testDocumentRanges(void) {
        !           143:     xmlParserCtxtPtr ctxt;
        !           144:     char *data;
        !           145: 
        !           146:     /*
        !           147:      * Set up a parsing context using the first document as
        !           148:      * the current input source.
        !           149:      */
        !           150:     ctxt = xmlNewParserCtxt();
        !           151:     if (ctxt == NULL) {
        !           152:         fprintf(stderr, "Failed to allocate parser context\n");
        !           153:        return;
        !           154:     }
        !           155: 
        !           156:     printf("testing 1 byte char in document: 1");
        !           157:     fflush(stdout);
        !           158:     data = &document1[5];
        !           159:     data[0] = ' ';
        !           160:     data[1] = ' ';
        !           161:     data[2] = ' ';
        !           162:     data[3] = ' ';
        !           163:     /* test 1 byte injection at beginning of area */
        !           164:     testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
        !           165:                            data, -1, -1);
        !           166:     printf(" 2");
        !           167:     fflush(stdout);
        !           168:     data[0] = ' ';
        !           169:     data[1] = ' ';
        !           170:     data[2] = ' ';
        !           171:     data[3] = ' ';
        !           172:     /* test 1 byte injection at end of area */
        !           173:     testDocumentRangeByte1(ctxt, &document1[0], strlen(document1),
        !           174:                            data + 3, -1, -1);
        !           175: 
        !           176:     printf(" 3");
        !           177:     fflush(stdout);
        !           178:     data = &document2[10];
        !           179:     data[0] = ' ';
        !           180:     data[1] = ' ';
        !           181:     data[2] = ' ';
        !           182:     data[3] = ' ';
        !           183:     /* test 1 byte injection at beginning of area */
        !           184:     testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
        !           185:                            data, '\'', -1);
        !           186:     printf(" 4");
        !           187:     fflush(stdout);
        !           188:     data[0] = ' ';
        !           189:     data[1] = ' ';
        !           190:     data[2] = ' ';
        !           191:     data[3] = ' ';
        !           192:     /* test 1 byte injection at end of area */
        !           193:     testDocumentRangeByte1(ctxt, &document2[0], strlen(document2),
        !           194:                            data + 3, '\'', -1);
        !           195:     printf(" done\n");
        !           196: 
        !           197:     printf("testing 2 byte char in document: 1");
        !           198:     fflush(stdout);
        !           199:     data = &document1[5];
        !           200:     data[0] = ' ';
        !           201:     data[1] = ' ';
        !           202:     data[2] = ' ';
        !           203:     data[3] = ' ';
        !           204:     /* test 2 byte injection at beginning of area */
        !           205:     testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
        !           206:                            data);
        !           207:     printf(" 2");
        !           208:     fflush(stdout);
        !           209:     data[0] = ' ';
        !           210:     data[1] = ' ';
        !           211:     data[2] = ' ';
        !           212:     data[3] = ' ';
        !           213:     /* test 2 byte injection at end of area */
        !           214:     testDocumentRangeByte2(ctxt, &document1[0], strlen(document1),
        !           215:                            data + 2);
        !           216: 
        !           217:     printf(" 3");
        !           218:     fflush(stdout);
        !           219:     data = &document2[10];
        !           220:     data[0] = ' ';
        !           221:     data[1] = ' ';
        !           222:     data[2] = ' ';
        !           223:     data[3] = ' ';
        !           224:     /* test 2 byte injection at beginning of area */
        !           225:     testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
        !           226:                            data);
        !           227:     printf(" 4");
        !           228:     fflush(stdout);
        !           229:     data[0] = ' ';
        !           230:     data[1] = ' ';
        !           231:     data[2] = ' ';
        !           232:     data[3] = ' ';
        !           233:     /* test 2 byte injection at end of area */
        !           234:     testDocumentRangeByte2(ctxt, &document2[0], strlen(document2),
        !           235:                            data + 2);
        !           236:     printf(" done\n");
        !           237: 
        !           238:     xmlFreeParserCtxt(ctxt);
        !           239: }
        !           240: 
        !           241: static void testCharRangeByte1(xmlParserCtxtPtr ctxt, char *data) {
        !           242:     int i = 0;
        !           243:     int len, c;
        !           244: 
        !           245:     data[1] = 0;
        !           246:     data[2] = 0;
        !           247:     data[3] = 0;
        !           248:     for (i = 0;i <= 0xFF;i++) {
        !           249:         data[0] = i;
        !           250:        ctxt->charset = XML_CHAR_ENCODING_UTF8;
        !           251: 
        !           252:        lastError = 0;
        !           253:         c = xmlCurrentChar(ctxt, &len);
        !           254:        if ((i == 0) || (i >= 0x80)) {
        !           255:            /* we must see an error there */
        !           256:            if (lastError != XML_ERR_INVALID_CHAR)
        !           257:                fprintf(stderr,
        !           258:                    "Failed to detect invalid char for Byte 0x%02X\n", i);
        !           259:        } else if (i == 0xD) {
        !           260:            if ((c != 0xA) || (len != 1))
        !           261:                fprintf(stderr, "Failed to convert char for Byte 0x%02X\n", i);
        !           262:        } else if ((c != i) || (len != 1)) {
        !           263:            fprintf(stderr, "Failed to parse char for Byte 0x%02X\n", i);
        !           264:        }
        !           265:     }
        !           266: }
        !           267: 
        !           268: static void testCharRangeByte2(xmlParserCtxtPtr ctxt, char *data) {
        !           269:     int i, j;
        !           270:     int len, c;
        !           271: 
        !           272:     data[2] = 0;
        !           273:     data[3] = 0;
        !           274:     for (i = 0x80;i <= 0xFF;i++) {
        !           275:        for (j = 0;j <= 0xFF;j++) {
        !           276:            data[0] = i;
        !           277:            data[1] = j;
        !           278:            ctxt->charset = XML_CHAR_ENCODING_UTF8;
        !           279: 
        !           280:            lastError = 0;
        !           281:            c = xmlCurrentChar(ctxt, &len);
        !           282: 
        !           283:            /* if first bit of first char is set, then second bit must too */
        !           284:            if ((i & 0x80) && ((i & 0x40) == 0)) {
        !           285:                if (lastError != XML_ERR_INVALID_CHAR)
        !           286:                    fprintf(stderr,
        !           287:                    "Failed to detect invalid char for Bytes 0x%02X 0x%02X\n",
        !           288:                            i, j);
        !           289:            }
        !           290: 
        !           291:            /*
        !           292:             * if first bit of first char is set, then second char first
        !           293:             * bits must be 10
        !           294:             */
        !           295:            else if ((i & 0x80) && ((j & 0xC0) != 0x80)) {
        !           296:                if (lastError != XML_ERR_INVALID_CHAR)
        !           297:                    fprintf(stderr,
        !           298:                "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n",
        !           299:                            i, j, c);
        !           300:            }
        !           301: 
        !           302:            /*
        !           303:             * if using a 2 byte encoding then the value must be greater
        !           304:             * than 0x80, i.e. one of bits 5 to 1 of i must be set
        !           305:             */
        !           306:            else if ((i & 0x80) && ((i & 0x1E) == 0)) {
        !           307:                if (lastError != XML_ERR_INVALID_CHAR)
        !           308:                    fprintf(stderr,
        !           309:                "Failed to detect invalid char for Bytes 0x%02X 0x%02X: %d\n",
        !           310:                            i, j, c);
        !           311:            }
        !           312: 
        !           313:            /*
        !           314:             * if third bit of first char is set, then the sequence would need
        !           315:             * at least 3 bytes, but we give only 2 !
        !           316:             */
        !           317:            else if ((i & 0xE0) == 0xE0) {
        !           318:                if (lastError != XML_ERR_INVALID_CHAR)
        !           319:                    fprintf(stderr,
        !           320:                "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x00\n",
        !           321:                            i, j);
        !           322:            }
        !           323: 
        !           324:             /*
        !           325:             * We should see no error in remaning cases
        !           326:             */
        !           327:            else if ((lastError != 0) || (len != 2)) {
        !           328:                fprintf(stderr,
        !           329:                    "Failed to parse char for Bytes 0x%02X 0x%02X\n", i, j);
        !           330:            }
        !           331: 
        !           332:             /*
        !           333:             * Finally check the value is right
        !           334:             */
        !           335:            else if (c != (j & 0x3F) + ((i & 0x1F) << 6)) {
        !           336:                fprintf(stderr,
        !           337:        "Failed to parse char for Bytes 0x%02X 0x%02X: expect %d got %d\n",
        !           338:                        i, j, ((j & 0x3F) + ((i & 0x1F) << 6)), c);
        !           339:            }
        !           340:         }
        !           341:     }
        !           342: }
        !           343: 
        !           344: static void testCharRangeByte3(xmlParserCtxtPtr ctxt, char *data) {
        !           345:     int i, j, k, K;
        !           346:     int len, c;
        !           347:     unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF};
        !           348:     int value;
        !           349: 
        !           350:     data[3] = 0;
        !           351:     for (i = 0xE0;i <= 0xFF;i++) {
        !           352:     for (j = 0;j <= 0xFF;j++) {
        !           353:     for (k = 0;k < 6;k++) {
        !           354:        data[0] = i;
        !           355:        data[1] = j;
        !           356:        K = lows[k];
        !           357:        data[2] = (char) K;
        !           358:        value = (K & 0x3F) + ((j & 0x3F) << 6) + ((i & 0xF) << 12);
        !           359:        ctxt->charset = XML_CHAR_ENCODING_UTF8;
        !           360: 
        !           361:        lastError = 0;
        !           362:        c = xmlCurrentChar(ctxt, &len);
        !           363: 
        !           364:        /*
        !           365:         * if fourth bit of first char is set, then the sequence would need
        !           366:         * at least 4 bytes, but we give only 3 !
        !           367:         */
        !           368:        if ((i & 0xF0) == 0xF0) {
        !           369:            if (lastError != XML_ERR_INVALID_CHAR)
        !           370:                fprintf(stderr,
        !           371:        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
        !           372:                        i, j, K, data[3]);
        !           373:        }
        !           374: 
        !           375:         /*
        !           376:         * The second and the third bytes must start with 10
        !           377:         */
        !           378:        else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80)) {
        !           379:            if (lastError != XML_ERR_INVALID_CHAR)
        !           380:                fprintf(stderr,
        !           381:        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n",
        !           382:                        i, j, K);
        !           383:        }
        !           384: 
        !           385:        /*
        !           386:         * if using a 3 byte encoding then the value must be greater
        !           387:         * than 0x800, i.e. one of bits 4 to 0 of i must be set or
        !           388:         * the 6th byte of data[1] must be set
        !           389:         */
        !           390:        else if (((i & 0xF) == 0) && ((j & 0x20) == 0)) {
        !           391:            if (lastError != XML_ERR_INVALID_CHAR)
        !           392:                fprintf(stderr,
        !           393:            "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X\n",
        !           394:                        i, j, K);
        !           395:        }
        !           396: 
        !           397:         /*
        !           398:         * There are values in that range that are not allowed in XML-1.0
        !           399:         */
        !           400:        else if (((value > 0xD7FF) && (value <0xE000)) ||
        !           401:                 ((value > 0xFFFD) && (value <0x10000))) {
        !           402:            if (lastError != XML_ERR_INVALID_CHAR)
        !           403:                fprintf(stderr,
        !           404:        "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X\n",
        !           405:                        value, i, j, K);
        !           406:        }
        !           407: 
        !           408:        /*
        !           409:         * We should see no error in remaining cases
        !           410:         */
        !           411:        else if ((lastError != 0) || (len != 3)) {
        !           412:            fprintf(stderr, 
        !           413:                "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n",
        !           414:                    i, j, K);
        !           415:        }
        !           416: 
        !           417:        /*
        !           418:         * Finally check the value is right
        !           419:         */
        !           420:        else if (c != value) {
        !           421:            fprintf(stderr, 
        !           422:     "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n",
        !           423:                i, j, data[2], value, c);
        !           424:        }
        !           425:     }
        !           426:     }
        !           427:     }
        !           428: }
        !           429: 
        !           430: static void testCharRangeByte4(xmlParserCtxtPtr ctxt, char *data) {
        !           431:     int i, j, k, K, l, L;
        !           432:     int len, c;
        !           433:     unsigned char lows[6] = {0, 0x80, 0x81, 0xC1, 0xFF, 0xBF};
        !           434:     int value;
        !           435: 
        !           436:     data[4] = 0;
        !           437:     for (i = 0xF0;i <= 0xFF;i++) {
        !           438:     for (j = 0;j <= 0xFF;j++) {
        !           439:     for (k = 0;k < 6;k++) {
        !           440:     for (l = 0;l < 6;l++) {
        !           441:        data[0] = i;
        !           442:        data[1] = j;
        !           443:        K = lows[k];
        !           444:        data[2] = (char) K;
        !           445:        L = lows[l];
        !           446:        data[3] = (char) L;
        !           447:        value = (L & 0x3F) + ((K & 0x3F) << 6) + ((j & 0x3F) << 12) +
        !           448:                ((i & 0x7) << 18);
        !           449:        ctxt->charset = XML_CHAR_ENCODING_UTF8;
        !           450: 
        !           451:        lastError = 0;
        !           452:        c = xmlCurrentChar(ctxt, &len);
        !           453: 
        !           454:        /*
        !           455:         * if fifth bit of first char is set, then the sequence would need
        !           456:         * at least 5 bytes, but we give only 4 !
        !           457:         */
        !           458:        if ((i & 0xF8) == 0xF8) {
        !           459:            if (lastError != XML_ERR_INVALID_CHAR)
        !           460:                fprintf(stderr,
        !           461:   "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
        !           462:                        i, j, K, data[3]);
        !           463:        }
        !           464: 
        !           465:         /*
        !           466:         * The second, third and fourth bytes must start with 10
        !           467:         */
        !           468:        else if (((j & 0xC0) != 0x80) || ((K & 0xC0) != 0x80) ||
        !           469:                 ((L & 0xC0) != 0x80)) {
        !           470:            if (lastError != XML_ERR_INVALID_CHAR)
        !           471:                fprintf(stderr,
        !           472:        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
        !           473:                        i, j, K, L);
        !           474:        }
        !           475: 
        !           476:        /*
        !           477:         * if using a 3 byte encoding then the value must be greater
        !           478:         * than 0x10000, i.e. one of bits 3 to 0 of i must be set or
        !           479:         * the 6 or 5th byte of j must be set
        !           480:         */
        !           481:        else if (((i & 0x7) == 0) && ((j & 0x30) == 0)) {
        !           482:            if (lastError != XML_ERR_INVALID_CHAR)
        !           483:                fprintf(stderr,
        !           484:        "Failed to detect invalid char for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
        !           485:                        i, j, K, L);
        !           486:        }
        !           487: 
        !           488:         /*
        !           489:         * There are values in that range that are not allowed in XML-1.0
        !           490:         */
        !           491:        else if (((value > 0xD7FF) && (value <0xE000)) ||
        !           492:                 ((value > 0xFFFD) && (value <0x10000)) || 
        !           493:                 (value > 0x10FFFF)) {
        !           494:            if (lastError != XML_ERR_INVALID_CHAR)
        !           495:                fprintf(stderr,
        !           496: "Failed to detect invalid char 0x%04X for Bytes 0x%02X 0x%02X 0x%02X 0x%02X\n",
        !           497:                        value, i, j, K, L);
        !           498:        }
        !           499: 
        !           500:        /*
        !           501:         * We should see no error in remaining cases
        !           502:         */
        !           503:        else if ((lastError != 0) || (len != 4)) {
        !           504:            fprintf(stderr, 
        !           505:                "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X\n",
        !           506:                    i, j, K);
        !           507:        }
        !           508: 
        !           509:        /*
        !           510:         * Finally check the value is right
        !           511:         */
        !           512:        else if (c != value) {
        !           513:            fprintf(stderr, 
        !           514:     "Failed to parse char for Bytes 0x%02X 0x%02X 0x%02X: expect %d got %d\n",
        !           515:                i, j, data[2], value, c);
        !           516:        }
        !           517:     }
        !           518:     }
        !           519:     }
        !           520:     }
        !           521: }
        !           522: 
        !           523: /**
        !           524:  * testCharRanges:
        !           525:  *
        !           526:  * Test the correct UTF8 character parsing in isolation i.e.
        !           527:  * not when parsing a full document, this is less expensive and we can
        !           528:  * cover the full range of UTF-8 chars accepted by XML-1.0
        !           529:  */
        !           530: 
        !           531: static void testCharRanges(void) {
        !           532:     char data[5];
        !           533:     xmlParserCtxtPtr ctxt;
        !           534:     xmlParserInputBufferPtr buf;
        !           535:     xmlParserInputPtr input;
        !           536: 
        !           537:     memset(data, 0, 5);
        !           538: 
        !           539:     /*
        !           540:      * Set up a parsing context using the above data buffer as
        !           541:      * the current input source.
        !           542:      */
        !           543:     ctxt = xmlNewParserCtxt();
        !           544:     if (ctxt == NULL) {
        !           545:         fprintf(stderr, "Failed to allocate parser context\n");
        !           546:        return;
        !           547:     }
        !           548:     buf = xmlParserInputBufferCreateStatic(data, sizeof(data),
        !           549:                                            XML_CHAR_ENCODING_NONE);
        !           550:     if (buf == NULL) {
        !           551:         fprintf(stderr, "Failed to allocate input buffer\n");
        !           552:        goto error;
        !           553:     }
        !           554:     input = xmlNewInputStream(ctxt);
        !           555:     if (input == NULL) {
        !           556:         xmlFreeParserInputBuffer(buf);
        !           557:        goto error;
        !           558:     }
        !           559:     input->filename = NULL;
        !           560:     input->buf = buf;
        !           561:     input->base = input->buf->buffer->content;
        !           562:     input->cur = input->buf->buffer->content;
        !           563:     input->end = &input->buf->buffer->content[4];
        !           564:     inputPush(ctxt, input);
        !           565: 
        !           566:     printf("testing char range: 1");
        !           567:     fflush(stdout);
        !           568:     testCharRangeByte1(ctxt, data);
        !           569:     printf(" 2");
        !           570:     fflush(stdout);
        !           571:     testCharRangeByte2(ctxt, data);
        !           572:     printf(" 3");
        !           573:     fflush(stdout);
        !           574:     testCharRangeByte3(ctxt, data);
        !           575:     printf(" 4");
        !           576:     fflush(stdout);
        !           577:     testCharRangeByte4(ctxt, data);
        !           578:     printf(" done\n");
        !           579:     fflush(stdout);
        !           580: 
        !           581: error:
        !           582:     xmlFreeParserCtxt(ctxt);
        !           583: }
        !           584: 
        !           585: int main(void) {
        !           586: 
        !           587:     /*
        !           588:      * this initialize the library and check potential ABI mismatches
        !           589:      * between the version it was compiled for and the actual shared
        !           590:      * library used.
        !           591:      */
        !           592:     LIBXML_TEST_VERSION
        !           593: 
        !           594:     /*
        !           595:      * Catch errors separately
        !           596:      */
        !           597: 
        !           598:     xmlSetStructuredErrorFunc(NULL, errorHandler);
        !           599: 
        !           600:     /*
        !           601:      * Run the tests
        !           602:      */
        !           603:     testCharRanges();
        !           604:     testDocumentRanges();
        !           605: 
        !           606:     /*
        !           607:      * Cleanup function for the XML library.
        !           608:      */
        !           609:     xmlCleanupParser();
        !           610:     /*
        !           611:      * this is to debug memory for regression tests
        !           612:      */
        !           613:     xmlMemoryDump();
        !           614:     return(0);
        !           615: }

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