/** $ gcc -std=c99 *.c -lm && (echo ' (12 32(32 12))' | ./a.out) */
#include <errno.h>
#include <inttypes.h> /* uintmax_t, PRIuMAX */
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h> /* EXIT_FAILURE */
#include <string.h>
int main(void) {
long double sum = 0.0; /* result */
uintmax_t position = 0, /* the current position in the input */
depth = 0, /* how deep parens are nested */
number = 0; /* the current number */
int c;
for ( ; (c
= getchar()) != EOF
; ++position
) { if ('0' <= c && c <= '9') {
if (number > (UINTMAX_MAX - (c - '0')) / 10U) {
fprintf(stderr
, "error: input number is too large at (offset)%" PRIuMAX
", limit %" PRIuMAX "\n", position, UINTMAX_MAX);
}
number = 10*number + (c - '0');
}
else { /* not a digit */
if (number) {
/* result += a[i] * (0.5)**(b[i]) */
errno = 0;
sum += number * powl(.5, depth); /* number >> depth */
if (errno) { /*NOTE: ignore `+*` math errors */
fprintf(stderr
, "error: powl: %s at (offset)%" PRIuMAX
"\n", }
number = 0; /* reset number */
}
if (c == '(')
++depth; /*NOTE: ignore the (unlikely) overflow */
else if (c == ')') {
if (depth == 0) {
fprintf(stderr
, "error: unexpected closing paren at " "(offset)%" PRIuMAX "\n", position);
}
--depth;
}
else if (c == '-') {
fprintf(stderr
, "error: minus sign at (offset)%" PRIuMAX
" (program doesn't support negative numbers)\n", position);
}
}
}
return feof(stdin
) ? EXIT_SUCCESS
: EXIT_FAILURE
; }
LyoqICQgZ2NjIC1zdGQ9Yzk5ICouYyAtbG0gJiYgKGVjaG8gJyAoMTIgMzIoMzIgMTIpKScgfCAuL2Eub3V0KSAqLwojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGludHR5cGVzLmg+IC8qIHVpbnRtYXhfdCwgUFJJdU1BWCAqLwojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+IC8qIEVYSVRfRkFJTFVSRSAqLwojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQgbWFpbih2b2lkKSB7CiAgbG9uZyBkb3VibGUgc3VtID0gMC4wOyAvKiByZXN1bHQgKi8KICB1aW50bWF4X3QgcG9zaXRpb24gPSAwLCAvKiB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgKi8KICAgIGRlcHRoID0gMCwgLyogaG93IGRlZXAgcGFyZW5zIGFyZSBuZXN0ZWQgKi8KICAgIG51bWJlciA9IDA7IC8qIHRoZSBjdXJyZW50IG51bWJlciAqLwogIGludCBjOwogIGZvciAoIDsgKGMgPSBnZXRjaGFyKCkpICE9IEVPRjsgKytwb3NpdGlvbikgewogICAgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7CiAgICAgIGlmIChudW1iZXIgPiAoVUlOVE1BWF9NQVggLSAoYyAtICcwJykpIC8gMTBVKSB7CglmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBpbnB1dCBudW1iZXIgaXMgdG9vIGxhcmdlIGF0IChvZmZzZXQpJSIgUFJJdU1BWAoJCSIsIGxpbWl0ICUiIFBSSXVNQVggIlxuIiwgcG9zaXRpb24sIFVJTlRNQVhfTUFYKTsKCWV4aXQoRVhJVF9GQUlMVVJFKTsKICAgICAgfQogICAgICBudW1iZXIgPSAxMCpudW1iZXIgKyAoYyAtICcwJyk7CiAgICB9CiAgICBlbHNlIHsgLyogbm90IGEgZGlnaXQgKi8KICAgICAgaWYgKG51bWJlcikgewoJLyogcmVzdWx0ICs9IGFbaV0gKiAoMC41KSoqKGJbaV0pICovCgllcnJubyA9IDA7CglzdW0gKz0gbnVtYmVyICogcG93bCguNSwgZGVwdGgpOyAvKiBudW1iZXIgPj4gZGVwdGggKi8KCWlmIChlcnJubykgeyAvKk5PVEU6IGlnbm9yZSBgKypgIG1hdGggZXJyb3JzICovCgkgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHBvd2w6ICVzIGF0IChvZmZzZXQpJSIgUFJJdU1BWCAiXG4iLAoJCSAgc3RyZXJyb3IoZXJybm8pLCBwb3NpdGlvbik7CgkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKCX0KCW51bWJlciA9IDA7IC8qIHJlc2V0IG51bWJlciAqLwogICAgICB9CgogICAgICBpZiAoYyA9PSAnKCcpCgkrK2RlcHRoOyAvKk5PVEU6IGlnbm9yZSB0aGUgKHVubGlrZWx5KSBvdmVyZmxvdyAqLwogICAgICBlbHNlIGlmIChjID09ICcpJykgewoJaWYgKGRlcHRoID09IDApIHsKCSAgZnByaW50ZihzdGRlcnIgLCAiZXJyb3I6IHVuZXhwZWN0ZWQgY2xvc2luZyBwYXJlbiBhdCAiCgkJICAiKG9mZnNldCklIiBQUkl1TUFYICJcbiIsIHBvc2l0aW9uKTsKCSAgZXhpdChFWElUX0ZBSUxVUkUpOwoJfQoJLS1kZXB0aDsKICAgICAgfQogICAgICBlbHNlIGlmIChjID09ICctJykgewoJZnByaW50ZihzdGRlcnIsICJlcnJvcjogbWludXMgc2lnbiBhdCAob2Zmc2V0KSUiIFBSSXVNQVgKCQkiIChwcm9ncmFtIGRvZXNuJ3Qgc3VwcG9ydCBuZWdhdGl2ZSBudW1iZXJzKVxuIiwgcG9zaXRpb24pOwoJZXhpdChFWElUX0ZBSUxVUkUpOwogICAgICB9CiAgICB9CiAgfQogIGlmIChwcmludGYoIiVMZlxuIiwgc3VtKSA8IDApCiAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgcmV0dXJuIGZlb2Yoc3RkaW4pID8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFOwp9