buttons: Added more checking for correct syntax.
[swftools.git] / src / swfc.c
index 05003f8..b993199 100644 (file)
@@ -476,6 +476,11 @@ void s_buttonput(char*character, char*as, parameters_t p)
     character_t* c = dictionary_lookup(&characters, character);
     MATRIX m;
     int flags = 0;
+    char*o = as,*s = as;
+    buttonrecord_t r;
+    if(!stackpos || (stack[stackpos-1].type != 3))  {
+       syntaxerror(".show may only appear in .button");
+    }
     if(!c) {
        syntaxerror("character %s not known (in .shape %s)", character, character);
     }
@@ -485,30 +490,42 @@ void s_buttonput(char*character, char*as, parameters_t p)
    
     m = s_instancepos(c->size, &p);
 
-    buttonrecord_t r;
     r.id = c->id;
     r.matrix = m;
     r.cxform = p.cxform;
     r.set = 1;
+
+    while(1) {
+       if(*s==',' || *s==0) {
+           if(!strncmp(o,"idle",s-o)) mybutton.records[0]=r;
+           else if(!strncmp(o,"shape",s-o)) mybutton.records[0]=r;
+           else if(!strncmp(o,"hover",s-o)) mybutton.records[1]=r;
+           else if(!strncmp(o,"pressed",s-o)) mybutton.records[2]=r;
+           else if(!strncmp(o,"area",s-o)) mybutton.records[3]=r;
+           else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o));
+       }
+       if(!*s)
+           break;
+       s++;
+    }
+    printf("%s\n", as);
+    swf_DumpMatrix(stdout,&mybutton.records[0].matrix);
     
-    if(strstr(as, "idle")) mybutton.records[0]=r;
-    if(strstr(as, "hover")) mybutton.records[1]=r;
-    if(strstr(as, "pressed")) mybutton.records[2]=r;
-    if(strstr(as, "area")) mybutton.records[3]=r;
 }
 static void setbuttonrecords(TAG*tag)
 {
     int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT};
     if(!mybutton.endofshapes) {
        int t;
-       
+               
        if(!mybutton.records[3].set) {
            memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t));
        }
 
        for(t=0;t<4;t++) {
-           if(mybutton.records[t].set)
+           if(mybutton.records[t].set) {
                swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform);
+           }
        }
        swf_SetU8(tag,0); // end of button records
        mybutton.endofshapes = 1;
@@ -537,12 +554,13 @@ void s_buttonaction(int flags, char*action)
 
 static void s_endButton()
 {
+    SRECT r;
     setbuttonrecords(stack[stackpos-1].tag);
     stackpos--;
       
     swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions);
 
-    SRECT r = currentrect;
+    r = currentrect;
 
     tag = stack[stackpos].tag;
     currentrect = stack[stackpos].oldrect;
@@ -2254,6 +2272,7 @@ static int current_button_flags = 0;
 static int c_on_press(map_t*args)
 {
     char*position = lu(args, "position");
+    char*action = "";
     if(!strcmp(position, "inside")) {
        current_button_flags |= BC_OVERUP_OVERDOWN;
     } else if(!strcmp(position, "outside")) {
@@ -2262,7 +2281,6 @@ static int c_on_press(map_t*args)
     } else if(!strcmp(position, "anywhere")) {
        current_button_flags |= /*BC_IDLE_OUTDOWN|*/BC_OVERUP_OVERDOWN|BC_IDLE_OVERDOWN;
     }
-    char*action = "";
     readToken();
     if(type == RAWDATA) {
        action = text;
@@ -2276,6 +2294,7 @@ static int c_on_press(map_t*args)
 static int c_on_release(map_t*args)
 {
     char*position = lu(args, "position");
+    char*action = "";
     if(!strcmp(position, "inside")) {
        current_button_flags |= BC_OVERDOWN_OVERUP;
     } else if(!strcmp(position, "outside")) {
@@ -2283,7 +2302,6 @@ static int c_on_release(map_t*args)
     } else if(!strcmp(position, "anywhere")) {
        current_button_flags |= BC_OVERDOWN_OVERUP|BC_OUTDOWN_IDLE|BC_OVERDOWN_IDLE;
     }
-    char*action = "";
     readToken();
     if(type == RAWDATA) {
        action = text;
@@ -2297,6 +2315,7 @@ static int c_on_release(map_t*args)
 static int c_on_move_in(map_t*args)
 {
     char*position = lu(args, "state");
+    char*action = "";
     if(!strcmp(position, "pressed")) {
        current_button_flags |= BC_OUTDOWN_OVERDOWN;
     } else if(!strcmp(position, "not_pressed")) {
@@ -2304,7 +2323,6 @@ static int c_on_move_in(map_t*args)
     } else if(!strcmp(position, "any")) {
        current_button_flags |= BC_OUTDOWN_OVERDOWN|BC_IDLE_OVERUP|BC_IDLE_OVERDOWN;
     }
-    char*action = "";
     readToken();
     if(type == RAWDATA) {
        action = text;
@@ -2318,6 +2336,7 @@ static int c_on_move_in(map_t*args)
 static int c_on_move_out(map_t*args)
 {
     char*position = lu(args, "state");
+    char*action = "";
     if(!strcmp(position, "pressed")) {
        current_button_flags |= BC_OVERDOWN_OUTDOWN;
     } else if(!strcmp(position, "not_pressed")) {
@@ -2325,7 +2344,6 @@ static int c_on_move_out(map_t*args)
     } else if(!strcmp(position, "any")) {
        current_button_flags |= BC_OVERDOWN_OUTDOWN|BC_OVERUP_IDLE|BC_OVERDOWN_IDLE;
     }
-    char*action = "";
     readToken();
     if(type == RAWDATA) {
        action = text;
@@ -2339,6 +2357,7 @@ static int c_on_move_out(map_t*args)
 static int c_on_key(map_t*args)
 {
     char*key = lu(args, "key");
+    char*action = "";
     if(strlen(key)==1) {
        /* ascii */
        if(key[0]>=32) {
@@ -2355,7 +2374,6 @@ static int c_on_key(map_t*args)
        */
        syntaxerror("invalid key: %s",key);
     }
-    char*action = "";
     readToken();
     if(type == RAWDATA) {
        action = text;