Add recursive loop to support tree-like structures
[tedtools.git] / tmpltest.c
index 6b54a3d..a605f0b 100644 (file)
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <locale.h>
 
 
 #include "tmalloc.h"
@@ -42,7 +43,7 @@ static void
 usage() {
        puts(
        "Usage:\n"
-       "memtest [-t TEMPLATENAME]\n"
+       "tmpltest [-t TEMPLATENAME]\n"
        );
        exit(1);
 }
@@ -53,6 +54,19 @@ outfunc(char *str, int len) {
        fputs( str, stdout ); 
 }
 
+static int counter = 0;
+
+static VariableValue 
+localCounter(Template tmpl, int nargs, VariableValue *args) {
+       VariableValue out = tmalloc(sizeof(VariableValue));
+
+       out->type = valueInt;
+       out->flags = TND_DEFINED;
+       out->value.intValue = ++counter;
+
+       return out;
+}
+
 extern char *optarg;
 extern int opterr;
 
@@ -61,7 +75,14 @@ main(int argn, char *argv[]) {
        MemoryContext   *base;
        char                    *name = NULL;
        TemplateData    template;
-       int                     i;
+       int                     i,j,k;
+       int                             cnt=0;
+       executeFunctionDescData funcs[] = {
+               {"callcounter", 0, localCounter},
+               {NULL,0,NULL}
+       };
+
+
 
        opentlog(TL_OPEN_STDERR,TL_DEBUG, NULL);
        opterr=0;
@@ -81,14 +102,16 @@ main(int argn, char *argv[]) {
        if (!name)
                usage();
 
+       setlocale(LC_ALL,"ru_RU.UTF-8");
        base = allocMemoryContext(NULL, MC_DEBUG);
 
-       printf("initTemplate: %d\n",  initTemplate(&template, base, ".", name) );
-       /* dumpTemplate(&template); */ 
+       printf("initTemplate: %d\n",  initTemplate(&template, base, funcs, ".", name) );
+       /* dumpTemplate(&template); */
 
        setTemplateValueInt(&template, "ID", 17);
        setTemplateValueUndefined(&template, "emptyID");
        setTemplateValueInt(&template, "zeroid", 0);
+       setTemplateValueString(&template, "str", "QWERTY");
 
        addTemplateRow(&template, "outerLoop");
        setTemplateValueString(&template, "outerLoop.data1", "ha1");
@@ -108,8 +131,72 @@ main(int argn, char *argv[]) {
        template.printString = outfunc;
        printTemplate( &template );
 
+       resetTemplate(&template);
+
+       setTemplateValueInt(&template, "ID", 23);
+       setTemplateValueUndefined(&template, "emptyID");
+       setTemplateValueInt(&template, "zeroid", 0);
+       addTemplateRow(&template, "outerLoop");
+       setTemplateValueString(&template, "outerLoop.data1", "ha1");
+       setTemplateValueInt(&template, "outerLoop.data1", 1234);
+       setTemplateValueString(&template, "outerLoop.data2", "FOO");
+       addTemplateRow(&template, "outerLoop.innerLoop");
+               setTemplateValueString(&template, "outerLoop.innerLoop.camenty", "Again 1");
+
+       for(i=0;i<3;i++) {
+               addTemplateRow(&template,"selfLoop");
+               setTemplateValueInt(&template, "selfLoop.CNT", ++cnt);
+               setTemplateValueString(&template, "selfLoop.NODE", "outer");
+
+               if (i<1) {
+                       addTemplateRow(&template,"selfLoop.oneloop");
+                       setTemplateValueInt(&template, "selfLoop.oneloop.CNT", ++cnt);
+                       setTemplateValueString(&template, "selfLoop.oneloop.NODE", "subloop1");
+               }
+               if (i<2) {
+                       addTemplateRow(&template,"selfLoop.oneloop");
+                       setTemplateValueInt(&template, "selfLoop.oneloop.CNT", ++cnt);
+                       setTemplateValueString(&template, "selfLoop.oneloop.NODE", "subloop2");
+               }
+
+               addTemplateNestedLoop(&template, "selfLoop");
+       
+               for(j=0;j<2;j++) {
+                       addTemplateRow(&template,"selfLoop");
+                       setTemplateValueInt(&template, "selfLoop.CNT", ++cnt);
+                       setTemplateValueString(&template, "selfLoop.NODE", "inner");
+                       if ( i==1 && j==0 ) {
+                               addTemplateRow(&template,"selfLoop.oneloop");
+                               setTemplateValueInt(&template, "selfLoop.oneloop.CNT", ++cnt);
+                               setTemplateValueString(&template, "selfLoop.oneloop.NODE", "subloop3");
+                       }
+                       if (i==2 && j==1) {
+                               addTemplateNestedLoop(&template, "selfLoop");
+                               for(k=0;k<4;k++) {
+                                       addTemplateRow(&template,"selfLoop");
+                                       setTemplateValueInt(&template, "selfLoop.CNT", ++cnt);
+                                       setTemplateValueString(&template, "selfLoop.NODE", "innerst");
+                                       if ( k==2 ) {
+                                               addTemplateRow(&template,"selfLoop.oneloop");
+                                               setTemplateValueInt(&template, "selfLoop.oneloop.CNT", ++cnt);
+                                               setTemplateValueString(&template, "selfLoop.oneloop.NODE", "subloop4");
+                                       }
+                               }
+                               returnTemplateNestedLoop(&template, "selfLoop");
+                       }
+               }
+       
+
+               returnTemplateNestedLoop(&template, "selfLoop");
+       }
+
+       fputs("================================================\n", stdout);
+       printTemplate( &template );
+
+
        resetTemplate(&template);
        freeTemplate(&template);
+
        return 0;
 }