- #include <stdio.h> 
- #include <stdlib.h> 
- #include <string.h> 
-   
- char* strdup(const char *str) 
- { 
-   char *- str2  = malloc((- len  + 1) * sizeof (char));
 
-   return str2; 
- } 
-   
- int main() 
- { 
-   FILE *f = stdin; 
-   /** @todo evaluation of command line arguments could override f with fopen(). */ 
-   /* read input */ 
-   if (!f) { 
-     fprintf(- stderr , "ERROR: Cannot read input!\n");
 
-     return 1; 
-   } 
-   int nGates = 0, nVars = 0; 
-   char **vars = NULL; 
-   char buffer[80]; 
-   for (int-  iLine  = 1; fgets(- buffer , sizeof-  buffer ,-  f ); ++- iLine ) {
 
-     char *- op  = strtok(- buffer , " \t\r\n");
 
-     if (!op 
-       fprintf(- stderr , "ERROR in line %d: OP expected!\n",-  iLine );
 
-       continue; 
-     } 
-     char *var; 
-     while (- var  = strtok(- NULL , " \t\r\n")) {
 
-       if (var[0] == 't') { 
-         int found = 0; 
-         for (int i = 0; i < nVars; ++i) { 
-           if (- found  = (strcmp(- var ,-  vars [- i ]) == 0)) break;
 
-         } 
-         if (found) continue; /* continues the while (var = strtok(NULL, " \t\r\n")) loop */ 
-         ++nVars; 
-         vars  = realloc(- vars , sizeof (char*) *-  nVars );
-         if (!vars) { 
-           fprintf(- stderr , "ERROR: Out of memory!\n");
 
-           return 1; 
-         } 
-         int iVar = nVars - 1; 
-         vars[iVar] = strdup(var); 
-         printf("Var. #%d: '%s'\n",-  iVar ,-  var );
 
-       } 
-     } 
-     ++nGates; 
-   } 
-   /* evaluate input */ 
-   printf("nGates: %d, nVars: %d\n",-  nGates ,-  nVars );
 
-   for (int i = 0; i < nVars; ++i) { 
-     printf("vars[%d]: '%s'\n",-  i ,-  vars [- i ]);
 
-   } 
-   /* clean-up */ 
-   for (int-  i  = 0;-  i  <-  nVars ; ++- i ) free(- vars [- i ]);
 
-   /* done */ 
-   return 0; 
- } 
				I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKY2hhciogc3RyZHVwKGNvbnN0IGNoYXIgKnN0cikKewogIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKICBjaGFyICpzdHIyID0gbWFsbG9jKChsZW4gKyAxKSAqIHNpemVvZiAoY2hhcikpOwogIGlmIChzdHIyKSBzdHJjcHkoc3RyMiwgc3RyKTsKICByZXR1cm4gc3RyMjsKfQoKaW50IG1haW4oKQp7CiAgRklMRSAqZiA9IHN0ZGluOwogIC8qKiBAdG9kbyBldmFsdWF0aW9uIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgY291bGQgb3ZlcnJpZGUgZiB3aXRoIGZvcGVuKCkuICovCiAgLyogcmVhZCBpbnB1dCAqLwogIGlmICghZikgewogICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ2Fubm90IHJlYWQgaW5wdXQhXG4iKTsKICAgIHJldHVybiAxOwogIH0KICBpbnQgbkdhdGVzID0gMCwgblZhcnMgPSAwOwogIGNoYXIgKip2YXJzID0gTlVMTDsKICBjaGFyIGJ1ZmZlcls4MF07CiAgZm9yIChpbnQgaUxpbmUgPSAxOyBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGYpOyArK2lMaW5lKSB7CiAgICBjaGFyICpvcCA9IHN0cnRvayhidWZmZXIsICIgXHRcclxuIik7CiAgICBpZiAoIW9wCiAgICAgIHx8IHN0cmNtcChvcCwgIkFORCIpICE9IDAgJiYgc3RyY21wKG9wLCAiT1IiKSAhPSAwICYmIHN0cmNtcChvcCwgIlhPUiIpICE9IDAKICAgICAgJiYgc3RyY21wKG9wLCAiTkFORCIpICE9IDAgJiYgc3RyY21wKG9wLCAiTk9SIikgIT0gMCkgewogICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGluIGxpbmUgJWQ6IE9QIGV4cGVjdGVkIVxuIiwgaUxpbmUpOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGNoYXIgKnZhcjsKICAgIHdoaWxlICh2YXIgPSBzdHJ0b2soTlVMTCwgIiBcdFxyXG4iKSkgewogICAgICBpZiAodmFyWzBdID09ICd0JykgewogICAgICAgIGludCBmb3VuZCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuVmFyczsgKytpKSB7CiAgICAgICAgICBpZiAoZm91bmQgPSAoc3RyY21wKHZhciwgdmFyc1tpXSkgPT0gMCkpIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZm91bmQpIGNvbnRpbnVlOyAvKiBjb250aW51ZXMgdGhlIHdoaWxlICh2YXIgPSBzdHJ0b2soTlVMTCwgIiBcdFxyXG4iKSkgbG9vcCAqLwogICAgICAgICsrblZhcnM7CiAgICAgICAgdmFycyA9IHJlYWxsb2ModmFycywgc2l6ZW9mIChjaGFyKikgKiBuVmFycyk7CiAgICAgICAgaWYgKCF2YXJzKSB7CiAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBPdXQgb2YgbWVtb3J5IVxuIik7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaW50IGlWYXIgPSBuVmFycyAtIDE7CiAgICAgICAgdmFyc1tpVmFyXSA9IHN0cmR1cCh2YXIpOwogICAgICAgIHByaW50ZigiVmFyLiAjJWQ6ICclcydcbiIsIGlWYXIsIHZhcik7CiAgICAgIH0KICAgIH0KICAgICsrbkdhdGVzOwogIH0KICAvKiBldmFsdWF0ZSBpbnB1dCAqLwogIHByaW50ZigiUmVwb3J0OlxuIik7CiAgcHJpbnRmKCJuR2F0ZXM6ICVkLCBuVmFyczogJWRcbiIsIG5HYXRlcywgblZhcnMpOwogIGZvciAoaW50IGkgPSAwOyBpIDwgblZhcnM7ICsraSkgewogICAgcHJpbnRmKCJ2YXJzWyVkXTogJyVzJ1xuIiwgaSwgdmFyc1tpXSk7CiAgfQogIC8qIGNsZWFuLXVwICovCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuVmFyczsgKytpKSBmcmVlKHZhcnNbaV0pOwogIGZyZWUodmFycyk7CiAgLyogZG9uZSAqLwogIHJldHVybiAwOwp9