<div dir="ltr"><br>Cyril Hrubis <<a href="mailto:chrubis@suse.cz">chrubis@suse.cz</a>> wrote:<br><br>> +const char *next_token(FILE *f, struct data_node *doc)<br>> +{<br>> +       size_t i = 0;<br>> +       static char buf[4096];<br>> +       int c;<br>> +       int in_str = 0;<br>> +<br>> +       for (;;) {<br>> +               c = fgetc(f);<br>> +<br>> +               if (c == EOF)<br>> +                       goto exit;<br>> +<br>> +               if (in_str) {<br>> +                       if (c == '"') {<br>> +                               if (i == 0 || buf[i-1] != '\\')<br>> +                                       goto exit;<br>> +                       }<br><br>There is a problem in handle a special string token here,<br>which can not parse the "" correctly in many test cases.<div><br></div><div>e.g.<br><br># ./docparse ../testcases/kernel/syscalls/fsopen/fsopen01.c<br># ./docparse ../testcases/kernel/fs/ftest/ftest02.c<div>....<br><br>We got nothing<span class="gmail_default" style="font-size:small"> output</span> from the above two tests parsing because they<br>contains "" in their sentence, it makes next_token() exit too early.</div><div><br><div>     TEST(move_mount(fsmfd, "", AT_FDCWD, MNTPOINT, <br>        <span class="gmail_default" style="font-size:small">    </span>MOVE_MOUNT_F_EMPTY_PATH));<br></div><div><br><br>> +<br>> +                       buf[i++] = c;<br>> +                       continue;<br>> +               }<br>> +<br>> +               switch (c) {<br>> +               case '{':<br>> +               case '}':<br>> +               case ';':<br>> +               case '(':<br>> +               case ')':<br>> +               case '=':<br>> +               case ',':<br>> +               case '[':<br>> +               case ']':<br>> +                       if (i) {<br>> +                               ungetc(c, f);<br>> +                               goto exit;<br>> +                       }<br>> +<br>> +                       buf[i++]=c;<br>> +                       goto exit;<br>> +               case '0' ... '9':<br>> +               case 'a' ... 'z':<br>> +               case 'A' ... 'Z':<br>> +               case '.':<br>> +               case '_':<br>> +               case '-':<br>> +                       buf[i++]=c;<br>> +               break;<br>> +               case '/':<br>> +                       maybe_comment(f, doc);<br>> +               break;<br>> +               case '"':<br>> +                       in_str = 1;<br>> +               break;<br>> +               case ' ':<br>> +               case '\n':<br>> +               case '\t':<br>> +                       if (i)<br>> +                               goto exit;<br>> +               break;<br>> +               }<br>> +       }<br>> +<br>> +exit:<br>> +       if (i == 0)<br>> +               return NULL;<br>> +<br>> +       buf[i] = 0;<br>> +       return buf;<br>> +}<br>> +<br>> +#define WARN(str) fprintf(stderr, str "\n")<br>> +<br>> +static int parse_array(FILE *f, struct data_node *node)<br>> +{<br>> +       const char *token;<br>> +<br>> +       for (;;) {<br>> +               if (!(token = next_token(f, NULL)))<br>> +                       return 1;<br>> +<br>> +               if (!strcmp(token, "{")) {<br>> +                       struct data_node *ret = data_node_array();<br>> +                       parse_array(f, ret);<br>> +<br>> +                       if (data_node_array_len(ret))<br>> +                               data_node_array_add(node, ret);<br>> +                       else<br>> +                               data_node_free(ret);<br>> +<br>> +                       continue;<br>> +               }<br>> +<br>> +               if (!strcmp(token, "}"))<br>> +                       return 0;<br>> +<br>> +               if (!strcmp(token, ","))<br>> +                       continue;<br>> +<br>> +               if (!strcmp(token, "NULL"))<br>> +                       continue;<br>> +<br>> +               struct data_node *str = data_node_string(token);<br>> +<br>> +               data_node_array_add(node, str);<br>> +       }<br>> +<br>> +       return 0;<br>> +}<br>> +<br>> +static const char *tokens[] = {<br>> +       "static",<br>> +       "struct",<br>> +       "tst_test",<br>> +       "test",<br>> +       "=",<br>> +       "{",<br>> +};<br>> +<br>> +static struct data_node *parse_file(const char *fname)<br>> +{<br>> +       int state = 0, found = 0;<br>> +       const char *token;<br>> +<br><br>Seems we'd better check the fname is valid before opening it.<br><br>       if (access(fname, F_OK)) {<br>               fprintf(stderr, "file %s is not exist\n", fname);<br>               return NULL;<br>       }<br><br>> +static const char *filter_out[] = {<br>> +       "test",<br>> +       "test_all",<br>> +       "setup",<br>> +       "cleanup",<br>> +       "tcnt",<br>> +       "mntpoint",<br>> +       "bufs",<br><br>I guess the "options"  should<span class="gmail_default" style="font-size:small"> </span>be<span class="gmail_default" style="font-size:small"></span> <span class="gmail_default" style="font-size:small">also </span>filtered out here?<br><br>--<br>Regards,<br>Li Wang</div></div></div></div>