#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