program knaveos; uses windos, crt, dos; type str2=string[2]; str80=string[80]; str7= string[7]; str120=string[120]; str20=string[20]; str11=string[11]; adrek = record street: string[15]; apt: string[10]; city: string[11]; state: string[2]; zip: string[5]; telephone: string[11]; end; drek = record month: integer; day: integer; year: integer; end; rekord= record name:str20; address: adrek; ssnum: string[11]; dob: drek; sex: char; mstatus: char; numdep: 1..12; vdays: integer; vused: integer; sdays: integer; paytype: char; pay: real; hours: integer; totalearnings: real; ssperiod: real; fedperiod:real; ss: real; fed: real; medplan: char; doe: drek; end; recarray = array[1..50] of rekord; barray = array[1..50] of boolean; charay = array[0..8] of char; var temprec: rekord; emprek: recarray; rpath, comstring: str120; p, ofile, infile: text; ctoggle, acksess: boolean; formempnum, tcount, trace, numofemp, target: integer; sarray: charay; const days : array [0..6] of String[9] = ('Sunday','Monday','Tuesday', 'Wednesday','Thursday','Friday', 'Saturday'); procedure printdate; var y, m, d, dow : Word; begin GetDate(y,m,d,dow); Write(days[dow],', ', m:0, '/', d:0, '/', y:0); end; procedure printtime; var h, m, s, hund : Word; function LeadingZero(w : Word) : String; var s : String; begin Str(w:0,s); if Length(s) = 1 then s := '0' + s; LeadingZero := s; end; begin GetTime(h,m,s,hund); Write(LeadingZero(h),':', LeadingZero(m),':',LeadingZero(s)) end; procedure letterhead; begin writeln ('ACME Buttered Toast Company'); write ('Printed at: '); printtime; write (' On '); printdate; writeln; writeln ('1205 Sandpiper'); writeln ('Seabrook, TX, 77586'); writeln ('281-474-4709'); writeln; end; procedure erase (var emprek: recarray; count: integer); begin emprek[count].name := ' '; with emprek[count].address do begin street:=' '; apt:=' '; city:=' '; state:=' '; zip:=' '; telephone:=' '; end; emprek[count].ssnum:=' '; emprek[count].dob.month:=0; emprek[count].dob.day:=0; emprek[count].dob.year:=0; with emprek[count] do begin sex:=' '; mstatus:=' '; numdep:=1; vdays:=0; vused:=0; sdays:=0; paytype:=' '; pay:=0; hours:=0; totalearnings:=0; ssperiod:=0; fedperiod:=0; ss:=0; fed:=0; medplan:=' '; end; with emprek[count].doe do begin month:=0; day:=0; year:=0; end; end; procedure initialize(var emprek: recarray); var xcount: integer; begin for xcount := 1 to 50 do erase (emprek, xcount); end; procedure readfile(var emprek: recarray; var count: integer; var path: str120); var xcount: integer; zcount: integer; begin zcount:=1; assign (infile, path); reset(infile); count :=0; if path <> 'C:\PASCAL\EMPREC.97' then readln(infile, xcount); while not eof(infile) do begin count:=count+1; readln (infile, emprek[count].name); with emprek[count].address do begin readln (infile, street); readln (infile, apt); readln (infile, city); readln (infile, state); readln (infile, zip); readln (infile, telephone); end; readln (infile, emprek[count].ssnum); read (infile, emprek[count].dob.month); read (infile, emprek[count].dob.day); readln (infile, emprek[count].dob.year); with emprek[count] do begin readln (infile, sex); readln (infile, mstatus); readln (infile, numdep); readln (infile, vdays); readln (infile, vused); readln (infile, sdays); readln (infile, paytype); readln (infile, pay); readln (infile, hours); readln (infile, totalearnings); readln (infile, ssperiod); readln (infile, fedperiod); readln (infile, ss); readln (infile, fed); readln (infile, medplan); end; with emprek[count].doe do begin read (infile, month); read (infile, day); readln (infile, year); end; end; close(infile); end; procedure setrpath(xpath: str120); begin rpath:= xpath; end; procedure slowprint (pstring: string; color,del: integer; ffeed: char); var xcnt: integer; begin textcolor(color); xcnt := 1; repeat write (pstring[xcnt]); sound(500); delay(1); nosound; xcnt:= xcnt+1; if keypressed then halt; delay(del); until xcnt = length(pstring)+1; if ffeed = 'y' then writeln; end; function leftdigit(tnumber:real): integer; var ftnumber: real; ftcount: integer; begin ftcount :=0; ftnumber := tnumber; repeat ftnumber := ftnumber / 10; ftcount := ftcount+1; until ftnumber < 1; leftdigit := ftcount; end; function upscase(var upstring: str120) : str120; var i: integer; begin for i := 1 to length(upstring) do upstring[i] := upcase(upstring[i]); upscase := upstring; end; function upscase2(var upstring: str20): str20; var i: integer; begin for I:=1 to length(upstring) do upstring[i] := upcase(upstring[i]); upscase2:=upstring; end; procedure xwrite(wstr: str80; tempcol, rspaces, sfield: integer; var cfield: integer); var col: integer; begin col:=textattr; textcolor(tempcol); cfield := cfield + 1; if sfield = cfield then textbackground(1); write (wstr:rspaces); textbackground(0); textcolor(col); end; procedure xwrite2(wstr: str80; tempcol, rspaces, sfield, cfield: integer); var col: integer; begin col:=textattr; textcolor(tempcol); if sfield = cfield then textbackground(1); write (wstr:rspaces); textbackground(0); textcolor(col); end; procedure rwriteln(outnum: real; tempcol, rspaces, dig, sfield: integer; var cfield: integer); var col: integer; begin col:=textattr; textcolor(tempcol); cfield :=cfield + 1; if sfield = cfield then textbackground(1); writeln (outnum:rspaces:dig); textbackground(0); textcolor(col); end; procedure rwrite(outnum: real; tempcol, rspaces, dig, sfield: integer; var cfield: integer); var col: integer; begin col:=textattr; textcolor(tempcol); cfield :=cfield + 1; if sfield = cfield then textbackground(1); write (outnum:rspaces:dig); textbackground(0); textcolor(col); end; procedure xwriteln(wstr: str80; tempcol, rspaces, sfield: integer; var cfield: integer); var col: integer; begin col:=textattr; textcolor(tempcol); cfield := cfield + 1; if sfield = cfield then textbackground(1); writeln (wstr:rspaces); textbackground(0); textcolor(col); end; procedure sinput1(var thing1: str11); var it: char; ipos: integer; begin ipos:=1; gotoxy (14,5); write ('('); repeat it := readkey; if (it <> chr(13)) and (it <> chr(8)) then begin write (it); thing1[ipos] := it; ipos:=ipos+1; if ipos = 4 then write (')'); end; if (it = chr(8)) and (ipos > 1) then begin write (chr(8)); if ipos = 4 then write (chr(8)); if ipos = 4 then write (' '); write (' '); write (chr(8)); if ipos = 4 then write (chr(8)); ipos:=ipos-1; thing1[ipos] := ' '; end; thing1:=thing1; until it = chr(13); end; function dayval(int:integer): integer; begin case int of 1,3,5,7,8,10,12: dayval:=31; 4,6,9,11: dayval := 30; 2: dayval := 28; end; end; procedure writefile (var emprek: recarray; count: integer; pathname: str120); var tcount: integer; begin assign (ofile, pathname); rewrite(ofile); writeln (ofile, count); for tcount := 1 to count do begin writeln (ofile, emprek[tcount].name); with emprek[tcount].address do begin writeln (ofile, street); writeln (ofile, apt); writeln (ofile, city); writeln (ofile, state); writeln (ofile, zip); writeln (ofile, telephone); end; writeln (ofile, emprek[tcount].ssnum); write (ofile, emprek[tcount].dob.month,' '); write (ofile, emprek[tcount].dob.day,' '); writeln (ofile, emprek[tcount].dob.year); with emprek[tcount] do begin writeln (ofile, sex); writeln (ofile, mstatus); writeln (ofile, numdep); writeln (ofile, vdays); writeln (ofile, vused); writeln (ofile, sdays); writeln (ofile, paytype); writeln (ofile, pay:0:2); writeln (ofile, hours); writeln (ofile, totalearnings:0:2); writeln (ofile, ssperiod:0:2); writeln (ofile, fedperiod:0:2); writeln (ofile, ss:0:2); writeln (ofile, fed:0:2); writeln (ofile, medplan); end; with emprek[tcount].doe do begin write (ofile, month,' '); write (ofile, day,' '); writeln (ofile, year); end; end; close(ofile); end; procedure selsort(var emprek: recarray; numoemp : integer); var jcount, kcount: integer; index: integer; temprec: rekord; begin for jcount := 1 to numoemp -1 do begin temprec := emprek[jcount]; index := jcount; for kcount := jcount + 1 to numoemp do if emprek[kcount].name < temprec.name then begin temprec := emprek[kcount]; index := kcount; end; emprek[index] := emprek[jcount]; emprek[jcount] := temprec; end; end; procedure editval(var emprek: recarray; count, sfield: integer); var inchar: char; eraseint: integer; thing1: str11; thing2: integer; begin if sfield = 1 then begin gotoxy(16,2); for eraseint := 1 to length(emprek[count].name) do write (' '); gotoxy(16,2); readln (emprek[count].name); end; if sfield = 2 then begin gotoxy(10,3); for eraseint := 1 to length(emprek[count].address.street) do write (' '); gotoxy(10,3); readln (emprek[count].address.street); end; if sfield = 3 then begin gotoxy(56,3); if length(emprek[count].address.apt) > 0 then for eraseint := 1 to length(emprek[count].address.apt) do write (' ') else write (' '); gotoxy(56,3); readln (emprek[count].address.apt); end; if sfield = 4 then begin gotoxy(7,4); for eraseint := 1 to length(emprek[count].address.city) do write (' '); gotoxy(7,4); readln (emprek[count].address.city); end; if sfield = 5 then begin gotoxy(31,4); for eraseint := 1 to length(emprek[count].address.state) do write (' '); gotoxy(31,4); readln (emprek[count].address.state); end; if sfield = 6 then begin gotoxy(53,4); for eraseint := 1 to length(emprek[count].address.zip) do write (' '); gotoxy(53,4); readln (emprek[count].address.zip); end; if sfield = 7 then begin sinput1(thing1); emprek[count].address.telephone:=thing1; end; if sfield = 8 then begin gotoxy(62,5); for eraseint := 1 to length(emprek[count].ssnum) do write (' '); gotoxy(62,5); readln (emprek[count].ssnum); end; if sfield = 9 then begin repeat window(1,24,80,24); write ('Type the number of the month then hit enter'); window(1,1,80,24); gotoxy(11,6); readln(thing2); until thing2 <= 12; emprek[count].dob.month:=thing2; gotoxy(13,6); write ('/'); repeat window(1,24,80,24); write ('Type the number of the day then hit enter'); window(1,1,80,24); gotoxy(14,6); readln(thing2); until thing2 <= dayval(emprek[count].dob.month); emprek[count].dob.day:=thing2; gotoxy(16,6); write ('/'); repeat window(1,24,80,24); write ('Type the number of the year <two digit> then hit enter'); window(1,1,80,24); gotoxy(17,6); readln(thing2); emprek[count].dob.year:=thing2; until thing2 > -1; window(1,1,80,24); end; if sfield = 10 then begin gotoxy(48,6); write (' '); gotoxy(48,6); readln(emprek[count].sex); end; if sfield = 11 then begin gotoxy(17,7); write (' '); gotoxy(17,7); repeat window(1,24,80,24); write('''S'' for Single, ''M'' for Married, or ''D'' for Divorced'); window(1,1,80,24); inchar:=upcase(readkey); until (inchar = 'M') or (inchar = 'S') or (inchar = 'D'); emprek[count].mstatus := inchar; end; if sfield = 12 then begin gotoxy(65,7); write (' '); gotoxy(65,7); readln(emprek[count].numdep); end; if sfield = 13 then begin gotoxy(16,8); write (' '); gotoxy(16,8); readln(emprek[count].vdays); end; if sfield = 14 then begin gotoxy(58,8); write(' '); gotoxy(58,8); readln(emprek[count].vused); end; if sfield = 15 then begin gotoxy(18,9); write(' '); gotoxy(18,9); readln(emprek[count].sdays); end; if sfield = 16 then begin window(1,23,80,23); write('Enter ''H'' for hourly or ''S'' for salaried'); window(1,1,80,24); gotoxy(63,9); write(' '); gotoxy(63,9); emprek[count].paytype := upcase(readkey); end; if sfield = 17 then begin gotoxy(16,10); write(' '); gotoxy(16,10); readln(emprek[count].pay); end; if sfield = 18 then begin gotoxy(57,10); write(' '); gotoxy(57,10); readln(emprek[count].hours); end; if sfield = 19 then begin gotoxy(17, 11); write(' '); gotoxy(17,11); readln(emprek[count].totalearnings); end; if sfield = 20 then begin gotoxy(66,11); write(' '); gotoxy(66,11); readln(emprek[count].ssperiod); end; if sfield = 21 then begin gotoxy(23,12); write(' '); gotoxy(23,12); readln(emprek[count].fedperiod); end; if sfield = 22 then begin gotoxy(62, 12); write(' '); gotoxy(62,12); readln(emprek[count].ss); end; if sfield = 23 then begin gotoxy(19,13); write(' '); gotoxy(19,13); readln(emprek[count].fed); end; if sfield = 24 then begin window(1,24,80,24); write('Hit ''H'' for HMO or ''R'' for Regular'); window(1,1,80,24); gotoxy(57,13); write(' '); gotoxy(57,13); emprek[count].medplan := readkey; end; if sfield = 25 then begin repeat window(1,24,80,24); write ('Type the number of the month then hit enter'); window(1,1,80,24); gotoxy(21,14); readln(thing2); until thing2 <= 12; emprek[count].doe.month:=thing2; gotoxy(23,14); write ('/'); repeat window(1,24,80,24); write ('Type the number of the day then hit enter'); window(1,1,80,24); gotoxy(24,14); readln(thing2); until thing2 <= dayval(emprek[count].doe.month); emprek[count].doe.day:=thing2; gotoxy(26,14); write ('/'); repeat window(1,23,80,23); write ('Type the number of the year <two digit> then hit enter'); window(1,1,80,24); gotoxy(27,14); readln(thing2); emprek[count].doe.year:=thing2; until thing2 > -1; window(1,1,80,24); end; end; procedure delemp(var emprek: recarray; var empnum: integer; var numuvemp: integer; var trec: rekord); var zcount: integer; begin if empnum <> numuvemp then begin trec := emprek[empnum]; for zcount := empnum to numuvemp do emprek[empnum] := emprek[empnum+1]; erase(emprek,numuvemp); setrpath('C:\CUREMP.TXT'); numuvemp:=numuvemp-1; writefile(emprek, numuvemp, rpath); setrpath('C:\FORMEMP.TXT'); readfile(emprek, formempnum, rpath); formempnum:=formempnum+1; emprek[formempnum]:=trec; writefile(emprek, formempnum, 'C:\FORMEMP.TXT'); empnum:=formempnum; end else if empnum = numuvemp then begin trec:=emprek[empnum]; erase(emprek,empnum); setrpath('C:\CUREMP.TXT'); numuvemp:=numuvemp-1; writefile(emprek, numuvemp, rpath); repeat until keypressed; setrpath('C:\FORMEMP.TXT'); readfile(emprek, formempnum, rpath); formempnum:=formempnum+1; emprek[formempnum]:=trec; writefile(emprek, formempnum, 'C:\FORMEMP.TXT'); empnum:=formempnum; end; end; procedure edit(var emprek: recarray; var count: integer; var numoemp: integer; var fempnum: integer); var commchar: char; phone: integer; scount: string[10]; exitflag: boolean; sfield: integer; curfield: integer; commchar2: char; begin clrscr; exitflag:=false; count:=1; sfield:=1; commchar:='z'; repeat curfield:=0; textcolor(7); gotoxy(1,1); writeln ('File: ', rpath,' '); write ('Employee Name: '); xwrite (emprek[count].name, 8,0,sfield,curfield); write ('Employee Number: ':44-length(emprek[count].name)); write (count); writeln; write ('Address: '); xwrite (emprek[count].address.street,8,0,sfield,curfield); write ('Apartment #: ':46-length(emprek[count].address.street)); xwrite (emprek[count].address.apt,8,0,sfield,curfield); if (length(emprek[count].address.apt) = 0) and (sfield=curfield) then begin textbackground(1); write (' '); textbackground(0); end; writeln; write ('City: '); xwrite (emprek[count].address.city,8,0,sfield,curfield); write ('State: ':24-length(emprek[count].address.city)); xwrite (emprek[count].address.state,8,0,sfield,curfield); write ('Zip Code: ':22-length(emprek[count].address.state)); xwriteln (emprek[count].address.zip,8,0,sfield,curfield); write ('Telephone #: '); curfield:=curfield+1; for phone := 1 to 11 do begin if phone = 1 then xwrite2 ('(',7,0,sfield,curfield); xwrite2 (emprek[count].address.telephone[phone],8,0,sfield,curfield); if phone = 3 then xwrite2 (')',7,0,sfield,curfield); end; write ('Social Security #: ':46-length(emprek[count].address.telephone)); xwriteln (emprek[count].ssnum,8,0,sfield,curfield); curfield:=curfield+1; write ('Birthday: '); str (emprek[count].dob.month,scount); if length (scount) = 1 then xwrite2 ('0',8,0,sfield,curfield); xwrite2 (scount,8,0,sfield,curfield); xwrite2 ('/',7,0,sfield,curfield); str (emprek[count].dob.day,scount); if length (scount) = 1 then xwrite2 ('0',8,0,sfield,curfield); xwrite2 (scount,8,0,sfield,curfield); xwrite2 ('/',7,0,sfield,curfield); str (emprek[count].dob.year,scount); xwrite2 (scount,8,0,sfield,curfield); write ('Sex: ':29); xwriteln(upcase(emprek[count].sex),8,0,sfield,curfield); write ('Marital Status: '); xwrite (upcase(emprek[count].mstatus),8,0,sfield,curfield); write ('Number of Dependents: ':47); str (emprek[count].numdep,scount); xwriteln (scount,8,0,sfield,curfield); write ('Vacation days: '); str (emprek[count].vdays, scount); xwrite (scount,8,0,sfield,curfield); write ('Vacation used: ':42-length(scount)); str (emprek[count].vused, scount); xwriteln (scount,8,0,sfield,curfield); write ('Sick days taken: '); str (emprek[count].sdays, scount); xwrite (scount,8,0,sfield,curfield); write ('Hourly or Salaried: ':45-length(scount)); if upcase(emprek[count].paytype) = 'H' then xwriteln ('Hourly',8,0,sfield,curfield) else if upcase(emprek[count].paytype) = 'S' then xwriteln ('Salaried',8,0,sfield,curfield) else xwriteln ('Hired Assassin',8,0,sfield,curfield); if upcase(emprek[count].paytype) = 'S' then write ('Salary / year: ') else if upcase(emprek[count].paytype) = 'H' then write ('Wage per hour: ') else write ('Price per hit: '); rwrite (emprek[count].pay,8,0,2,sfield,curfield); write ('Hours worked: ':38-leftdigit(emprek[count].pay)); str(emprek[count].hours, scount); xwriteln (scount,8,0,sfield,curfield); write ('Total Earnings: '); rwrite (emprek[count].totalearnings,8,0,2,sfield, curfield); write ('Soc. Sec. this period: ':46-leftdigit(emprek[count].totalearnings)); rwriteln (emprek[count].ssperiod,8,0,2,sfield,curfield); write ('Fed. Tax this period: '); rwrite (emprek[count].fedperiod,8,0,2,sfield,curfield); write ('Soc. Sec. to date: ':36-leftdigit(emprek[count].fedperiod)); rwriteln (emprek[count].ss,8,0,2,sfield,curfield); write ('Fed. Tax to date: '); rwrite (emprek[count].fed,8,0,2,sfield,curfield); write ('Medical Plan: ':35-leftdigit(emprek[count].fed)); if upcase(emprek[count].medplan) = 'H' then xwriteln('HMO',8,0,sfield,curfield) else if upcase(emprek[count].medplan) = 'R' then xwriteln('Regular',8,0,sfield,curfield) else xwriteln('Organ Donor',8,0,sfield,curfield); curfield := curfield+1; write ('Date of Employment: '); str (emprek[count].doe.month,scount); if length (scount) = 1 then xwrite2 ('0',8,0,sfield,curfield); xwrite2 (scount,8,0,sfield,curfield); xwrite2 ('/',7,0,sfield,curfield); str (emprek[count].doe.day,scount); if length (scount) = 1 then xwrite2 ('0',8,0,sfield,curfield); xwrite2 (scount,8,0,sfield,curfield); xwrite2 ('/',7,0,sfield,curfield); str (emprek[count].doe.year,scount); xwrite2 (scount,8,0,sfield,curfield); writeln; writeln; writeln ('Hit '']'' to scroll forward and ''['' to scroll back'); if rpath = 'C:\CUREMP.TXT' then begin writeln ('Hit ''TAB'' to move forward a field, ''*'' to move backwards'); writeln ('Hit ''A'' to add employee'); writeln ('Hit ''D'' to delete employee'); writeln ('Hit ''E'' to edit value'); writeln ('Hit ''S'' to save changes into C:\CUREMP.TXT'); end; writeln ('Hit ''Q'' to quit'); repeat commchar := upcase(readkey); if (rpath = 'C:\FORMEMP.TXT') then begin if (commchar = ']') and (count < fempnum) then begin count := count + 1; clrscr; exitflag:=true; end; if (commchar = '[') and (count > 1) then begin count := count - 1; clrscr; exitflag:=true; end; end else begin if (commchar = ']') and (count < numoemp) then begin count := count + 1; clrscr; exitflag:=true; end; if (commchar = '[') and (count > 1) then begin count := count - 1; clrscr; exitflag:=true; end; if commchar = 'A' then begin numoemp := numoemp +1; erase(emprek,numoemp); end; if commchar = 'D' then begin write ('Are you SURE? (y/N)'); commchar2 := upcase(readkey); if commchar2 = 'Y' then delemp(emprek, count, numoemp,temprec); clrscr; exitflag := true; end; if (commchar = '*') and (sfield > 1) then begin sfield := sfield - 1; clrscr; exitflag:=true; end; if (commchar = chr(9)) and (sfield < 25) then begin sfield := sfield + 1; clrscr; exitflag := true; end; if (commchar = 'E') then begin editval(emprek, count, sfield); clrscr; exitflag := true; end; if (commchar = 'S') then writefile (emprek, numoemp, 'C:\CUREMP.TXT'); end; if commchar = 'Q' then exitflag := true; until exitflag = true; exitflag:=false; until upcase(commchar)='Q'; end; procedure lsearch(var emprek: recarray; sstring: str20; numuvemp: integer; var ttarget: integer); VAR xcount, ycount: integer; tempray: barray; matchnum: integer; tempint: integer; begin ttarget:=0; matchnum:=0; for xcount := 1 to 50 do tempray[xcount]:=false; for xcount := 1 to numuvemp do if pos(upscase2(sstring), upscase2(emprek[xcount].name)) > 0 then begin tempray[xcount]:=true; matchnum:=matchnum+1; end; if matchnum > 1 then begin repeat writeln (Matchnum, ' matches found.'); writeln; for xcount := 1 to 50 do if tempray[xcount]=true then writeln (xcount, '. ', emprek[xcount].name); writeln('Select employee number: '); readln(Ttarget); until tempray[ttarget] = true; end; if matchnum = 1 then for xcount := 1 to 50 do if tempray[xcount]=true then ttarget:=xcount; end; procedure print (var emprek: recarray; var numuvemp, fempnum: integer; commchar: char); var phone, count: integer; scount: string[12]; searchstr: str20; net, gross: real; fedtaxp, fedtax: real; begin case commchar of 'A': begin setrpath('C:\CUREMP.TXT'); readfile(emprek,numofemp,rpath); selsort(emprek,numofemp); letterhead; for count := 1 to numuvemp do begin gross:=0.0; net:=0.0; fedtaxp:=0.0; fedtax:=0.0; writeln ('Employee Name: ', EMprek[count].name); if emprek[count].paytype = 'S' then gross := emprek[count].pay else gross:=emprek[count].pay * 52; writeln('Gross Earnings: ',Gross:0:2); emprek[count].ssperiod := gross * 0.0765; writeln ('Social Security: ', emprek[count].ssperiod:0:2); if emprek[count].mstatus = 'M' then case round(gross) div 10 of 0..600: fedtaxp:=0.09; 600..2400: fedtaxp:=0.15; 2400..5815: fedtaxp:=0.28; 5815..12130: fedtaxp:=0.31; 12130..26375: fedtaxp:=0.396; end else case round(gross) div 10 of 0..1200: fedtaxp:=0.09; 1200..4010: fedtaxp:=0.15; 4010..9690: fedtaxp:=0.28; 9690..14770: fedtaxp:=0.31; end; emprek[count].fedperiod := gross * fedtaxp; writeln ('Fed. Tax: ',emprek[count].fedperiod:0:2); Net:= gross - (emprek[count].ssperiod + emprek[count].fedperiod); emprek[count].ss:=emprek[count].ss+emprek[count].ssperiod; emprek[count].fed:=emprek[count].fed+emprek[count].fedperiod; writeln ('Net earnings: ', net:0:2); writeln ('Soc. Sec to date: ', emprek[count].ss:0:2); writeln ('Fed. Tax to date: ', emprek[count].fed:0:2); writeln ('Vacation days left: ', emprek[count].vdays-emprek[count].vused); writeln ('Vacation days used: ', emprek[count].vused); writeln ('Sick days: ', emprek[count].sdays); writeln; end; end; 'B': begin setrpath('C:\CUREMP.TXT'); readfile(emprek,numofemp,rpath); selsort(emprek,numofemp); letterhead; for count:=1 to numuvemp do begin {assign (P,'PRN');} write ('Employee Name: '); write (emprek[count].name); write ('Employee Number: ':44-length(emprek[count].name)); write (count); writeln; write ('Address: '); write (emprek[count].address.street); write ('Apartment #: ':46-length(emprek[count].address.street)); write (emprek[count].address.apt); writeln; write ('City: '); write (emprek[count].address.city); write ('State: ':24-length(emprek[count].address.city)); write (emprek[count].address.state); write ('Zip Code: ':22-length(emprek[count].address.state)); writeln (emprek[count].address.zip); write ('Telephone #: '); for phone := 1 to 11 do begin if phone = 1 then write ('('); write (emprek[count].address.telephone[phone]); if phone = 3 then write (')'); end; write ('Social Security #: ':46-length(emprek[count].address. telephone)); writeln (emprek[count].ssnum); write ('Birthday: '); str (emprek[count].dob.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.year,scount); write (scount); write ('Sex: ':29); writeln(upcase(emprek[count].sex)); write ('Marital Status: '); write (upcase(emprek[count].mstatus)); write ('Number of Dependents: ':47); str (emprek[count].numdep,scount); writeln (scount); write ('Vacation days: '); str (emprek[count].vdays, scount); write (scount); write ('Vacation used: ':42-length(scount)); str (emprek[count].vused, scount); writeln (scount); write ('Sick days taken: '); str (emprek[count].sdays, scount); write (scount); write ('Hourly or Salaried: ':45-length(scount)); if upcase(emprek[count].paytype) = 'H' then writeln ('Hourly') else if upcase(emprek[count].paytype) = 'S' then writeln ('Salaried') else writeln ('Hired Assassin'); if upcase(emprek[count].paytype) = 'S' then write ('Salary / year: ') else if upcase(emprek[count].paytype) = 'H' then write ('Wage per hour: ') else write ('Price per hit: '); write (emprek[count].pay:0:2); write ('Hours worked: ':38-leftdigit(emprek[count].pay)); str(emprek[count].hours, scount); writeln (scount); write ('Total Earnings: '); write (emprek[count].totalearnings:0:2); write ('Soc. Sec. this period: ':46- leftdigit(emprek[count].totalearnings)); writeln (emprek[count].ssperiod:0:2); write ('Fed. Tax this period: '); write (emprek[count].fedperiod:0:2); write ('Soc. Sec. to date: ':36-leftdigit(emprek[count].fedperiod)); writeln (emprek[count].ss:0:2); write ('Fed. Tax to date: '); write (emprek[count].fed:0:2); write ('Medical Plan: ':35-leftdigit(emprek[count].fed)); if upcase(emprek[count].medplan) = 'H' then writeln('HMO') else if upcase(emprek[count].medplan) = 'R' then writeln('Regular') else writeln('Organ Donor'); write ('Date of Employment: '); str (emprek[count].doe.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.year,scount); write (scount); writeln; writeln; {assigncrt (p); Rewrite(P);} end; end; 'C': begin setrpath('C:\FORMEMP.TXT'); readfile(emprek,formempnum,rpath); selsort(emprek,formempnum); letterhead; for count:=1 to formempnum do begin {assign (P,'PRN');} write ('Employee Name: '); write (emprek[count].name); write ('Employee Number: ':44-length(emprek[count].name)); write (count); writeln; write ('Address: '); write (emprek[count].address.street); write ('Apartment #: ':46-length(emprek[count].address.street)); write (emprek[count].address.apt); writeln; write ('City: '); write (emprek[count].address.city); write ('State: ':24-length(emprek[count].address.city)); write (emprek[count].address.state); write ('Zip Code: ':22-length(emprek[count].address.state)); writeln (emprek[count].address.zip); write ('Telephone #: '); for phone := 1 to 11 do begin if phone = 1 then write ('('); write (emprek[count].address.telephone[phone]); if phone = 3 then write (')'); end; write ('Social Security #: ':46-length(emprek[count].address. telephone)); writeln (emprek[count].ssnum); write ('Birthday: '); str (emprek[count].dob.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.year,scount); write (scount); write ('Sex: ':29); writeln(upcase(emprek[count].sex)); write ('Marital Status: '); write (upcase(emprek[count].mstatus)); write ('Number of Dependents: ':47); str (emprek[count].numdep,scount); writeln (scount); write ('Vacation days: '); str (emprek[count].vdays, scount); write (scount); write ('Vacation used: ':42-length(scount)); str (emprek[count].vused, scount); writeln (scount); write ('Sick days taken: '); str (emprek[count].sdays, scount); write (scount); write ('Hourly or Salaried: ':45-length(scount)); if upcase(emprek[count].paytype) = 'H' then writeln ('Hourly') else if upcase(emprek[count].paytype) = 'S' then writeln ('Salaried') else writeln ('Hired Assassin'); if upcase(emprek[count].paytype) = 'S' then write ('Salary / year: ') else if upcase(emprek[count].paytype) = 'H' then write ('Wage per hour: ') else write ('Price per hit: '); write (emprek[count].pay:0:2); write ('Hours worked: ':38-leftdigit(emprek[count].pay)); str(emprek[count].hours, scount); writeln (scount); write ('Total Earnings: '); write (emprek[count].totalearnings:0:2); write ('Soc. Sec. this period: ':46- leftdigit(emprek[count].totalearnings)); writeln (emprek[count].ssperiod:0:2); write ('Fed. Tax this period: '); write (emprek[count].fedperiod:0:2); write ('Soc. Sec. to date: ':36-leftdigit(emprek[count].fedperiod)); writeln (emprek[count].ss:0:2); write ('Fed. Tax to date: '); write (emprek[count].fed:0:2); write ('Medical Plan: ':35-leftdigit(emprek[count].fed)); if upcase(emprek[count].medplan) = 'H' then writeln('HMO') else if upcase(emprek[count].medplan) = 'R' then writeln('Regular') else writeln('Organ Donor'); write ('Date of Employment: '); str (emprek[count].doe.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.year,scount); write (scount); writeln; writeln; {assigncrt (p); Rewrite(P);} end; end; 'D': begin target:=0; setrpath('C:\CUREMP.TXT'); readfile(emprek,numofemp,rpath); write ('Enter name of employee: '); readln (searchstr); lsearch(emprek, searchstr, numofemp, target); if target= 0 then writeln ('No one found'); if target > 0 then begin count:=target; letterhead; {assign (P,'PRN');} write ('Employee Name: '); write (emprek[count].name); write ('Employee Number: ':44-length(emprek[count].name)); write (count); writeln; write ('Address: '); write (emprek[count].address.street); write ('Apartment #: ':46-length(emprek[count].address.street)); write (emprek[count].address.apt); writeln; write ('City: '); write (emprek[count].address.city); write ('State: ':24-length(emprek[count].address.city)); write (emprek[count].address.state); write ('Zip Code: ':22-length(emprek[count].address.state)); writeln (emprek[count].address.zip); write ('Telephone #: '); for phone := 1 to 11 do begin if phone = 1 then write ('('); write (emprek[count].address.telephone[phone]); if phone = 3 then write (')'); end; write ('Social Security #: ':46-length(emprek[count].address. telephone)); writeln (emprek[count].ssnum); write ('Birthday: '); str (emprek[count].dob.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].dob.year,scount); write (scount); write ('Sex: ':29); writeln(upcase(emprek[count].sex)); write ('Marital Status: '); write (upcase(emprek[count].mstatus)); write ('Number of Dependents: ':47); str (emprek[count].numdep,scount); writeln (scount); write ('Vacation days: '); str (emprek[count].vdays, scount); write (scount); write ('Vacation used: ':42-length(scount)); str (emprek[count].vused, scount); writeln (scount); write ('Sick days taken: '); str (emprek[count].sdays, scount); write (scount); write ('Hourly or Salaried: ':45-length(scount)); if upcase(emprek[count].paytype) = 'H' then writeln ('Hourly') else if upcase(emprek[count].paytype) = 'S' then writeln ('Salaried') else writeln ('Hired Assassin'); if upcase(emprek[count].paytype) = 'S' then write ('Salary / year: ') else if upcase(emprek[count].paytype) = 'H' then write ('Wage per hour: ') else write ('Price per hit: '); write (emprek[count].pay:0:2); write ('Hours worked: ':38-leftdigit(emprek[count].pay)); str(emprek[count].hours, scount); writeln (scount); write ('Total Earnings: '); write (emprek[count].totalearnings:0:2); write ('Soc. Sec. this period: ':46- leftdigit(emprek[count].totalearnings)); writeln (emprek[count].ssperiod:0:2); write ('Fed. Tax this period: '); write (emprek[count].fedperiod:0:2); write ('Soc. Sec. to date: ':36-leftdigit(emprek[count].fedperiod)); writeln (emprek[count].ss:0:2); write ('Fed. Tax to date: '); write (emprek[count].fed:0:2); write ('Medical Plan: ':35-leftdigit(emprek[count].fed)); if upcase(emprek[count].medplan) = 'H' then writeln('HMO') else if upcase(emprek[count].medplan) = 'R' then writeln('Regular') else writeln('Organ Donor'); write ('Date of Employment: '); str (emprek[count].doe.month,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.day,scount); if length (scount) = 1 then write ('0'); write (scount); write ('/'); str (emprek[count].doe.year,scount); write (scount); writeln; writeln; {assigncrt (p); Rewrite(P);} end; end; end; end; procedure interpret (commstring: str120); var result: integer; commchar2: char; begin textattr := 7; if commstring = 'QUIT' then begin writeln ('Logged Out.'); result := -1; end else if (pos('?',commstring)) > 0 then result := 1 else if pos('HELP',commstring) > 0 then result := 1 else if pos('EDIT',commstring) > 0 then result := 2 else if pos('LOAD CURRENT',commstring) > 0 then result := 3 else if pos('LOAD FORMER',commstring) > 0 then result := 4 else if pos('LOAD BASIC',commstring) > 0 then result := 5 else if pos('NOTE',commstring) > 0 then result := 6 else if pos('PRINT',commstring) > 0 then result := 7 else if pos('NATHNOTE',commstring > 0 then result := 8 else result:=0; if result = 1 then begin textattr := 7; writeln ('Valid Commands are:'); writeln; writeln ('EDIT'); writeln ('HELP'); writeln ('LOAD CURRENT'); writeln ('LOAD FORMER'); writeln ('LOAD BASIC'); writeln ('NATHNOTE'); writeln ('NOTE'); writeln ('PRINT'); writeln ('QUIT'); writeln; end else if result = 8 then begin textattr := 7; writeln('Hello Nathy Boy!'); writeln('This program is silly'); writeln('Type Load Current to load C:\CUREMP.TXT'); writeln('Type Load Former to load C:\FORMEMP.TXT'); writeln('Type load basic to load the default settings'); writeln('When you load basic, type edit, then hit S to save'); writeln('the file to C:\curemp.txt'); writeln; writeln('Have fun'); end else if result = 2 then edit(emprek,tcount,numofemp, formempnum) else if result = 3 then begin setrpath('C:\CUREMP.TXT'); readfile(emprek,numofemp,rpath) end else if result = 4 then begin setrpath('C:\FORMEMP.TXT'); readfile(emprek,formempnum,rpath); end else if result = 5 then begin setrpath('C:\PASCAL\EMPREC.97'); {or you can change this to whatever} readfile(emprek,numofemp,rpath); end else if result= 6 then begin repeat clrscr; gotoxy(20,20); writeln ('This program was written by [redacted].'); gotoxy(25,21); writeln ('"It''s a great big disco world!"'); gotoxy(5,5); writeln (' o/ '); gotoxy(5,6); writeln ('( '); gotoxy(5,7); writeln ('/\ '); delay(500); gotoxy(5,5); writeln (' o '); gotoxy(5,6); writeln ('(/ '); gotoxy(5,7); writeln ('/\ '); delay(500); until keypressed; clrscr; end else if result = 7 then begin Writeln ('Available Printable Reports:'); writeln; writeln ('A. Payroll'); Writeln ('B. Alphabetical listing of Current Employees'); writeln ('C. Alphabetical listing of Former Employees'); writeln ('D. Single Employee Record'); commchar2 := upcase(readkey); print (emprek, numofemp, formempnum, commchar2); end else if result = 0 then begin write ('Unknown Command. Valid commands are listed with ''?'''); writeln(' or ''help'''); end; end; procedure menu(var commstring: str120); var pflag, exit1: boolean; begin pflag := false; exit1 := false; writeln; writeln('Welcome to Knave-OS v1.02'); repeat textcolor(3); write('-=ð> '); commstring:=commstring; readln(commstring); commstring:=upscase(commstring); interpret(commstring); until (commstring) = 'QUIT'; repeat until keypressed; end; Procedure access; var password: str7; count: integer; commchar: char; cnt: integer; pnum: integer; vaccess: boolean; begin writeln ('Attention. This is a private system. Access is restricted.'); writeln ('Attempting to use this system without authorization is a'); writeln ('violation of the Computer Fraud and and Decency act of 1986.'); writeln ('Distribution of passwords is strictly prohibited by Texas'); writeln ('law. Unauthorized attempts to use this system are logged and'); writeln ('WILL be reported.'); writeln; writeln ('Knave-OS version 1.02'); vaccess:=false; acksess:=false; for count := 1 to 7 do password[count] := ' '; cnt:=0; repeat {outer loop} commchar := ' '; pnum:=1; cnt:=cnt+1; textcolor(7); write ('-=ðLogin: '); repeat {read in loop} if keypressed then begin commchar := readkey; if (commchar = chr(8)) and (pnum > 1) then begin {erase the previous letter} write (chr(8), ' ', chr(8)); pnum := pnum - 1; password[pnum] := ' '; end; if (commchar <> chr(8)) and (commchar <> chr(13)) then begin textcolor(random(15)+1); write ('*'); password[pnum] := commchar; pnum := pnum + 1; end; end; until commchar = chr(13); {read in loop} writeln; password := password; if password = 'agg3hon' then begin vaccess := true; acksess := true; end; until (cnt = 2) or (vAccess = true); {outer loop} if not(vaccess) then begin writeln; write(' '); slowprint ('Connection closed',4,300,'y'); repeat gotoxy (16,7); textcolor(4); writeln ('ACCESS DENIED'); delay (400); gotoxy (12,7); writeln (' '); delay (400); until keypressed; textattr := 7; halt; end; if vaccess = true then begin textcolor(3); write ('Login '); delay(1000); slowprint ('Confirmation',3,100,'y'); end; end; procedure filecheck(var s:charay); begin FileSearch(S, 'C:\CUREMP.TXT', GetEnvVar('PATH')); if S[0] = #0 then begin assign (ofile, 'C:\CUREMP.TXT'); rewrite(ofile); writeln (ofile, '0'); close(ofile); end; FileSearch(S, 'C:\FORMEMP.TXT', GetEnvVar('PATH')); if S[0] = #0 then begin assign (ofile, 'C:\FORMEMP.TXT'); rewrite(ofile); writeln (ofile, '0'); close(ofile); end; end; begin clrscr; randomize; access; filecheck(sarray); if acksess = true then begin rpath:='C:\CUREMP.TXT'; readfile(emprek, numofemp, rpath); menu(comstring); end; end.