File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / testdict.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 23:37:58 2012 UTC (12 years, 3 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, v2_8_0p0, v2_8_0, v2_7_8, HEAD
libxml2

    1: #include <string.h>
    2: #include <libxml/parser.h>
    3: #include <libxml/dict.h>
    4: 
    5: /* #define WITH_PRINT */
    6: 
    7: static const char *seeds1[] = {
    8:    "a", "b", "c",
    9:    "d", "e", "f",
   10:    "g", "h", "i",
   11:    "j", "k", "l",
   12: 
   13:    NULL
   14: };
   15: 
   16: static const char *seeds2[] = {
   17:    "m", "n", "o",
   18:    "p", "q", "r",
   19:    "s", "t", "u",
   20:    "v", "w", "x",
   21: 
   22:    NULL
   23: };
   24: 
   25: #define NB_STRINGS_NS 100
   26: #define NB_STRINGS_MAX 10000
   27: #define NB_STRINGS_MIN 10
   28: 
   29: static xmlChar *strings1[NB_STRINGS_MAX];
   30: static xmlChar *strings2[NB_STRINGS_MAX];
   31: static const xmlChar *test1[NB_STRINGS_MAX];
   32: static const xmlChar *test2[NB_STRINGS_MAX];
   33: static int nbErrors = 0;
   34: 
   35: static void fill_strings(void) {
   36:     int i, j, k;
   37: 
   38:     /*
   39:      * That's a bit nasty but the output is fine and it doesn't take hours
   40:      * there is a small but sufficient number of duplicates, and we have
   41:      * ":xxx" and full QNames in the last NB_STRINGS_NS values
   42:      */
   43:     for (i = 0; seeds1[i] != NULL; i++) {
   44:         strings1[i] = xmlStrdup((const xmlChar *) seeds1[i]);
   45: 	if (strings1[i] == NULL) {
   46: 	    fprintf(stderr, "Out of memory while generating strings1\n");
   47: 	    exit(1);
   48: 	}
   49:     }
   50:     for (j = 0, k = 0;i < NB_STRINGS_MAX - NB_STRINGS_NS;i++,j++) {
   51:         strings1[i] = xmlStrncatNew(strings1[j], strings1[k], -1);
   52: 	if (strings1[i] == NULL) {
   53: 	    fprintf(stderr, "Out of memory while generating strings1\n");
   54: 	    exit(1);
   55: 	}
   56: 	if (j >= 50) {
   57: 	    j = 0;
   58: 	    k++;
   59: 	}
   60:     }
   61:     for (j = 0; (j < 50) && (i < NB_STRINGS_MAX); i++, j+=2) {
   62:         strings1[i] = xmlStrncatNew(strings1[j], (const xmlChar *) ":", -1);
   63: 	if (strings1[i] == NULL) {
   64: 	    fprintf(stderr, "Out of memory while generating strings1\n");
   65: 	    exit(1);
   66: 	}
   67:     }
   68:     for (j = NB_STRINGS_MAX - NB_STRINGS_NS, k = 0;
   69:          i < NB_STRINGS_MAX;i++,j++) {
   70:         strings1[i] = xmlStrncatNew(strings1[j], strings1[k], -1);
   71: 	if (strings1[i] == NULL) {
   72: 	    fprintf(stderr, "Out of memory while generating strings1\n");
   73: 	    exit(1);
   74: 	}
   75: 	k += 3;
   76: 	if (k >= 50) k = 0;
   77:     }
   78: 
   79:     /*
   80:      * Now do the same with the second pool of strings
   81:      */
   82:     for (i = 0; seeds2[i] != NULL; i++) {
   83:         strings2[i] = xmlStrdup((const xmlChar *) seeds2[i]);
   84: 	if (strings2[i] == NULL) {
   85: 	    fprintf(stderr, "Out of memory while generating strings2\n");
   86: 	    exit(1);
   87: 	}
   88:     }
   89:     for (j = 0, k = 0;i < NB_STRINGS_MAX - NB_STRINGS_NS;i++,j++) {
   90:         strings2[i] = xmlStrncatNew(strings2[j], strings2[k], -1);
   91: 	if (strings2[i] == NULL) {
   92: 	    fprintf(stderr, "Out of memory while generating strings2\n");
   93: 	    exit(1);
   94: 	}
   95: 	if (j >= 50) {
   96: 	    j = 0;
   97: 	    k++;
   98: 	}
   99:     }
  100:     for (j = 0; (j < 50) && (i < NB_STRINGS_MAX); i++, j+=2) {
  101:         strings2[i] = xmlStrncatNew(strings2[j], (const xmlChar *) ":", -1);
  102: 	if (strings2[i] == NULL) {
  103: 	    fprintf(stderr, "Out of memory while generating strings2\n");
  104: 	    exit(1);
  105: 	}
  106:     }
  107:     for (j = NB_STRINGS_MAX - NB_STRINGS_NS, k = 0;
  108:          i < NB_STRINGS_MAX;i++,j++) {
  109:         strings2[i] = xmlStrncatNew(strings2[j], strings2[k], -1);
  110: 	if (strings2[i] == NULL) {
  111: 	    fprintf(stderr, "Out of memory while generating strings2\n");
  112: 	    exit(1);
  113: 	}
  114: 	k += 3;
  115: 	if (k >= 50) k = 0;
  116:     }
  117: 
  118: }
  119: 
  120: #ifdef WITH_PRINT
  121: static void print_strings(void) {
  122:     int i;
  123: 
  124:     for (i = 0; i < NB_STRINGS_MAX;i++) {
  125:         printf("%s\n", strings1[i]);
  126:     }
  127:     for (i = 0; i < NB_STRINGS_MAX;i++) {
  128:         printf("%s\n", strings2[i]);
  129:     }
  130: }
  131: #endif
  132: 
  133: static void clean_strings(void) {
  134:     int i;
  135: 
  136:     for (i = 0; i < NB_STRINGS_MAX; i++) {
  137:         if (strings1[i] != NULL) /* really should not happen */
  138: 	    xmlFree(strings1[i]);
  139:     }
  140:     for (i = 0; i < NB_STRINGS_MAX; i++) {
  141:         if (strings2[i] != NULL) /* really should not happen */
  142: 	    xmlFree(strings2[i]);
  143:     }
  144: }
  145: 
  146: /*
  147:  * This tests the sub-dictionary support
  148:  */
  149: static int run_test2(xmlDictPtr parent) {
  150:     int i, j;
  151:     xmlDictPtr dict;
  152:     int ret = 0;
  153:     xmlChar prefix[40];
  154:     xmlChar *cur, *pref;
  155:     const xmlChar *tmp;
  156: 
  157:     dict = xmlDictCreateSub(parent);
  158:     if (dict == NULL) {
  159: 	fprintf(stderr, "Out of memory while creating sub-dictionary\n");
  160: 	exit(1);
  161:     }
  162:     memset(test2, 0, sizeof(test2));
  163: 
  164:     /*
  165:      * Fill in NB_STRINGS_MIN, at this point the dictionary should not grow
  166:      * and we allocate all those doing the fast key computations
  167:      * All the strings are based on a different seeds subset so we know
  168:      * they are allocated in the main dictionary, not coming from the parent
  169:      */
  170:     for (i = 0;i < NB_STRINGS_MIN;i++) {
  171:         test2[i] = xmlDictLookup(dict, strings2[i], -1);
  172: 	if (test2[i] == NULL) {
  173: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings2[i]);
  174: 	    ret = 1;
  175: 	    nbErrors++;
  176: 	}
  177:     }
  178:     j = NB_STRINGS_MAX - NB_STRINGS_NS;
  179:     /* ":foo" like strings2 */
  180:     for (i = 0;i < NB_STRINGS_MIN;i++, j++) {
  181:         test2[j] = xmlDictLookup(dict, strings2[j], xmlStrlen(strings2[j]));
  182: 	if (test2[j] == NULL) {
  183: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings2[j]);
  184: 	    ret = 1;
  185: 	    nbErrors++;
  186: 	}
  187:     }
  188:     /* "a:foo" like strings2 */
  189:     j = NB_STRINGS_MAX - NB_STRINGS_MIN;
  190:     for (i = 0;i < NB_STRINGS_MIN;i++, j++) {
  191:         test2[j] = xmlDictLookup(dict, strings2[j], xmlStrlen(strings2[j]));
  192: 	if (test2[j] == NULL) {
  193: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings2[j]);
  194: 	    ret = 1;
  195: 	    nbErrors++;
  196: 	}
  197:     }
  198: 
  199:     /*
  200:      * At this point allocate all the strings
  201:      * the dictionary will grow in the process, reallocate more string tables
  202:      * and switch to the better key generator
  203:      */
  204:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  205:         if (test2[i] != NULL)
  206: 	    continue;
  207: 	test2[i] = xmlDictLookup(dict, strings2[i], -1);
  208: 	if (test2[i] == NULL) {
  209: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings2[i]);
  210: 	    ret = 1;
  211: 	    nbErrors++;
  212: 	}
  213:     }
  214: 
  215:     /*
  216:      * Now we can start to test things, first that all strings2 belongs to
  217:      * the dict, and that none of them was actually allocated in the parent
  218:      */
  219:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  220:         if (!xmlDictOwns(dict, test2[i])) {
  221: 	    fprintf(stderr, "Failed ownership failure for '%s'\n",
  222: 	            strings2[i]);
  223: 	    ret = 1;
  224: 	    nbErrors++;
  225: 	}
  226:         if (xmlDictOwns(parent, test2[i])) {
  227: 	    fprintf(stderr, "Failed parent ownership failure for '%s'\n",
  228: 	            strings2[i]);
  229: 	    ret = 1;
  230: 	    nbErrors++;
  231: 	}
  232:     }
  233: 
  234:     /*
  235:      * Also verify that all strings from the parent are seen from the subdict
  236:      */
  237:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  238:         if (!xmlDictOwns(dict, test1[i])) {
  239: 	    fprintf(stderr, "Failed sub-ownership failure for '%s'\n",
  240: 	            strings1[i]);
  241: 	    ret = 1;
  242: 	    nbErrors++;
  243: 	}
  244:     }
  245: 
  246:     /*
  247:      * Then that another lookup to the string in sub will return the same
  248:      */
  249:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  250:         if (xmlDictLookup(dict, strings2[i], -1) != test2[i]) {
  251: 	    fprintf(stderr, "Failed re-lookup check for %d, '%s'\n",
  252: 	            i, strings2[i]);
  253: 	    ret = 1;
  254: 	    nbErrors++;
  255: 	}
  256:     }
  257:     /*
  258:      * But also that any lookup for a string in the parent will be provided
  259:      * as in the parent
  260:      */
  261:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  262:         if (xmlDictLookup(dict, strings1[i], -1) != test1[i]) {
  263: 	    fprintf(stderr, "Failed parent string lookup check for %d, '%s'\n",
  264: 	            i, strings1[i]);
  265: 	    ret = 1;
  266: 	    nbErrors++;
  267: 	}
  268:     }
  269: 
  270:     /*
  271:      * check the QName lookups
  272:      */
  273:     for (i = NB_STRINGS_MAX - NB_STRINGS_NS;i < NB_STRINGS_MAX;i++) {
  274:         cur = strings2[i];
  275: 	pref = &prefix[0];
  276: 	while (*cur != ':') *pref++ = *cur++;
  277: 	cur++;
  278: 	*pref = 0;
  279: 	tmp = xmlDictQLookup(dict, &prefix[0], cur);
  280: 	if (xmlDictQLookup(dict, &prefix[0], cur) != test2[i]) {
  281: 	    fprintf(stderr, "Failed lookup check for '%s':'%s'\n",
  282: 	            &prefix[0], cur);
  283:             ret = 1;
  284: 	    nbErrors++;
  285: 	}
  286:     }
  287:     /*
  288:      * check the QName lookups for strings from the parent
  289:      */
  290:     for (i = NB_STRINGS_MAX - NB_STRINGS_NS;i < NB_STRINGS_MAX;i++) {
  291:         cur = strings1[i];
  292: 	pref = &prefix[0];
  293: 	while (*cur != ':') *pref++ = *cur++;
  294: 	cur++;
  295: 	*pref = 0;
  296: 	tmp = xmlDictQLookup(dict, &prefix[0], cur);
  297: 	if (xmlDictQLookup(dict, &prefix[0], cur) != test1[i]) {
  298: 	    fprintf(stderr, "Failed parent lookup check for '%s':'%s'\n",
  299: 	            &prefix[0], cur);
  300:             ret = 1;
  301: 	    nbErrors++;
  302: 	}
  303:     }
  304: 
  305:     xmlDictFree(dict);
  306:     return(ret);
  307: }
  308: 
  309: /*
  310:  * Test a single dictionary
  311:  */
  312: static int run_test1(void) {
  313:     int i, j;
  314:     xmlDictPtr dict;
  315:     int ret = 0;
  316:     xmlChar prefix[40];
  317:     xmlChar *cur, *pref;
  318:     const xmlChar *tmp;
  319: 
  320:     dict = xmlDictCreate();
  321:     if (dict == NULL) {
  322: 	fprintf(stderr, "Out of memory while creating dictionary\n");
  323: 	exit(1);
  324:     }
  325:     memset(test1, 0, sizeof(test1));
  326: 
  327:     /*
  328:      * Fill in NB_STRINGS_MIN, at this point the dictionary should not grow
  329:      * and we allocate all those doing the fast key computations
  330:      */
  331:     for (i = 0;i < NB_STRINGS_MIN;i++) {
  332:         test1[i] = xmlDictLookup(dict, strings1[i], -1);
  333: 	if (test1[i] == NULL) {
  334: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings1[i]);
  335: 	    ret = 1;
  336: 	    nbErrors++;
  337: 	}
  338:     }
  339:     j = NB_STRINGS_MAX - NB_STRINGS_NS;
  340:     /* ":foo" like strings1 */
  341:     for (i = 0;i < NB_STRINGS_MIN;i++, j++) {
  342:         test1[j] = xmlDictLookup(dict, strings1[j], xmlStrlen(strings1[j]));
  343: 	if (test1[j] == NULL) {
  344: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings1[j]);
  345: 	    ret = 1;
  346: 	    nbErrors++;
  347: 	}
  348:     }
  349:     /* "a:foo" like strings1 */
  350:     j = NB_STRINGS_MAX - NB_STRINGS_MIN;
  351:     for (i = 0;i < NB_STRINGS_MIN;i++, j++) {
  352:         test1[j] = xmlDictLookup(dict, strings1[j], xmlStrlen(strings1[j]));
  353: 	if (test1[j] == NULL) {
  354: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings1[j]);
  355: 	    ret = 1;
  356: 	    nbErrors++;
  357: 	}
  358:     }
  359: 
  360:     /*
  361:      * At this point allocate all the strings
  362:      * the dictionary will grow in the process, reallocate more string tables
  363:      * and switch to the better key generator
  364:      */
  365:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  366:         if (test1[i] != NULL)
  367: 	    continue;
  368: 	test1[i] = xmlDictLookup(dict, strings1[i], -1);
  369: 	if (test1[i] == NULL) {
  370: 	    fprintf(stderr, "Failed lookup for '%s'\n", strings1[i]);
  371: 	    ret = 1;
  372: 	    nbErrors++;
  373: 	}
  374:     }
  375: 
  376:     /*
  377:      * Now we can start to test things, first that all strings1 belongs to
  378:      * the dict
  379:      */
  380:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  381:         if (!xmlDictOwns(dict, test1[i])) {
  382: 	    fprintf(stderr, "Failed ownership failure for '%s'\n",
  383: 	            strings1[i]);
  384: 	    ret = 1;
  385: 	    nbErrors++;
  386: 	}
  387:     }
  388: 
  389:     /*
  390:      * Then that another lookup to the string will return the same
  391:      */
  392:     for (i = 0;i < NB_STRINGS_MAX;i++) {
  393:         if (xmlDictLookup(dict, strings1[i], -1) != test1[i]) {
  394: 	    fprintf(stderr, "Failed re-lookup check for %d, '%s'\n",
  395: 	            i, strings1[i]);
  396: 	    ret = 1;
  397: 	    nbErrors++;
  398: 	}
  399:     }
  400: 
  401:     /*
  402:      * More complex, check the QName lookups
  403:      */
  404:     for (i = NB_STRINGS_MAX - NB_STRINGS_NS;i < NB_STRINGS_MAX;i++) {
  405:         cur = strings1[i];
  406: 	pref = &prefix[0];
  407: 	while (*cur != ':') *pref++ = *cur++;
  408: 	cur++;
  409: 	*pref = 0;
  410: 	tmp = xmlDictQLookup(dict, &prefix[0], cur);
  411: 	if (xmlDictQLookup(dict, &prefix[0], cur) != test1[i]) {
  412: 	    fprintf(stderr, "Failed lookup check for '%s':'%s'\n",
  413: 	            &prefix[0], cur);
  414:             ret = 1;
  415: 	    nbErrors++;
  416: 	}
  417:     }
  418: 
  419:     run_test2(dict);
  420: 
  421:     xmlDictFree(dict);
  422:     return(ret);
  423: }
  424: 
  425: int main(void)
  426: {
  427:     int ret;
  428: 
  429:     LIBXML_TEST_VERSION
  430:     fill_strings();
  431: #ifdef WITH_PRINT
  432:     print_strings();
  433: #endif
  434:     ret = run_test1();
  435:     if (ret == 0) {
  436:         printf("dictionary tests succeeded %d strings\n", 2 * NB_STRINGS_MAX);
  437:     } else {
  438:         printf("dictionary tests failed with %d errors\n", nbErrors);
  439:     }
  440:     clean_strings();
  441:     xmlCleanupParser();
  442:     xmlMemoryDump();
  443:     return(ret);
  444: }

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