Use c99 instead of ansi due to support int64 in template. Add __LEVEL built-in variab...
authorteodor <teodor>
Fri, 10 Oct 2008 10:20:36 +0000 (10:20 +0000)
committerteodor <teodor>
Fri, 10 Oct 2008 10:20:36 +0000 (10:20 +0000)
Makefile.global
data/template.tmpl
expected/tmpl
template.c
template.h
tmpl_gram.y
tmpl_scan.l

index 3dbeecf..3a64a8b 100644 (file)
@@ -5,7 +5,7 @@ ifndef OS
 OS=$(shell uname)
 endif
 
-CFLAGS=-Wall -pedantic -ansi -O2 -g -DASSERT_CORE -DHAVE_HSTRERROR 
+CFLAGS=-Wall -pedantic -std=c99 -O2 -g -DASSERT_CORE -DHAVE_HSTRERROR 
 ifeq ($(OS), FreeBSD)
 CFLAGS+= -DHAVE_POLL_H
 endif
index d954d08..f2b33e0 100644 (file)
@@ -70,7 +70,7 @@ str ? "yes" : -1 = <% str ? "yes" : -1 %>
 <@ ENDLOOP @>
 
 <@ LOOP selfLoop@>
-       <@if __FIRST @><ul><@endif@><li><% __COUNTER %> <% NODE %>#<% CNT %> ID:<% ^id %>
+       <@if __FIRST @><ul><li>level: <% __LEVEL %><@endif@><li><% __COUNTER %> <% NODE %>#<% CNT %> ID:<% ^id %>
        <@ SELF @>
        <@ LOOP oneloop@><@if __FIRST @><ol><@endif@><li><% __COUNTER %> oneloop:<% NODE %>#<% CNT %> ID:<% ^id %><@if __LAST @></ol><@endif@><@ ENDLOOP @>
        <@if __LAST @></ul><@endif@>
index 9c6cca7..0855ae4 100644 (file)
@@ -148,9 +148,9 @@ str ? "yes" : -1 = -1
 
 
 
-       <ul><li>1 outer#1 ID:23
+       <ul><li>level: 0<li>1 outer#1 ID:23
        
-       <ul><li>1 inner#4 ID:23
+       <ul><li>level: 1<li>1 inner#4 ID:23
        
        
        
@@ -165,7 +165,7 @@ str ? "yes" : -1 = -1
 
        <li>2 outer#6 ID:23
        
-       <ul><li>1 inner#8 ID:23
+       <ul><li>level: 1<li>1 inner#8 ID:23
        
        <ol><li>1 oneloop:subloop3#9 ID:23</ol>
        
@@ -180,14 +180,14 @@ str ? "yes" : -1 = -1
 
        <li>3 outer#11 ID:23
        
-       <ul><li>1 inner#12 ID:23
+       <ul><li>level: 1<li>1 inner#12 ID:23
        
        
        
 
        <li>2 inner#13 ID:23
        
-       <ul><li>1 innerst#14 ID:23
+       <ul><li>level: 2<li>1 innerst#14 ID:23
        
        
        
