/* A very simple cdecl clone by FredOverflow.
Functions are not supported yet, only pointers and arrays.
Error detection should be pretty good. */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void assume(int condition, const char * error_message)
{
if (!condition)
{
fprintf(stderr
, "%s\n", error_message
); }
}
void remove_spaces(char * dst)
{
char * src = dst;
while (*src)
{
{
*dst++ = *src;
}
++src;
}
*dst = 0;
}
/* Yes I know, global variables are evil, kittens die etc...
In an object-oriented language, this would be a private field, okay? */
static char * p;
void skip(int predicate(int))
{
while (predicate(*p))
{
++p;
}
}
int is_star(int x)
{
return '*' == x;
}
int parse_int()
{
int x = 0;
{
x = x * 10 + (*p++ - '0');
}
return x;
}
void parse_declarator();
void parse_atom();
void parse_array();
void declaration()
{
assume
(isalpha(*p
), "must start with a letter");
char * begin_of_type = p;
char * end_of_type = p;
remove_spaces(p);
parse_declarator();
*end_of_type = 0;
printf("%s\n", begin_of_type
); }
int count_stars()
{
char * first_star = p;
skip(is_star);
return p - first_star;
}
void print_stars(int number_of_stars)
{
int i;
for (i = 0; i < number_of_stars; ++i)
{
}
}
void parse_declarator()
{
int number_of_stars = count_stars();
parse_atom();
parse_array();
print_stars(number_of_stars);
}
void parse_atom()
{
if ('(' == *p)
{
++p;
parse_declarator();
assume(')' == *p, "missing )");
++p;
}
}
void parse_array()
{
while ('[' == *p)
{
++p;
int n = parse_int();
assume(']' == *p, "missing ]");
++p;
}
}
int main()
{
char test[] = " int ** (* a[ 2 ]) [3 ][5 ] [7] ";
p = test;
declaration();
return 0;
}
LyogQSB2ZXJ5IHNpbXBsZSBjZGVjbCBjbG9uZSBieSBGcmVkT3ZlcmZsb3cuCiAgIEZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQsIG9ubHkgcG9pbnRlcnMgYW5kIGFycmF5cy4KICAgRXJyb3IgZGV0ZWN0aW9uIHNob3VsZCBiZSBwcmV0dHkgZ29vZC4gKi8KCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+Cgp2b2lkIGFzc3VtZShpbnQgY29uZGl0aW9uLCBjb25zdCBjaGFyICogZXJyb3JfbWVzc2FnZSkKewogICAgaWYgKCFjb25kaXRpb24pCiAgICB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJyb3JfbWVzc2FnZSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KfQoKdm9pZCByZW1vdmVfc3BhY2VzKGNoYXIgKiBkc3QpCnsKICAgIHdoaWxlICghaXNzcGFjZSgqZHN0KSkgKytkc3Q7CiAgICBjaGFyICogc3JjID0gZHN0OwogICAgd2hpbGUgKCpzcmMpCiAgICB7CiAgICAgICAgaWYgKCFpc3NwYWNlKCpzcmMpKQogICAgICAgIHsKICAgICAgICAgICAgKmRzdCsrID0gKnNyYzsKICAgICAgICB9CiAgICAgICAgKytzcmM7CiAgICB9CiAgICAqZHN0ID0gMDsKfQoKLyogWWVzIEkga25vdywgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgZXZpbCwga2l0dGVucyBkaWUgZXRjLi4uCiAgIEluIGFuIG9iamVjdC1vcmllbnRlZCBsYW5ndWFnZSwgdGhpcyB3b3VsZCBiZSBhIHByaXZhdGUgZmllbGQsIG9rYXk/ICovCnN0YXRpYyBjaGFyICogcDsKCnZvaWQgc2tpcChpbnQgcHJlZGljYXRlKGludCkpCnsKICAgIHdoaWxlIChwcmVkaWNhdGUoKnApKQogICAgewogICAgICAgICsrcDsKICAgIH0KfQoKaW50IGlzX3N0YXIoaW50IHgpCnsKICAgIHJldHVybiAnKicgPT0geDsKfQoKaW50IHBhcnNlX2ludCgpCnsKICAgIGludCB4ID0gMDsKICAgIHdoaWxlIChpc2FsbnVtKCpwKSkKICAgIHsKICAgICAgICB4ID0geCAqIDEwICsgKCpwKysgLSAnMCcpOwogICAgfSAKICAgIHJldHVybiB4Owp9Cgp2b2lkIHBhcnNlX2RlY2xhcmF0b3IoKTsKdm9pZCBwYXJzZV9hdG9tKCk7CnZvaWQgcGFyc2VfYXJyYXkoKTsKCnZvaWQgZGVjbGFyYXRpb24oKQp7CiAgICBza2lwKGlzc3BhY2UpOwogICAgYXNzdW1lKGlzYWxwaGEoKnApLCAibXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIik7CgogICAgY2hhciAqIGJlZ2luX29mX3R5cGUgPSBwOwogICAgc2tpcChpc2FsbnVtKTsKICAgIGNoYXIgKiBlbmRfb2ZfdHlwZSA9IHA7CgogICAgcmVtb3ZlX3NwYWNlcyhwKTsKICAgIHBhcnNlX2RlY2xhcmF0b3IoKTsKCiAgICAqZW5kX29mX3R5cGUgPSAwOwogICAgcHJpbnRmKCIlc1xuIiwgYmVnaW5fb2ZfdHlwZSk7Cn0KCmludCBjb3VudF9zdGFycygpCnsKICAgIGNoYXIgKiBmaXJzdF9zdGFyID0gcDsKICAgIHNraXAoaXNfc3Rhcik7CiAgICByZXR1cm4gcCAtIGZpcnN0X3N0YXI7Cn0KCnZvaWQgcHJpbnRfc3RhcnMoaW50IG51bWJlcl9vZl9zdGFycykKewogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtYmVyX29mX3N0YXJzOyArK2kpCiAgICB7CiAgICAgICAgcHJpbnRmKCJwb2ludGVyIHRvICIpOwogICAgfQp9Cgp2b2lkIHBhcnNlX2RlY2xhcmF0b3IoKQp7CiAgICBpbnQgbnVtYmVyX29mX3N0YXJzID0gY291bnRfc3RhcnMoKTsKICAgIHBhcnNlX2F0b20oKTsKICAgIHBhcnNlX2FycmF5KCk7CiAgICBwcmludF9zdGFycyhudW1iZXJfb2Zfc3RhcnMpOwp9Cgp2b2lkIHBhcnNlX2F0b20oKQp7CiAgICBpZiAoJygnID09ICpwKQogICAgewogICAgICAgICsrcDsKICAgICAgICBwYXJzZV9kZWNsYXJhdG9yKCk7CiAgICAgICAgYXNzdW1lKCcpJyA9PSAqcCwgIm1pc3NpbmcgKSIpOwogICAgICAgICsrcDsKICAgIH0KICAgIGVsc2Ugc2tpcChpc2FsbnVtKTsKfQoKdm9pZCBwYXJzZV9hcnJheSgpCnsKICAgIHdoaWxlICgnWycgPT0gKnApCiAgICB7CiAgICAgICAgKytwOwogICAgICAgIGludCBuID0gcGFyc2VfaW50KCk7CiAgICAgICAgYXNzdW1lKCddJyA9PSAqcCwgIm1pc3NpbmcgXSIpOwogICAgICAgICsrcDsKICAgICAgICBwcmludGYoImFycmF5IG9mICVkICIsIG4pOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGNoYXIgdGVzdFtdID0gIiBpbnQgKiogKCogYVsgMiBdKSBbMyBdWzUgXSAgWzddICAgIjsKICAgIHByaW50ZigiJXNcbiIsIHRlc3QpOwoKICAgIHAgPSB0ZXN0OwogICAgZGVjbGFyYXRpb24oKTsKCiAgICByZXR1cm4gMDsKfQo=