/* checka.c -- 2nd source file for check register program */ /* copyright (c) 1986 by Jim Woolley and WoolleyWare, San Jose, CA */ /* vers. 1.0, 12/85 thru 5/86 */ /* this file contains: * control() * char chek( c, p) * char eddate( c) * char edpayee( c) * char edcategory( c) * char edamount( c) * char eddeposit( c) * char edclear( c) * char edbbf( c) */ #include "a:checks.h" control() /* control entry display and edit */ { char c, cwitch, shocommand, s[ 6], chek(); int i, oldrecno; shocommand = FALSE; /* initialize */ oldrecno = -1; FOREVER { if ( shocommand || oldrecno != Recno) { strcpy( s, CLRCOM); formatd( s, 3, ( Recno + 1)); cursorto( 0, 0); putscr( Ivon); puts( s); /* display Recno and clear command */ putscr( Ivoff); oldrecno = Recno; shocommand = TRUE; } putquery(); putcursor( Recno, Field); c = chek( getchar(), &shocommand); /* wait for command */ if ( Recno > Maxentry) /* if beyond max entry, skip edit */ Oldfield = -1; else if ( isibbf( Recno)) /* else, if a BBF entry */ { c = edbbf( c); Oldfield = -1; } else /* else, not a BBF entry */ { cwitch = Field; switch ( cwitch) { case MMFIELD: case DDFIELD: case YYFIELD: c = chek( eddate( c), &shocommand); break; case PAYFIELD: c = edpayee( c); break; case CATFIELD: c = edcategory( c); break; case AMTFIELD: c = chek( edamount( c), &shocommand); break; case DEPFIELD: c = eddeposit( c); break; case CLRFIELD: c = edclear( c); break; } Oldfield = Field; } switch( c) { case 0: break; case CTRLD: case '\r': case CTRLF: case '\t': goright( c); break; case CTRLS: case '\b': case CTRLA: goleft( c); break; case CTRLX: case CTRLZ: godown( c); break; case CTRLE: case CTRLW: goup( c); break; case CTRLC: gonext(); break; case CTRLR: goprior(); break; case CTRLY: delete(); break; case CTRLU: undo(); break; case CTRLN: Today.yy = 0; /* use date of previous entry */ insert(); break; case CTRLP: print(); break; case CTRLB: case CTRLO: order( Recno); break; case CTRLQ: case CTRLK: ctrlqork(); break; case CTRLV: if ( Field == PAYFIELD) { Inserton = !Inserton; Oldfield = -1; break; /* break switch */ } /* else fall thru */ default: putchar( BEL); break; } } } char chek( c, p) /* check and return c */ char c, *p; /* update *p */ { if ( c == CTRLJ) c = help(); /* display help screen */ if ( *p = putcommand( c)) putcursor( Recno, Field); return ( c); } char eddate( c) /* edit MM/DD/YY fields */ char c; { char cwitch, count, new; int ic; struct record *e; if ( c == CTRLU) return ( CTRLU); /* undo delete */ e = &Entry[ Recno]; cwitch = Field; switch ( cwitch) { case MMFIELD: ic = e->date.mm; break; case DDFIELD: ic = e->date.dd; break; case YYFIELD: ic = e->date.yy; break; } new = TRUE; if ( ic < 10) count = 1; else count = 2; FOREVER { if ( c == '/') c = '\r'; if ( isdigit( c) && ( count < 2 || new)) { if ( new) { count = ic = 0; putchar( '\b'); putchar( ' '); new = FALSE; } if ( ic) { putchar( '\b'); putchar( '0' + ic); } putchar( c); putchar( '\b'); ic = 10*ic + c - '0'; ++count; } else if ( c == CTRLG || c == CTRL_ || c == DEL) { if ( count) { putchar( '\b'); putchar( ' '); ic /= 10; if ( --count && ic) putchar( '0' + ic); else putchar( ' '); putchar( '\b'); new = FALSE; } else putchar( BEL); } else if ( c == CTRLU) { putrecord( Recno); putcursor( Recno, Field); return ( 0); } else if ( iscntrl( c)) { if ( new) return ( c); if ( Field != MMFIELD && ic < 10) { putchar( '\b'); putchar( '0'); } if ( !ic) putchar( '0'); break; /* break FOREVER */ } else putchar( BEL); c = getchar(); /* get another character */ } /* end FOREVER */ switch ( cwitch) { case MMFIELD: e->date.mm = ic; break; case DDFIELD: e->date.dd = ic; break; case YYFIELD: e->date.yy = ic; break; } Modified = TRUE; return ( c); } char edpayee( c) /* edit payee field */ char c; { char *p, *ep, s[ 4], test, past; int len, count; struct nlist *np; p = ( ep = Entry[ Recno].payee) + Character; len = strlen( ep); if ( isprint( c) && len < ( PAYEESIZE - 1)) { strcpy( Savpayee, ep); if ( Inserton) { movmem( p, ( p + 1), ( len - Character + 1)); *p = c; puts( p); } else putchar( *p = c); ++Character; if (( len + 1) == 3) { strcpy(( p = s), ep); while ( *p = toupper( *p)) ++p; if ( np = lookup( s)) { for ( count = 5*Dloop; count && !kbhit(); --count) continue; /* wait 0.5 sec for key */ if ( !count) /* if no key, expand abreviation */ { strcpy( ep, np->fullname); putrecord( Recno); Character = strlen( ep); } } } } else if ( c == CTRLG && Character < len) { strcpy( Savpayee, ep); movmem(( p + 1), p, ( len - Character)); puts( p); putchar( PAYEEFILL); } else if (( c == CTRL_ || c == DEL) && Character) { strcpy( Savpayee, ep); --Character; movmem( p, ( p - 1), ( len - Character)); putchar( '\b'); puts( p - 1); putchar( PAYEEFILL); } else if ( c == CTRLT) { strcpy( Savpayee, ep); past = isspace( *p); if ( Character) test = ( past || isspace( *( p - 1))); else test = TRUE; count = 0; len -= Character; while ( *p) { movmem(( p + 1), p, len); --len; ++count; if ( isspace( *p)) { if ( !test) /* && isspace( *p) */ break; /* break while loop */ past = TRUE; } else if ( test && past) /* && !isspace( *p) */ break; /* break while loop */ } puts( p); while ( count--) putchar( PAYEEFILL); } else if ( c == CTRLU && Recno == Savrecno) { strcpy( ep, Savpayee); putrecord( Recno); putcursor( Recno, Field); Savrecno = -1; return ( 0); } else return ( c); putcursor( Recno, Field); Savrecno = Recno; Modified = TRUE; return ( 0); } char edcategory( c) /* edit category field */ char c; { if ( c == CTRLG || c == CTRL_ || c == DEL) c = ' '; if ( isprint( c)) { putchar( c = toupper( c)); putchar( '\b'); Entry[ Recno].category = c; c = 0; Modified = TRUE; } return ( c); } char edamount( c) /* edit amount field */ char c; { char new, action, s[ 20]; int i, it, row, col; struct money m, r, *a; struct record *e; if ( c == CTRLU) return ( CTRLU); /* undo delete */ row = Recno - First + HEAD; col = Ftoc[ AMTFIELD]; e = &Entry[ Recno]; a = &( e->amount); movmoney( &m, a, TRUE); /* initialize money display */ it = 3; /* initialize display location */ movmoney( &r, a, TRUE); /* initialize calculator constant */ action = 0; /* initialize calculator action */ new = TRUE; /* TRUE until new amount entered */ FOREVER { if ( isdigit( c)) { if ( new) /* initialize, then reset new */ it = m.dollar = m.cent = new = 0; c = c - '0'; if ( it) { if ( it == 1) { m.cent += 10*c; ++it; } else if ( it == 2) { m.cent += c; ++it; } else putchar( BEL); } else if (( i = 10*m.dollar + m.cent/1000) > MAXDOLLAR) putchar( BEL); else { m.dollar = i; m.cent = 10*( m.cent%1000) + 100*c; } } else if ( c == '.') { if ( new) /* initialize, then reset new */ it = m.dollar = m.cent = new = 0; if ( it) putchar( BEL); else it = 1; } else if ( c == CTRLU) /* undo current changes */ { undoit: putrecord( Recno); cursorto( row, col); return ( 0); } else if ( c == CTRLG || c == CTRL_ || c == DEL) { new = FALSE; /* reset new */ if ( it) --it; if ( it == 2) m.cent -= m.cent%10; else if ( it == 1) m.cent -= m.cent%100; else { m.cent = 1000*( m.dollar%10) + 100*( m.cent/1000); m.dollar /= 10; } } else if ( iscntrl( c) || index( "+-=m", ( c = tolower( c)))) { while ( c == 'm') /* calculate with Memory */ { cursorto( row, ( AMTCOL - 1)); puts( "m\b"); /* prompt for 2nd character */ switch ( c = tolower( getchar())) { case '+': /* add to Memory */ c = 'p'; break; case '-': /* subtract from Memory */ c = 'n'; break; case 'r': /* recall from Memory */ if ( !action) /* force thru calculator logic */ { a->dollar = a->cent = 0; action = '+'; } movmoney( &r, &Memory, ( new = TRUE)); c = '='; break; case 'c': /* clear Memory */ Memory.dollar = Memory.cent = 0; break; case CTRLU: /* undo */ goto undoit; default: /* try again */ putchar( BEL); c = 'm'; break; } } if ( action) /* pending calculator action? */ { if ( !new) /* if changed, update constant */ movmoney( &r, &m, TRUE); addmoney( &m, a, &r, ( action == '+')); if ( m.dollar < 0 || m.cent < 0) { /* want positive result */ e->deposit = !e->deposit; movmoney( &m, &m, FALSE); } /* move result to amount */ movmoney( a, &m, ( Modified = TRUE)); } else if ( !new) /* move display to amount */ movmoney( a, &m, ( Modified = TRUE)); else if ( iscntrl( c)) return ( c); /* current amount is unchanged */ if ( action || !new) { putrecord( Recno); update( Recno); /* update Balance */ cursorto( row, col); } if ( iscntrl( c)) return ( c); if ( index( "pnc", c)) /* calculate/display Memory */ { if ( c != 'c') addmoney( &Memory, &Memory, &m, ( c == 'p')); cursorto(( HEAD - 4), AMTCOL); putmoney( &Memory); cursorto( row, ( AMTCOL - 1)); putchar( ' '); cursorto( row, col); Modified = TRUE; c = '='; } if ( c == '=') { movmoney( &r, a, TRUE); /* new calculator constant */ action = 0; /* no pending calculator action */ } else { cursorto( row, ( AMTCOL - 1)); putchar( action = c); /* new pending calculator action */ cursorto( row, col); } it = 3; /* reinitialize */ new = TRUE; } else putchar( BEL); if ( !new) /* if amount is changed */ { cursorto( row, AMTCOL); putmoney( &m); /* display current amount */ if ( it) i = 2 - min( 2, it); else i = 3; cursorto( row, ( col - i)); } c = getchar(); /* get another character */ } /* end FOREVER */ } char eddeposit( c) /* edit deposit field */ char c; { char test; struct record *e; e = &Entry[ Recno]; if (( c = toupper( c)) == ESC) test = !e->deposit; /* toggle TRUE/FALSE */ else if ( !(( test = ( c == 'Y')) || c == 'N')) return ( witch( c)); /* response is not ESC or Y or N */ if ( e->deposit != test) /* test == TRUE if c == 'Y' */ { puts(( e->deposit = test) ? "DEP" : DEPCLRFIL); update( Recno); Modified = TRUE; } return ( 0); } char edclear( c) /* edit clear field */ char c; { char test; struct record *e; e = &Entry[ Recno]; if (( c = toupper( c)) == ESC) test = !e->clear; /* toggle TRUE/FALSE */ else if ( !(( test = ( c == 'Y')) || c == 'N')) return ( witch( c)); /* response is not ESC or Y or N */ if ( e->clear != test) /* test == TRUE if c == 'Y' */ { puts(( e->clear = test) ? "CLR" : DEPCLRFIL); Modified = TRUE; } return ( 0); } char edbbf( c) /* edit BBF entry */ char c; { char def, *p; struct record *e; def = NO; /* default */ while ( c == ESC) { def = !def; /* reverse */ putquery(); /* redisplay */ putchar( '\b'); putchar( def ? 'Y' : 'N'); /* show default */ putcursor( Recno, Field); c = getchar(); } c = toupper( c); if ( c == 'N' || ( !def && c != 'Y')) return ( witch( c)); prompt( "Confirm you wish to void "); puts( BBF); puts( " status (Y/N)? "); putchar( BEL); if ( !getyesno( NO)) return ( 0); e = &Entry[ Recno]; /* else, void status as BBF */ e->category &= 0x7f; p = e->payee; while ( *p = tolower( *p)) ++p; putrecord( Recno); putcursor( Recno, Field); Modified = TRUE; return ( 0); }