index b20fb89..9e22f18 100644 (file)
@@ -81,7 +81,7 @@ isVariable(VariableValue value) {
        } else {
                switch (value->type) {
                        case valueInt:
-                               return value->value.intValue;
+                               return (value->value.intValue == 0) ? 0 : 1;
                        case valueString:
                                if ( value->value.stringValue == NULL || *value->value.stringValue == '\0' )
                                        return 0;
@@ -513,6 +513,9 @@ checkSpecialVariable(int flags, char *varName) {
        } else if ( strcmp(varName, "__size") == 0 ) {
                flags &= ~TND_GLOBAL; /* special vars cannot be global */
                flags |= TND___SIZE;
+       } else if ( strcmp(varName, "__level") == 0 ) {
+               flags &= ~TND_GLOBAL; /* special vars cannot be global */
+               flags |= TND___LEVEL;
        }
 
        return flags;
@@ -1013,7 +1016,7 @@ setTemplateValue( TemplateInstance tmpl, char *key) {
 
 
 int
-setTemplateValueInt( TemplateInstance tmpl, char * key, int val ) {
+setTemplateValueInt( TemplateInstance tmpl, char * key, int64_t val ) {
        storage.flags = TND_DEFINED;
        storage.type = valueInt;
        storage.value.intValue = val;
@@ -1085,7 +1088,7 @@ printVal( TemplateInstance tmpl, VariableValue value, int *len, char *format ) {
 
        switch (value->type) {
                case valueInt:
-                       printedlen = snprintf(NULL, 0, (format) ? format : "%d", value->value.intValue);
+                       printedlen = snprintf(NULL, 0, (format) ? format : "%lld", value->value.intValue);
                        break;
                case valueString:
                        if ( value->value.stringValue == NULL || *value->value.stringValue == '\0' )
@@ -1108,7 +1111,7 @@ printVal( TemplateInstance tmpl, VariableValue value, int *len, char *format ) {
 
        switch (value->type) {
                case valueInt:
-                       printedlen = snprintf(res, printedlen+1, (format) ? format : "%d", value->value.intValue);
+                       printedlen = snprintf(res, printedlen+1, (format) ? format : "%lld", value->value.intValue);
                        break;
                case valueString:
                        printedlen = snprintf(res, printedlen+1, (format) ? format : "%s", value->value.stringValue);
@@ -1179,7 +1182,7 @@ executeExpression( TemplateInstance tmpl, TemplateNode node ) {
 }
 
 static void
-printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance ) {
+printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance, int level ) {
        GListCell       *cell;
        VariableValue   value;
        int                             i;
@@ -1238,6 +1241,10 @@ printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance )
                                                        realValue->type = valueInt;
                                                        realValue->flags |= TND_DEFINED;
                                                        realValue->value.intValue = i+1;
+                                               } else if ( value->flags & TND___LEVEL ) {
+                                                       realValue->type = valueInt;
+                                                       realValue->flags |= TND_DEFINED;
+                                                       realValue->value.intValue = level;
                                                } else if ( value->flags & TND___SIZE ) {
                                                        realValue->type = valueInt;
                                                        realValue->flags |= TND_DEFINED;
@@ -1258,7 +1265,7 @@ printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance )
                                        if ( node->nodeData.loop.selfNode ) 
                                                node->nodeData.loop.selfNode->nodeData.nest.savedRowData = rowData;
 
-                                       printNode( tmpl, node->nodeData.loop.bodyNode, NULL );
+                                       printNode( tmpl, node->nodeData.loop.bodyNode, NULL, level );
                                }
                        }
                        break;
@@ -1287,7 +1294,7 @@ printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance )
                                        }
                                }
 
-                               printNode( tmpl, node->nodeData.nest.loop, savedRowData->nestedInstance );
+                               printNode( tmpl, node->nodeData.nest.loop, savedRowData->nestedInstance, level+1 );
 
                                /*
                                 * Restore saved datas
@@ -1317,13 +1324,13 @@ printNode( TemplateInstance tmpl, TemplateNode node, LoopInstance loopInstance )
                        value = executeExpression( tmpl, node->nodeData.condition.expressionNode );
 
                        if ( isVariable(value) ) 
-                               printNode( tmpl, node->nodeData.condition.ifNode, loopInstance );
+                               printNode( tmpl, node->nodeData.condition.ifNode, loopInstance, level );
                        else
-                               printNode( tmpl, node->nodeData.condition.elseNode, loopInstance );
+                               printNode( tmpl, node->nodeData.condition.elseNode, loopInstance, level );
                        break;
                case    CollectionNode:
                        GListForeach( cell, node->nodeData.children ) 
-                               printNode( tmpl, (TemplateNode)GLCELL_DATA(cell), loopInstance );
+                               printNode( tmpl, (TemplateNode)GLCELL_DATA(cell), loopInstance, level );
                        break;
                case    PrintNode:
                        value = executeExpression( tmpl, node->nodeData.condition.expressionNode ); 
@@ -1368,7 +1375,7 @@ printTemplate( TemplateInstance tmpl ) {
        if (!tmpl->tmpl->printString)
                return 1;
 
-       printNode(tmpl, tmpl->tmpl->tree, NULL);
+       printNode(tmpl, tmpl->tmpl->tree, NULL, 0);
 
        return 0;
 }
index 1109dac..9806415 100644 (file)
@@ -70,6 +70,7 @@
  *    __FIRST   - true for first iteration
  *    __LAST    - true for last iteration
  *    __COUNTER - iteration's number
+ *    __LEVEL  - level of nested loop (root == 0)
  *    __SIZE    - number of iterations
  *    __ODD     - true for odd iteraion
  *    __EVEN    - true for even iteraion
@@ -167,10 +168,11 @@ typedef   enum TemplateNodeType {
 #define TND___SIZE                     (0x0040)
 #define TND___ODD                      (0x0080)
 #define TND___EVEN                     (0x0100)
+#define TND___LEVEL                    (0x0200)
 
-#define TND_DEFINED                    (0x0200)
+#define TND_DEFINED                    (0x0400)
 
-#define TND__SPECIALMASK       (TND___FIRST | TND___LAST | TND___COUNTER | TND___SIZE | TND___ODD | TND___EVEN)
+#define TND__SPECIALMASK       (TND___FIRST | TND___LAST | TND___COUNTER | TND___SIZE | TND___ODD | TND___EVEN | TND___LEVEL)
 
 typedef struct TemplateData *Template;
 
@@ -183,7 +185,7 @@ typedef struct VariableValueData {
        TemplateNodeType        type; /* should be first, see resetTemplate/freeTemplate */
        int                                     flags;
        union {
-               int                             intValue;
+               int64_t                 intValue;
                char                    *stringValue;
                time_t                  timeValue;
                int                             boolValue;
@@ -346,7 +348,7 @@ int printTemplate( TemplateInstance tmpl );
 #define TVAR_NOROW             (3)
 #define TVAR_LOOPMARK  (4)
 
-int setTemplateValueInt( TemplateInstance tmpl, char * key, int val );
+int setTemplateValueInt( TemplateInstance tmpl, char * key, int64_t val );
 int setTemplateValueString( TemplateInstance tmpl, char * key, char * val );
 int setTemplateValueTime( TemplateInstance tmpl, char * key, time_t val );
 int setTemplateValueBool( TemplateInstance tmpl, char * key, int val );
index 82267c3..aa7cebc 100644 (file)
@@ -26,7 +26,7 @@ static GList *makeList2(void *a, void *b);
        char                                            *str;
        char                                            punct;
        int                                                     flags;
-       int                                                     intval;
+       int64_t                                         intval;
        double                                          floatval;
        TemplateNode                            node;
        GList                                           *list;
index 81be52f..fdfec53 100644 (file)
@@ -1,4 +1,7 @@
 %{
+#include <stdlib.h>
+#include <limits.h>
+
 #include <tlog.h>
 #include <tmalloc.h>
 #include <template.h>
@@ -97,7 +100,7 @@ DIGIT                [0-9]
                                        }
 
 <xEXPR,xVAR>{DIGIT}+   {
-                                       yylval.intval = atoi(yytext);
+                                       yylval.intval = strtoll(yytext, NULL, 0);
                                                return INTEGER;
                                        }