#include #include extern const char *__progname; #include "conflib.h" #include "currlib.h" static void *conf; static void handleargs(int ac, char **av, int early) { int skip; int errs; skip = 0; errs = 0; for (ac--,av++;ac;ac--,av++) { if (skip > 0) { skip --; continue; } if (**av != '-') { if (! early) conf_read(conf,*av,0); continue; } if (0) { needarg:; fprintf(stderr,"%s: %s needs a following argument\n",__progname,*av); errs ++; continue; } #define WANTARG() do { if (++skip >= ac) goto needarg; } while (0) if (!strcmp(*av,"-config")) { WANTARG(); if (! early) conf_read(conf,av[skip],0); continue; } if (!strcmp(*av,"-configline") || !strcmp(*av,"-set")) { WANTARG(); if (early) conf_line(conf,av[skip],0); continue; } #undef WANTARG fprintf(stderr,"%s: unrecognized option `%s'\n",__progname,*av); errs ++; } if (errs) { fprintf(stderr,"Usage: %s [options] [config-file]\n",__progname); exit(1); } } static void init_curr(void) { const char *curr_file; curr_file = conf_path(conf,"currencies",0); if (curr_file) { load_currencies(curr_file,0); } else { fake_currencies(); } } static void handle_line(char *line, int len) { int i; char *curr; char *fixp; int neg; unsigned long int amt; int c1; int c2; static char *amtbuf = 0; static int amthave = 0; for (i=len-1;(i>=0)&&(line[i]!=':');i--) ; if (i < 0) return; c2 = i; for (i--;(i>=0)&&(line[i]!=':');i--) ; if (i < 0) return; c1 = i; curr = line + c1 + 1; fixp = line + c2; i = c2 + 1; neg = 0; if (line[i] == '-') { neg = 1; i ++; if (i >= len) return; } amt = 0; for (;i amthave) { free(amtbuf); amthave = i + 1; amtbuf = malloc(amthave); } format_amount(amtbuf,neg,amt,curr); *fixp = ':'; fwrite(line,1,len,stdout); printf(":%s\n",amtbuf); } static void process(void) { char *line; int have; int len; int c; line = 0; have = 0; len = 0; while (1) { c = getchar(); if (c == EOF) { if (len > 0) { fprintf(stderr,"%s: warning: partial line at end of input ignored\n",__progname); } free(line); return; } if (c == '\n') { handle_line(line,len); len = 0; continue; } while (have <= len) line = realloc(line,have+=8); line[len++] = c; } } int main(int, char **); int main(int ac, char **av) { conf = conf_newstate(); handleargs(ac,av,1); handleargs(ac,av,0); conf_check_env(conf,"MDB_CONFIG_DB",0); init_curr(); process(); exit(0); }