home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / bbs / tpbbs10.ark / TPUT10.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1986-09-14  |  11.5 KB  |  609 lines

  1. program TPUTIL {BBS system utility program};
  2.  
  3. const
  4.   system='Osborne TurboPascal BBS';
  5.   drive1='A:';{BYE.COM on this drive}
  6.   drive2='A:';{text,BBS stat files on this drive}
  7.   drive3='A:';{message system files on this drive}
  8.   ext='';
  9.   version='TurboPascal BBS v1.0  c1984';
  10.   date1='Original 30 APR 1984';
  11.  
  12. label
  13.   loop10,loop,done;
  14.  
  15. type
  16.   AllStrings=string[128];
  17.   tagline=string[10];
  18.   msgline=string[65];
  19.   username=string[25];
  20.   citystate=string[15];
  21.   password=string[10];
  22.   date=string[8];
  23.   pswd=string[10];
  24.   about=string[25];
  25.   nameto=string[25];
  26.   datetime=string[18];
  27.  
  28.   userlist=record
  29.       name:username;
  30.       address:citystate;
  31.       userpassword:password;
  32.       lastmessage:integer;
  33.       lastdate:datetime;
  34.   end;
  35.  
  36.   stat_list=record
  37.       msgs:integer;
  38.       calls:integer;
  39.       mstart:integer;
  40.       mnum:integer;
  41.   end;
  42.  
  43.   caller_list=record
  44.       caller:username;
  45.       cfrom:citystate;
  46.       cdate:date;
  47.       ctime:date;
  48.   end;
  49.  
  50.   comment_list=record
  51.       comment:msgline;
  52.       end;
  53.  
  54.   summary_list=record
  55.       msgnum:integer;
  56.       person_from:username;
  57.       person_to:nameto;
  58.       subject:about;
  59.       mdate:date;
  60.       mpassword:pswd;
  61.       no_of_lines:integer;
  62.       prev_no_lines:integer;
  63.   end;
  64.  
  65.   newsumm_list=record
  66.       bmsgnum:integer;
  67.       bperson_from:username;
  68.       bperson_to:nameto;
  69.       bsubject:about;
  70.       bmdate:date;
  71.       bmpassword:pswd;
  72.       bno_of_lines:integer;
  73.       bprev_no_lines:integer;
  74.   end;
  75.  
  76.   message_list=record
  77.       msgtext:msgline;
  78.   end;
  79.  
  80.   newmess_list=record
  81.       newmess:msgline;
  82.   end;
  83.  
  84. var
  85.   summary_file:file of summary_list;
  86.   summary_rec:summary_list;
  87.  
  88.   newsumm_file:file of newsumm_list;
  89.   newsumm_rec:newsumm_list;
  90.  
  91.   user_file:file of userlist;
  92.   user_rec:userlist;
  93.  
  94.   stat_file:file of stat_list;
  95.   stat_rec:stat_list;
  96.  
  97.   message_file:file of message_list;
  98.   message_rec:message_list;
  99.  
  100.   newmess_file:file of newmess_list;
  101.   newmess_rec:newmess_list;
  102.  
  103.   caller_file:file of caller_list;
  104.   caller_rec:caller_list;
  105.  
  106.   comment_file:file of comment_list;
  107.   comment_rec:comment_list;
  108.  
  109.   comfile:file;
  110.   f1,f:text;
  111.   temp,temp2:allstrings;
  112.   filename:string[14];
  113.   messbuff: array[1..15] of msgline;
  114.   msghead: array[1..5] of msgline;
  115.   lastname,firstname,whoto,subto,passto,line:allstrings;
  116.   mfirst,mlast,message_pointer,rnum,knum,gg,lmsgs,code,message,zz,flag,d,ff,sp,c,a,b,n,i,x,y,z,lento,lc:integer;
  117.   page,prt,fflag:boolean;
  118.   dd,option,aa: char;
  119.  
  120.  
  121. function StUpCase(st:allstrings):allstrings;
  122.   begin
  123.     for i := 1 to length(st) do
  124.       St[i] := UpCase(st[i]);
  125.     StUpCase := St
  126.   end;
  127.  
  128. {this procedure converts the string in <temp> to
  129.  an integer and returns it in x}
  130. procedure makenum;
  131.  
  132. label done;
  133.  begin
  134.   x:=0;
  135.   z:=0;
  136.   if temp='' then goto done;
  137.   y:=length(temp);
  138.   dd:=copy(temp,y,1);
  139.   if dd='+' then temp:=copy(temp,1,y-1);
  140.   val(temp,x,z);
  141.   if z<>0 then x:=30000; {error, so return absurd #}
  142.  
  143.  done:
  144.  end;
  145.  
  146. {This procedure pads a string with spaces and returns
  147.  it in temp. Use like: pad(input,padlength)}
  148.  
  149. procedure pad(var line:allstrings;l:integer);
  150. label done;
  151.  
  152. begin
  153. if length(line)>=l then goto done;
  154. for i:=length(line)+1 to l do
  155.  begin
  156.   line:=line+' ';
  157.  end;
  158. temp:=line;
  159. done:end;
  160.  
  161. {This procedure gets a Y/N response from user and
  162.  puts it in dd.}
  163.  
  164. procedure pprompt;
  165.  
  166. begin
  167. gg:=0;      {Reset all purpose page counter}
  168. write('More? ');
  169. readln(temp);
  170. if temp='' then temp:=' ';
  171. temp:=stupcase(temp);
  172. dd:=copy(temp,1,1);
  173. end;
  174.  
  175. {This procedure prints out a line. If the PRT toggle
  176.  is ON, it also sends it to the printer}
  177.  
  178. procedure print;
  179.  
  180. begin
  181. writeln(line);
  182. if prt then
  183.  begin
  184.   i:=mem[3];
  185.   mem[3]:=2;
  186.   writeln(line);
  187.   mem[3]:=i;
  188.  end;
  189. line:='';
  190. end;
  191.  
  192. {This procedure reads and prints out the callers
  193.  file and, at the operators descretion, creates a
  194.  new file.}
  195.  
  196. procedure callers;
  197. label loop,query,done;
  198.  
  199. begin
  200. assign(caller_file,drive2+'CALLERS'+ext);
  201. reset(caller_file);
  202. read(caller_file,caller_rec);
  203. with caller_rec do
  204.  begin
  205.   temp:=caller;
  206.   makenum;
  207.   if x=1 then goto query;
  208.   gg:=0;
  209.   dd:='Y';
  210.   for i:=1 to x-1 do
  211.    begin
  212.     read(caller_file,caller_rec);
  213.     line:='Name: '+caller;
  214.     print;
  215.     line:='From: '+cfrom;
  216.     print;
  217.     line:='Date: '+cdate;
  218.     print;
  219.     line:='Time: '+ctime;
  220.     print;
  221.     print;
  222.     gg:=gg+1;
  223.     if gg=5 then pprompt;
  224.     if dd='N' then goto query;
  225.    end;
  226.  end;
  227. query:
  228. write('Do you wish to restart the CALLERS file? ');
  229. readln(temp);
  230. if temp='' then temp:='N';
  231. dd:=copy(temp,1,1);
  232. dd:=stupcase(dd);
  233. if dd<>'Y' then goto done;
  234. close(caller_file);
  235. erase(caller_file);
  236. assign(caller_file,drive2+'CALLERS'+ext);
  237. with caller_rec do
  238.  begin
  239.   rewrite(caller_file);
  240.   caller:='1';
  241.   write(caller_file,caller_rec);
  242.  end;
  243.  
  244. done:
  245. close(caller_file);
  246. end;
  247.  
  248. {This procedure reads and prints out the comments
  249.  file and, at the operators descretion, creates a
  250.  new file.}
  251.  
  252. procedure comments;
  253. label loop,query,done;
  254.  
  255. begin
  256. assign(comment_file,drive2+'COMMENTS'+ext);
  257. reset(comment_file);
  258. read(comment_file,comment_rec);
  259. with comment_rec do
  260.  begin
  261.   temp:=comment;
  262.   makenum;
  263.   if x=1 then goto query;
  264.   gg:=0;
  265.   dd:='Y';
  266.   for i:=1 to x-1 do
  267.    begin
  268.     read(comment_file,comment_rec);
  269.     if pos('From',comment)<>0 then print;gg:=gg+1;
  270.     line:=comment;
  271.     print;
  272.     gg:=gg+1;
  273.     if gg>15 then pprompt;
  274.     if dd='N' then goto query;
  275.    end;
  276.  end;
  277. query:
  278. write('Do you wish to restart the COMMENTS file? ');
  279. readln(temp);
  280. if temp='' then temp:='N';
  281. dd:=copy(temp,1,1);
  282. dd:=stupcase(dd);
  283. if dd<>'Y' then goto done;
  284. close(comment_file);
  285. erase(comment_file);
  286. assign(comment_file,drive2+'COMMENTS'+ext);
  287. with comment_rec do
  288.  begin
  289.   rewrite(comment_file);
  290.   comment:='1';
  291.   write(comment_file,comment_rec);
  292.  end;
  293.  
  294. done:
  295. close(comment_file);
  296. end;
  297.  
  298. {This procedure displays the entire message file.}
  299.  
  300. procedure messages;
  301. label done;
  302.  
  303. begin
  304. assign(message_file,drive3+'MESSAGES'+ext);
  305. reset(message_file);
  306. dd:='Y';
  307. print;
  308. while not eof(message_file) do
  309.  begin
  310.   read(message_file,message_rec);
  311.   with message_rec do
  312.    begin
  313.     line:=msgtext;
  314.     print;
  315.     if msgtext='9999' then
  316.      begin
  317.       print;
  318.       pprompt;
  319.       if dd='N' then goto done;
  320.       print;
  321.      end;
  322.    end;
  323.  end;
  324.  
  325. done:
  326. writeln('Message file shown.');
  327. close(message_file);
  328. end;
  329.  
  330. {This procedure access the summary file}
  331. procedure summary;
  332. label done;
  333.  
  334. begin
  335. assign(summary_file,drive3+'SUMMARY'+ext);
  336. reset(summary_file);
  337. dd:='Y';
  338. gg:=0;
  339. print;
  340. while not eof(summary_file) do
  341.  begin
  342.   read(summary_file,summary_rec);
  343.   with summary_rec do
  344.    begin
  345.     str(msgnum,temp);
  346.     line:='Msg #    : '+temp;
  347.     print;
  348.     line:='From     : '+person_from;
  349.     print;
  350.     line:='To       : '+person_to;
  351.     print;
  352.     line:='Subject  : '+subject;
  353.     print;
  354.     line:='Date     : '+mdate;
  355.     print;
  356.     line:='Password : '+mpassword;
  357.     print;
  358.     str(no_of_lines,temp);
  359.     line:='Lines    : '+temp;
  360.     print;
  361.     print;
  362.     print;
  363.     gg:=gg+1;
  364.     if gg=2 then
  365.      begin
  366.       gg:=0;
  367.       pprompt;
  368.       if dd='N' then goto done;
  369.      end;
  370.    end;
  371.  end;
  372.  
  373. done:
  374. close(summary_file);
  375. end;
  376.  
  377.  
  378. {This procedure repacks the summary,counters and messages files}
  379. procedure pack;
  380. label next,loop;
  381.  
  382. begin
  383. write('Repacking summary file...');
  384. mfirst:=0;
  385. assign(summary_file,drive3+'SUMMARY'+ext);
  386. assign(newsumm_file,drive3+'SUMMARY.NEW');
  387. reset(summary_file);
  388. rewrite(newsumm_file);
  389. while not eof(summary_file) do
  390.  begin
  391.   read(summary_file,summary_rec);
  392.   with summary_rec do
  393.    begin
  394.     if msgnum<>0 then
  395.      begin
  396.       if mfirst=0 then mfirst:=msgnum;
  397.       with newsumm_rec do
  398.        begin
  399.         bmsgnum:=msgnum;
  400.         bperson_from:=person_from;
  401.         bperson_to:=person_to;
  402.         bsubject:=subject;
  403.         bmdate:=mdate;
  404.         bmpassword:=mpassword;
  405.         bno_of_lines:=no_of_lines;
  406.         bprev_no_lines:=prev_no_lines;
  407.        end;
  408.       write(newsumm_file,newsumm_rec);
  409.      end;
  410.    end;
  411.  end;
  412. close(summary_file);
  413. erase(summary_file);
  414. close(newsumm_file);
  415. rename(newsumm_file,drive3+'SUMMARY'+ext);
  416. writeln;
  417. write('Updating counter file...');
  418. assign(stat_file,drive3+'COUNTERS'+ext);
  419. reset(stat_file);
  420. read(stat_file,stat_rec);
  421. with stat_rec do
  422.  begin
  423.   seek(stat_file,filepos(stat_file)-1);
  424.   msgs:=msgs;
  425.   calls:=calls;
  426.   mstart:=mfirst;
  427.   mnum:=mnum;
  428.   write(stat_file,stat_rec);
  429.  end;
  430. close(stat_file);
  431. writeln;
  432. write('Repacking message file...');
  433. assign(message_file,drive3+'MESSAGES'+ext);
  434. assign(newmess_file,drive3+'MESSAGES.NEW');
  435. reset(message_file);
  436. rewrite(newmess_file);
  437. while not eof(message_file) do
  438.  begin
  439.   read(message_file,message_rec);
  440.   with message_rec do
  441.    begin
  442.     line:=copy(msgtext,1,2);
  443.     if line='0:' then goto loop;
  444.     with newmess_rec do
  445.      begin
  446.       newmess:=msgtext;
  447.       write(newmess_file,newmess_rec);
  448.       goto next;
  449.      end;
  450.     loop:
  451.     while msgtext<>'9999' do
  452.      begin
  453.       read(message_file,message_rec);
  454.      end;
  455.     next:
  456.    end;
  457. end;
  458. close(message_file);
  459. erase(message_file);
  460. close(newmess_file);
  461. rename(newmess_file,drive3+'MESSAGES'+ext);
  462. writeln;
  463. writeln(chr(7),'Repacking complete.');
  464. end;
  465.  
  466. {This procedure access the user file}
  467. procedure user;
  468. label done;
  469.  
  470. begin
  471. assign(user_file,drive3+'USER'+ext);
  472. reset(user_file);
  473. dd:='Y';
  474. gg:=0;
  475. print;
  476. while not eof(user_file) do
  477.  begin
  478.   read(user_file,user_rec);
  479.   with user_rec do
  480.    begin
  481.     line:='Name          : '+name;
  482.     print;
  483.     line:='Address       : '+address;
  484.     print;
  485.     line:='Password      : '+userpassword;
  486.     print;
  487.     str(lastmessage,temp);
  488.     line:='Last high msg : '+temp;
  489.     print;
  490.     line:='Last date/time: '+lastdate;
  491.     print;
  492.     print;
  493.     gg:=gg+1;
  494.     if gg=3 then
  495.      begin
  496.       gg:=0;
  497.       pprompt;
  498.       if dd='N' then goto done;
  499.      end;
  500.    end;
  501.  end;
  502.  
  503. done:
  504. close(user_file);
  505. end;
  506.  
  507. procedure get_command;
  508. label start;
  509.  
  510. begin
  511.  start:
  512.   write('Function: L,C,M,S,E,T,P,U (? for HELP) :');
  513.   temp:='';
  514.   readln(temp);
  515.   if temp<>'' then
  516.    begin
  517.     temp:=stupcase(temp);
  518.     ff:=pos(temp,'LCMSE?TPU');
  519.     if ff=0 then
  520.       begin
  521.         writeln('I don','''','t understand ','''',temp,'''',', SYSOP.');
  522.         writeln;
  523.         goto start;
  524.       end;
  525.    end;
  526. end;
  527.  
  528. procedure do_command;
  529. {Process command}
  530. begin
  531. if temp<>'' then
  532. begin
  533. case ff of
  534.  
  535.  1: begin
  536.      callers;
  537.     end;
  538.  
  539.  2: begin
  540.      comments;
  541.     end;
  542.  
  543.  3: begin
  544.      messages;
  545.     end;
  546.  
  547.  4: begin
  548.      summary;
  549.     end;
  550.  
  551.  5: begin
  552.      bdos(0);
  553.     end;
  554.  
  555.  6: begin
  556.      writeln;
  557.      writeln('           [Turbo BBS Utility Menu]');
  558.      writeln;
  559.      writeln('L: Log file            C: Comments file');
  560.      writeln('M: Message file        S: Summary file');
  561.      writeln('E: Exit to system      T: print Toggle');
  562.      writeln('P: rePack system files U: User file');
  563.      writeln;
  564.     end;
  565.  
  566.  7: begin
  567.      prt:=not prt;
  568.      temp:='++ Printer toggle ';
  569.      if prt then temp:=temp+'ON ++'
  570.      else temp:=temp+'OFF ++';
  571.      writeln(temp);
  572.     end;
  573.  
  574.  8: begin
  575.      pack;
  576.     end;
  577.  
  578.  9: begin
  579.      user;
  580.     end;
  581.  
  582. end;
  583. end;
  584. end;
  585.  
  586.  
  587. {Main program starts here}
  588.  
  589. begin
  590.  
  591. prt:=false;
  592. write(chr(26));
  593. writeln('Turbo Pascal BBS Utility Program');
  594. writeln;
  595. loop:
  596. get_command;
  597. do_command;
  598. goto loop;
  599.  
  600. done:
  601. end.
  602.  
  603. (26));
  604. writeln('Turbo Pascal BBS Utility Program');
  605. writeln;
  606. loop:
  607. get_command;
  608. do_command;
  609. goto