int main() { int value; Trans *transaction; /* ** Establish the point at which we want to resume execution ** after a call to longjmp. */ value = setjmp( restart ); /* ** Figure out what to do after a return from setjmp. */ switch( value ){ default: /* ** longjmp was called -- fatal error */ fputs( "Fatal error.\n", stderr ); break; case 1: /* ** longjmp was called -- minor error */ fputs( "Invalid transaction.\n", stderr ); /* FALL THROUGH and continue processing */ case 0: /* ** Original return from setjmp: perform normal ** processing. */ while( (transaction = get_trans()) != NULL ) process_trans( transaction ); } /* ** Save data and exit the program */ write_data_to_file(); return value == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }
int main() { int value; Trans *transaction; value = setjmp(restart); switch(setjmp(restart)){ default: fputs("fatal error.\n", stderr); break; case 1: fputs("Invalid transaction.\n", stderr); case 0: while((transaction = geet_trans()) != NULL ){ process_trans(transaction); } } write_data_to_file(); return value ==0 ? EXIT_SUCCESS:EXIT_FAILURE; }
void read_qif (char *filename) { FILE *f; char buf[1000]; char *p; int month, mday, year; struct trans *trans; char obuf[1000]; if ((f = fopen (filename, "r")) == NULL) fatal ("can't open %s\n", filename); if (fgets (buf, sizeof buf, f) == NULL) fatal ("unexpected EOF\n"); trim (buf); if (sscanf (buf, "!Type:%s", acct_id) != 1) fatal ("%d: invalid QIF: %s\n", linenum, buf); linenum = 0; trans = NULL; trans_list = NULL; trans_list_tailp = &trans_list; while (1) { if (fgets (buf, sizeof buf, f) == NULL) break; linenum++; if (trans == NULL) { trans = make_trans (); trans->input_seq = ntrans; } p = trim (buf); switch (*p) { case 0: break; case '^': *trans_list_tailp = trans; trans_list_tailp = &trans->next; ntrans++; trans = NULL; break; case 'D': if (sscanf (buf, "D%d/%d/%d", &month, &mday, &year) != 3) { fatal ("%d: invalid date: %s\n", linenum, buf); } if (year < 1900) fatal ("%d: invalid year %s\n", linenum, buf); sprintf (obuf, "%04d-%02d-%02d 12:00:00", year, month, mday); trans->posted = xstrdup (obuf); break; case 'T': trans->amount = parse_number (buf + 1); break; case 'N': // check number trans->ref = xstrdup (buf + 1); break; case 'P': // payee trans->name = xstrdup (buf + 1); break; case 'M': // memo trans->memo = xstrdup (buf + 1); break; default: fatal ("%d: unknown opcode: %s\n", linenum, buf); break; } } process_trans (); }