home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 341.img / TCS161S.ZIP / CONFIG.PAS < prev    next >
Pascal/Delphi Source File  |  1989-11-28  |  24KB  |  1,096 lines

  1. program config;
  2.  
  3. {$R-,S+,I-,D+,F-,V-,B-,N-,L+ }
  4. {$M 16384,5000,5000 }
  5.  
  6. uses crt,
  7.      scrnunit,scrninpt,
  8.     general,prompts,
  9.      gentypes,configrt;
  10.  
  11. const normalcolor=3;
  12.       boldcolor=9;
  13.       barcolor=$1f;
  14.       inputcolor=11;
  15.       choicecolor=15;
  16.       datacolor=15;
  17.  
  18. var prompt:promptset;
  19.  
  20. procedure writeconfig;
  21. var q:file of configsettype;
  22. begin
  23.   assign (q,'TCS.CFG');
  24.   rewrite (q);
  25.   write (q,configset);
  26.   close (q)
  27. end;
  28.  
  29. procedure formatconfig;
  30. var cnt:integer;
  31. begin
  32.   versioncode:=thisversioncode;
  33.   longname[0]:=#0;
  34.   shortname[0]:=#0;
  35.   sysopname[0]:=#0;
  36.   getdir (0,forumdir);
  37.   if forumdir[length(forumdir)]<>'\' then forumdir:=forumdir+'\';
  38.   textdir:=forumdir+'MSG\';
  39.   uploaddir:=forumdir+'GFILES\';
  40.   boarddir:=forumdir+'BOARD\';
  41.   asciidownload:='Downloaded from a TCS Board';
  42.   textfiledir:=forumdir+'MENU\';
  43.   doordir:=forumdir;
  44.   modemsetupstr:='ATM0S0=1|';
  45.   modemhangupstr:='+++~~~ATH|';
  46.   modemdialprefix:='ATDT';
  47.   modemdialsuffix:='|';
  48.   defbaudrate:=2400;
  49.   usecom:=1;
  50.   hashayes:=false;
  51.   anonymouslevel:=40;
  52.   numwelcomes:=1;
  53.   mintimeout:=3;
  54.   sysoplevel:=100;
  55.   defudlevel:=0;
  56.   defudpoints:=0;
  57.   normbotcolor:=11;
  58.   normtopcolor:=13;
  59.   outlockcolor:=14;
  60.   splitcolor:=9;
  61.   statlinecolor:=10;
  62.   uploadfactor:=3;
  63.   private:=false;
  64.   autologin:=false;
  65.   useconmode:=true;
  66.   escinmsgs:=true;
  67. {
  68.   allowcol:=true;
  69.   allowdatfn:=true;
  70.   allowpause:=false;
  71.   allowkeypr:=false;
  72.   allowhandle:=true;
  73.   allowclrscr:=true;
  74. }
  75.   bkspinmsgs:=true;
  76.   requireforms:=true;
  77.   dotchar:='.';
  78.   usebi:=true;
  79.   supportedrates:=[b1200]+[b2400]+[b4800]+[b9600];
  80.   downloadrates:=supportedrates;
  81.   availtime:='4:00 pm';
  82.   unavailtime:='10:00 pm';
  83.   xmodemopentime:='3:00 am';
  84.   xmodemclosetime:='3:00 am';
  85.   for cnt:=1 to 100 do usertime[cnt]:=cnt*2;
  86.   level2nd:=10;
  87.   udlevel2nd:=10;
  88.   udpoints2nd:=0;
  89.   postlevel:=10;
  90.   anonymousstr:='<Anonymous>';
  91.   usematrix:=true;
  92.   matrixtype:=1;
  93.   newusermatrix:=true;
  94.   systempassword:='TCSBBS';
  95.   newuserpass:='';
  96.   remotedoors:=false;
  97.   allowdoors:=false;
  98.   eventtime[0]:=#0;
  99.   eventbatch[0]:=#0;
  100.   directvideomode:=true;
  101.   checksnowmode:=true;
  102.   hangnewusers:=true;
  103.   msgnextlvl:=10;
  104.   appear:='The Sysop is here.';
  105.   disappear:='The Sysop is gone.';
  106.   telenumber:='[800] 555-1212';
  107.   timerestlvl:=1;
  108.   timereststart[0]:=#0;
  109.   timerestend[0]:=#0;
  110.   sklog:=forumdir+'SUPERK.LOG';
  111.   dszlogname:=forumdir+'DSZ.LOG';
  112.   jshutup:=true;
  113.   newusernote:='New User';
  114.   system2password[0]:=#0;
  115.   system3password[0]:=#0;
  116.   availstr:='The Sysop is available for chat.';
  117.   notavailstr:='The Sysop is not available for chat.';
  118.   useqr:=true;
  119.   qrlimit:=-25;
  120.   qrmultifactor:=5;
  121.   qrexempt:=60;
  122.   usecliche:=true;
  123.   cliche:='TCS - The Only Choice!';
  124.   ulpercent:=50;
  125.   checkautologin:=true;
  126.   usegambling:=true;
  127.   chance     :=20;
  128.   gain       :=5;
  129.   numpoints  :=100;
  130.   numthrows  :=5;
  131.   convrate   :=10;
  132.   maxdeposit :=120;
  133.   albank     :=true;
  134.   aldarts    :=true;
  135.   alrr       :=true;
  136.   alrb       :=true;
  137.   alhl       :=true;
  138.   alr        :=true;
  139.   alc        :=true;
  140.   usetimebank:=true;
  141.   readanonlvl:=50;
  142.   listuserlvl:=40;
  143.   ems:=false;
  144.   datascrambling:=false;
  145.   pcrexempt:=70;
  146.   xferpcr:=25;
  147.   gfpcr:=20;
  148.   gfratio:=20;
  149.   udratio:=20;
  150.   udexempt:=60;
  151.   doorpcr:=15;
  152.   matrixfback:=true;
  153.   matrixreqchat:=true;
  154.   editor:='C:\Q.EXE';
  155.   userumor:=true;
  156.   filepw:=true;
  157.   netnum:=11;
  158.   netpas:='NetWork Password';
  159.   tenderpas:='Password';
  160.   xmodemr:='dsz.com port %1 speed %2 rx -c %3';
  161.   xmodems:='dsz.com port %1 speed %2 sx -k %3';
  162.   ymodemr:='dsz.com port %1 speed %2 rx -c %3';
  163.   ymodems:='dsz.com port %1 speed %2 sx -k %3';
  164.   zmodemr:='dsz.com port %1 speed %2 rz %3';
  165.   zmodems:='dsz.com port %1 speed %2 sz -s %3';
  166.   jmodemr:='jmodem.com R%1 %3';
  167.   jmodems:='jmodem.com S%1 %3';
  168.   lynxr:='lynx.exe R /%1 /%2 %3';
  169.   lynxs:='lynx.exe S /%1 /%2 %3';
  170.   xovrr:='dsz.com port %1 speed %2 ro %3';
  171.   xovrs:='dsz.com port %1 speed %2 so %3';
  172.   yovrr:='dsz.com port %1 speed %2 rb -o %3';
  173.   yovrs:='dsz.com port %1 speed %2 sb -o %3';
  174.   ymodemgr:='dsz.com port %1 speed %2 rb -g %3';
  175.   ymodemgs:='dsz.com port %1 speed %2 sb -g %3';
  176.   superkr:='superk.com p%1 s%2 rs f %3';
  177.   superks:='superk.com p%1 s%2 ss f %3';
  178.   k9xr:='superk.com p%1 s%2 rk f %3';
  179.   k9xs:='superk.com p%1 s%2 sk f %3';
  180.   zcrashr:='dsz.com port %1 speed %2 rz -r %3';
  181.   zcrashs:='dsz.com port %1 speed %2 sz -r %3';
  182.   zpcpr:='dsz.com port %1 speed %2 rz -w %3';
  183.   zpcps:='dsz.com port %1 speed %2 sz -w %3';
  184.   wxmodemr:='superk.com p%1 s%2 rw f %3';
  185.   wxmodems:='superk.com p%1 s%2 sw f %3';
  186.   zrles:='dsz.com port %1 speed %2 sz -Z %3';
  187.   punterr:='punter.exe R P%1 B%1 %3';
  188.   punters:='punter.exe S P%1 B%1 %3';
  189.   writeconfig
  190. end;
  191.  
  192.  
  193. type ttypetype=(TInteger,Tsstr,Tmstr,Tlstr,TBoolean,TChar,TBaudset,
  194.                 TPath,TTime,TAttrib,Tusertime,Badtype);
  195.      ptrset=record
  196.        case integer of
  197.          0:(i:^integer);
  198.          1:(l:^lstr);
  199.          2:(b:^boolean);
  200.          3:(k:^char);
  201.          4:(baudsetptr:^baudset)
  202.      end;
  203.      thing=record
  204.        text:mstr;
  205.        descrip:lstr;
  206.        ttype:ttypetype;
  207.        p:pointer;
  208.        r1,r2:integer
  209.      end;
  210.  
  211. const ttypestr:array [ttypetype] of sstr=
  212.   ('Int','sstr','mstr','lstr','Boo','Char','Baud','Path','Time',
  213.    'Attrib','Usertime','!!!!????');
  214.       colorstr:array [0..15] of mstr=
  215.   ('Black','Blue ','Green ','Cyan ','Red ','Magenta ','Brown ','White ',
  216.    'Gray ','BLUE!','GREEN!','CYAN!','RED!','MAGENTA!','YELLOW!','WHITE!');
  217.  
  218. const maxthings=200;
  219.       dcol=30;
  220.  
  221. var top,bot,page,numpages,numthings:integer;
  222.     things:array [1..maxthings] of thing;
  223.  
  224. procedure cb;
  225. begin
  226.   setcolor (boldcolor)
  227. end;
  228.  
  229. procedure c4;
  230. begin
  231.   setcolor (4)
  232. end;
  233.  
  234. procedure cn;
  235. begin
  236.   setcolor (normalcolor)
  237. end;
  238.  
  239. procedure c7;
  240. begin
  241.   setcolor (7)
  242. end;
  243.  
  244. procedure cs;
  245. begin
  246.  setcolor (boldcolor);
  247. end;
  248.  
  249. procedure cd;
  250. begin
  251.  setcolor (normalcolor);
  252. end;
  253.  
  254. function match(a1,a2:anystr):boolean;
  255. var cnt:integer;
  256. begin
  257.   match:=false;
  258.   while a1[length(a1)]=' ' do a1[0]:=pred(a1[0]);
  259.   while a2[length(a2)]=' ' do a2[0]:=pred(a2[0]);
  260.   if length(a1)<>length(a2) then exit;
  261.   for cnt:=1 to length(a1) do
  262.     if upcase(a1[cnt])<>upcase(a2[cnt]) then exit;
  263.   match:=true
  264. end;
  265.  
  266. function yesnostr (var b:boolean):sstr;
  267. begin
  268.   if b and (ord(b)<>ord(true)) then b:=true;
  269.   if b then yesnostr:='Yes' else yesnostr:='No'
  270. end;
  271.  
  272. function strr (n:integer):mstr;
  273. var q:mstr;
  274. begin
  275.   str (n,q);
  276.   strr:=q
  277. end;
  278.  
  279. function valu (q:mstr):integer;
  280. var i,s:integer;
  281. begin
  282.   val (q,i,s);
  283.   if s=1
  284.     then valu:=0
  285.     else valu:=i
  286. end;
  287.  
  288. function whichpage (n:integer):integer;
  289. begin
  290.   whichpage:=((n-1) div 20)+1
  291. end;
  292.  
  293. function whichline (n:integer):integer;
  294. begin
  295.   whichline:=n-20*(whichpage(n)-1)+2
  296. end;
  297.  
  298. function getbaudstr (var q:baudset):lstr;
  299. var w:lstr;
  300.     cnt:baudratetype;
  301. begin
  302.   w[0]:=chr(0);
  303.   for cnt:=firstbaud to lastbaud do
  304.     if cnt in q then w:=w+strr(baudarray[cnt])+' ';
  305.   if length(w)=0 then w:='None';
  306.   getbaudstr:=w
  307. end;
  308.  
  309. function varstr (n:integer):string;
  310. var pu:pointer;
  311.     p:ptrset absolute pu;
  312. begin
  313.   pu:=things[n].p;
  314.   case things[n].ttype of
  315.     tinteger:varstr:=strr(p.i^);
  316.     tlstr,tmstr,tsstr,tpath,ttime:varstr:=p.l^;
  317.     tboolean:varstr:=yesnostr(p.b^);
  318.     tchar:varstr:=p.k^;
  319.     tbaudset:varstr:=getbaudstr (p.baudsetptr^);
  320.     tattrib:varstr:=colorstr[p.i^];
  321.     tusertime:varstr:='(Choose this choice to configure user daily time)';
  322.     else varstr:='??!?!?!'
  323.   end
  324. end;
  325.  
  326. procedure writevar (n:integer);
  327. begin
  328.   cb;
  329.   write (varstr(n));
  330.   cn; clreol;
  331.   writeln
  332. end;
  333.  
  334. procedure gotopage (p:integer);
  335. var cnt,cy:integer;
  336. begin
  337.   if p<1 then p:=1;
  338.   if p>numpages then p:=numpages;
  339.   if p<>page then begin
  340.     if page<>0 then freeprompts (prompt);
  341.     page:=p;
  342.     gotoxy (1,1);
  343.     cn; write ('TCS BBS v');
  344.     cn; write (ver);
  345.     cn; write (' Configuration - ');
  346.     cn; write ('Page ');
  347.     cb; write (page);
  348.     cn; write (' of ');
  349.     cb; write (numpages);
  350.     cn; writeln (':  ');
  351.     writeln;
  352.     top:=(page-1)*20+1;
  353.     bot:=top+19;
  354.     if bot>numthings then bot:=numthings;
  355.     beginprompts (prompt);
  356.     for cnt:=top to top+19 do begin
  357.       cy:=cnt-top+3;
  358.       gotoxy (1,cy);
  359.       cn; clreol;
  360.       if cnt<=bot then begin
  361.         addprompt (prompt,command,prompt,5,cnt-top+3,things[cnt].text+':');
  362.         setinputwid (prompt,0);
  363.         drawprompt (prompt);
  364.         gotoxy (1,cy);
  365.         cn; write (cnt:2,'. ');
  366.         gotoxy (dcol,wherey);
  367.         writevar (cnt)
  368.       end
  369.     end
  370.   end
  371. end;
  372.  
  373. procedure readdata;
  374. var q:text;
  375.     t:mstr;
  376.  
  377.   procedure dataerror (n:lstr);
  378.   begin
  379.     writeln ('Record ',numthings,': '+n);
  380.     halt
  381.   end;
  382.  
  383.   procedure illtype;
  384.   begin
  385.     dataerror ('Invalid type: '+t)
  386.   end;
  387.  
  388.   procedure getrange (t:mstr; var r1,r2:integer);
  389.   var sp,da,n1,n2:integer;
  390.   begin
  391.     sp:=pos(' ',t);
  392.     r1:=-32767;
  393.     r2:=32767;
  394.     if sp=0 then exit;
  395.     t:=copy(t,sp+1,255);
  396.     if length(t)<1 then exit;
  397.     da:=pos('-',t);
  398.     if (da=1) and (length(t)=1) then exit;
  399.     if da=0 then begin
  400.       r1:=valu(t);
  401.       r2:=r1;
  402.       exit
  403.     end;
  404.     n1:=valu(copy(t,1,da-1));
  405.     n2:=valu(copy(t,da+1,255));
  406.     if da=1 then begin
  407.       r2:=n2;
  408.       exit
  409.     end;
  410.     r1:=n1;
  411.     if da=length(t) then exit;
  412.     r2:=n2
  413.   end;
  414.  
  415.   procedure gettype (t:mstr; var tt:ttypetype);
  416.   var sp:integer;
  417.       fw:mstr;
  418.   begin
  419.     tt:=ttypetype(0);
  420.     sp:=pos(' ',t);
  421.     if sp=0
  422.       then fw:=t
  423.       else fw:=copy(t,1,sp-1);
  424.     while tt<>badtype do
  425.       begin
  426.         if match(fw,ttypestr[tt]) then exit;
  427.         tt:=succ(tt)
  428.       end;
  429.     tt:=badtype;
  430.     illtype
  431.   end;
  432.  
  433. begin
  434.   assign (q,'Config.Dat');
  435.   reset (q);
  436.   numthings:=0;
  437.   if ioresult<>0 then dataerror ('File CONFIG.DAT not found!');
  438.   while not eof(q) do begin
  439.     numthings:=numthings+1;
  440.     with things[numthings] do begin
  441.       readln (q,text);
  442.       readln (q,descrip);
  443.       readln (q,t);
  444.       gettype (t,ttype);
  445.       if ttype=tinteger then getrange (t,r1,r2)
  446.     end
  447.   end;
  448.   close (q)
  449. end;
  450.  
  451. procedure assignptrs;
  452. var cnt:integer;
  453.  
  454.   procedure s (var q);
  455.   begin
  456.     cnt:=cnt+1;
  457.     things[cnt].p:=@q
  458.   end;
  459.  
  460. begin
  461.   cnt:=0;
  462.   s (longname);
  463.   s (shortname);
  464.   s (sysopname);
  465.   s (autologin);
  466.   s (forumdir);
  467.   s (textdir);
  468.   s (boarddir);
  469.   s (uploaddir);
  470.   s (textfiledir);
  471.   s (doordir);
  472.   s (supportedrates);
  473.   s (downloadrates);
  474.   s (defbaudrate);
  475.   s (usecom);
  476.   s (hashayes);
  477.   s (modemsetupstr);
  478.   s (modemhangupstr);
  479.   s (modemdialprefix);
  480.   s (modemdialsuffix);
  481.   s (sysoplevel);
  482.   s (anonymouslevel);
  483.   s (numwelcomes);
  484.   s (private);
  485.   s (directvideomode);
  486.   s (checksnowmode);
  487.   s (useconmode);
  488.   s (escinmsgs);
  489. {
  490.   s (allowcol);
  491.   s (allowdatfn);
  492.   s (allowpause);
  493.   s (allowkeypr);
  494.   s (allowhandle);
  495.   s (allowclrscr);
  496. }
  497.   s (bkspinmsgs);
  498.   s (normbotcolor);
  499.   s (normtopcolor);
  500.   s (outlockcolor);
  501.   s (splitcolor);
  502.   s (statlinecolor);
  503.   s (usertime);
  504.   s (mintimeout);
  505.   s (dotchar);
  506.   s (asciidownload);
  507.   s (defudlevel);
  508.   s (defudpoints);
  509.   s (level2nd);
  510.   s (udlevel2nd);
  511.   s (udpoints2nd);
  512.   s (postlevel);
  513.   s (uploadfactor);
  514.   s (availtime);
  515.   s (unavailtime);
  516.   s (xmodemopentime);
  517.   s (xmodemclosetime);
  518.   s (usematrix);
  519.   s (matrixtype);
  520.   s (newusermatrix);
  521.   s (systempassword);
  522.   s (newuserpass);
  523.   s (system2password);
  524.   s (system3password);
  525.   s (anonymousstr);
  526.   s (requireforms);
  527.   s (remotedoors);
  528.   s (allowdoors);
  529.   s (eventtime);
  530.   s (eventbatch);
  531.   s (hangnewusers);
  532.   s (msgnextlvl);
  533.   s (appear);
  534.   s (disappear);
  535.   s (telenumber);
  536.   s (timerestlvl);
  537.   s (timereststart);
  538.   s (timerestend);
  539.   s (sklog);
  540.   s (dszlogname);
  541.   s (jshutup);
  542.   s (newusernote);
  543.   s (availstr);
  544.   s (notavailstr);
  545.   s (useqr);
  546.   s (qrmultifactor);
  547.   s (qrlimit);
  548.   s (qrexempt);
  549.   s (usecliche);
  550.   s (cliche);
  551.   s (usegambling);
  552.   s (chance);
  553.   s (gain);
  554.   s (numpoints);
  555.   s (numthrows);
  556.   s (convrate);
  557.   s (maxdeposit);
  558.   s (albank);
  559.   s (aldarts);
  560.   s (alrr);
  561.   s (alrb);
  562.   s (alhl);
  563.   s (alr);
  564.   s (alc);
  565.   s (usetimebank);
  566.   s (ulpercent);
  567.   s (checkautologin);
  568.   s (readanonlvl);
  569.   s (listuserlvl);
  570.   s (ems);
  571.   s (pcrexempt);
  572.   s (xferpcr);
  573.   s (gfpcr);
  574.   s (gfratio);
  575.   s (udratio);
  576.   s (udexempt);
  577.   s (doorpcr);
  578.   s (tenderpas);
  579.   s (datascrambling);
  580.   s (matrixfback);
  581.   s (matrixreqchat);
  582.   s (editor);
  583.   s (userumor);
  584.   s (filepw);
  585.   s (netnum);
  586.   s (netpas);
  587.   s (usebi);
  588.   s (xmodemr);
  589.   s (xmodems);
  590.   s (ymodemr);
  591.   s (ymodems);
  592.   s (zmodemr);
  593.   s (zmodems);
  594.   s (jmodemr);
  595.   s (jmodems);
  596.   s (lynxr);
  597.   s (lynxs);
  598.   s (xovrr);
  599.   s (xovrs);
  600.   s (yovrr);
  601.   s (yovrs);
  602.   s (ymodemgr);
  603.   s (ymodemgs);
  604.   s (superkr);
  605.   s (superks);
  606.   s (k9xr);
  607.   s (k9xs);
  608.   s (zcrashr);
  609.   s (zcrashs);
  610.   s (zpcpr);
  611.   s (zpcps);
  612.   s (wxmodemr);
  613.   s (wxmodems);
  614.   s (zrles);
  615.   s (punterr);
  616.   s (punters);
  617.   if cnt<>numthings then begin
  618.     writeln ('Error in number of items of CONFIG.DAT');
  619.     writeln ('Expected: ',numthings);
  620.     writeln ('Actual:   ',cnt);
  621.     halt
  622.   end
  623. end;
  624.  
  625. procedure byebye;
  626. begin
  627.   clearwindow (normalcolor);
  628.   gotoxy (38,24);
  629.   cb; writeln ('Bye!');
  630.   halt
  631. end;
  632.  
  633. procedure abortyn;
  634. var q:sstr;
  635. begin
  636.   gotoxy (1,24);
  637.   setcolor (datacolor);
  638.   write ('Confirm abort [y/n]: ');
  639.   cn;
  640.   clreol;
  641.   buflen:=1;
  642.   readln (q);
  643.   if length(q)>0 then if upcase(q[1])='Y' then byebye
  644. end;
  645.  
  646. procedure getinput (n:integer; editit:boolean);
  647. var y:integer;
  648.     inp:lstr;
  649.     t:thing;
  650.     pu:pointer;
  651.     p:ptrset absolute pu;
  652.  
  653.   procedure reshow;
  654.   begin
  655.     gotoxy (dcol,y);
  656.     writevar (n)
  657.   end;
  658.  
  659.   procedure showintrange;
  660.   begin
  661.     setcolor (datacolor); {c7}
  662.     with t do
  663.       if r1=-32767
  664.         then if r2=32767
  665.           then write ('No range limitation.')
  666.           else write ('Maximum value: ',r2)
  667.         else if r2=32767
  668.           then write ('Minimum value: ',r1)
  669.           else write ('Valid values range from ',r1,' to ',r2);
  670.     cn
  671.   end;
  672.  
  673.   procedure doint;
  674.   var n,s:integer;
  675.       k:char;
  676.   begin
  677.     val (inp,n,s);
  678.     gotoxy (1,24);
  679.     if s<>0
  680.       then
  681.         begin
  682.           setcolor (datacolor);
  683.           writeln ('Invalid number!  A number must be from -32767 to 32767.');
  684.           cn;
  685.           write ('Press any key...');
  686.           clreol;
  687.           k:=bioskey
  688.         end
  689.       else if (n>=t.r1) and (n<=t.r2)
  690.         then p.i^:=n
  691.         else
  692.           begin
  693.             setcolor (datacolor);
  694.             writeln ('Range error!  Must be within the above limits!  ');
  695.             cn;
  696.             write ('Press any key...');
  697.             clreol;
  698.             k:=bioskey
  699.           end
  700.   end;
  701.  
  702.   procedure dostr;
  703.   begin
  704.     if (inp='N') or (inp='n') then inp:='';
  705.     p.l^:=inp
  706.   end;
  707.  
  708.   procedure doboolean;
  709.   begin
  710.     case upcase(inp[1]) of
  711.       'Y':p.b^:=true;
  712.       'N':p.b^:=false
  713.     end
  714.   end;
  715.  
  716.   procedure dochar;
  717.   begin
  718.     p.k^:=inp[1]
  719.   end;
  720.  
  721.   procedure dopath;
  722.   var lc:char;
  723.       cur:lstr;
  724.       n:integer;
  725.   begin
  726.     lc:=inp[length(inp)];
  727.     if (length(inp)<>1) or (upcase(lc)<>'N')
  728.       then if (lc<>':') and (lc<>'\') then inp:=inp+'\';
  729.     dostr;
  730.     if inp[length(inp)]='\' then inp[0]:=pred(inp[0]);
  731.     getdir (0,cur);
  732.     chdir (inp);
  733.     n:=ioresult;
  734.     chdir (cur);
  735.     if n=0 then exit;
  736.     setcolor (datacolor);
  737.     gotoxy (1,24);
  738.     write ('Path doesn''t exist!  ');
  739.     cn; write ('Create it now? '); clreol;
  740.     readln (cur);
  741.     if length(cur)=0 then exit;
  742.     if upcase(cur[1])<>'Y' then exit;
  743.     mkdir (inp);
  744.     if ioresult=0 then exit;
  745.     gotoxy (1,24);
  746.     setcolor (datacolor);
  747.     write ('Error creating directory!  ');
  748.     cn; write ('Press any key...');
  749.     clreol;
  750.     lc:=bioskey
  751.   end;
  752.  
  753.   procedure dotime;
  754.   var c,s,l:integer;
  755.       d1,d2,d3,d4:char;
  756.       ap,m:char;
  757.  
  758.     function digit (k:char):boolean;
  759.     begin
  760.       digit:=ord(k) in [48..57]
  761.     end;
  762.  
  763.   begin
  764.     l:=length(inp);
  765.     if l=1 then begin
  766.       if upcase(inp[1])='N' then dostr;
  767.       exit
  768.     end;
  769.     if (l<7) or (l>8) then exit;
  770.     c:=pos(':',inp);
  771.     if c<>l-5 then exit;
  772.     s:=pos(' ',inp);
  773.     if s<>l-2 then exit;
  774.     d2:=inp[c-1];
  775.     if l=7
  776.       then d1:='0'
  777.       else d1:=inp[1];
  778.     d3:=inp[c+1];
  779.     d4:=inp[c+2];
  780.     ap:=upcase(inp[s+1]);
  781.     m:=upcase(inp[s+2]);
  782.     if d1='1' then if d2>'2' then d2:='!';
  783.     if (d1>='0') and (d1<='1') and digit(d2) and (d3>='0') and (d3<='5')
  784.        and digit(d4) and ((ap='A') or (ap='P')) and (m='M') then dostr
  785.   end;
  786.  
  787.   procedure dobaud;
  788.   var inp:lstr;
  789.       n:integer;
  790.       cnt:baudratetype;
  791.   label bfound,again;
  792.   begin
  793.     gotoxy (1,24);
  794.     repeat
  795.       gotoxy (wherex,24);
  796.       write ('Baud Rate to toggle [CR/Quit]: ');
  797.       clreol;
  798.       buflen:=5;
  799.       readln (inp);
  800.       gotoxy (1,24);
  801.       if length(inp)=0 then exit;
  802.       n:=valu(inp);
  803.       for cnt:=b110 to b19200 do if n=baudarray[cnt] then goto bfound;
  804.       cb; write ('Not supported!  '); cn;
  805.       goto again;
  806.       bfound:
  807.       if cnt in p.baudsetptr^
  808.         then p.baudsetptr^:=p.baudsetptr^-[cnt]
  809.         else p.baudsetptr^:=p.baudsetptr^+[cnt];
  810.       reshow;
  811.       again:
  812.     until 0=1
  813.   end;
  814.  
  815.   procedure dousertime;
  816.   var input:lstr;
  817.       n:integer;
  818.       buffer:array [1..4096] of byte;
  819.       b:block;
  820.  
  821.     procedure refresh;
  822.     var cnt:integer;
  823.     begin
  824.       clearwindow (normalcolor);
  825.       gotoxy (1,1);
  826.       cn;
  827.       writeln('Level Time │ Level Time │ Level Time │ Level Time │ Level Time');
  828.       writeln('───────────┴────────────┴────────────┴────────────┴───────────');
  829.       gotoxy (1,3);
  830.       for cnt:=1 to 100 do begin
  831.         write (cnt:4,': ',usertime[cnt]:4);
  832.         if (cnt mod 5)=0 then writeln else write (' │ ')
  833.       end
  834.     end;
  835.  
  836.     procedure setone (n,v:integer);
  837.     var x,y:integer;
  838.     begin
  839.       x:=((n-1) mod 5)*13+7;
  840.       y:=((n-1) div 5)+3;
  841.       gotoxy (x,y);
  842.       write (v:4);
  843.       usertime[n]:=v
  844.     end;
  845.  
  846.     procedure getone (n:integer);
  847.     var x,y,v:integer;
  848.     begin
  849.       x:=((n-1) mod 5)*13+7;
  850.       y:=((n-1) div 5)+3;
  851.       gotoxy (x,y);
  852.       write ('    ');
  853.       gotoxy (x,y);
  854.       buflen:=4;
  855.       readln (input);
  856.       v:=valu(input);
  857.       if (v<1) or (v>1000) then v:=usertime[n];
  858.       setone (n,v)
  859.     end;
  860.  
  861.     function getn (txt:lstr):integer;
  862.     var input:lstr;
  863.     begin
  864.       gotoxy (1,23);
  865.       write (txt,': ');
  866.       clreol;
  867.       buflen:=4;
  868.       readln (input);
  869.       getn:=valu(input)
  870.     end;
  871.  
  872.     function getlvl (txt:lstr):integer;
  873.     var n:integer;
  874.     begin
  875.       n:=getn (txt);
  876.       if (n<1) or (n>100) then n:=0;
  877.       getlvl:=n
  878.     end;
  879.  
  880.     procedure pattern;
  881.     var st,en,ba,se,cn:integer;
  882.     begin
  883.       st:=getlvl ('Starting level of pattern');
  884.       if st=0 then exit;
  885.       en:=getlvl ('Ending level of pattern');
  886.       if en<st then exit;
  887.       ba:=getn ('Time for level '+strr(st));
  888.       if (ba<1) or (ba>1000) then exit;
  889.       se:=getn ('Additional time per level');
  890.       if (se<0) or (se>1000) then exit;
  891.       cn:=st;
  892.       repeat
  893.         setone (cn,ba);
  894.         if ba+se<1000
  895.           then ba:=ba+se
  896.           else ba:=1000;
  897.         cn:=cn+1
  898.       until cn>en
  899.     end;
  900.  
  901.   var k:char;
  902.   begin
  903.     setblock (b,1,1,80,25);
  904.     readblock (b,buffer);
  905.     refresh;
  906.     repeat
  907.       repeat
  908.         gotoxy (1,24);
  909.         write ('Number to change, [P]attern, or [Q]uit: ');
  910.         clreol;
  911.         readln (input)
  912.       until length(input)>0;
  913.       k:=upcase(input[1]);
  914.       n:=valu(input);
  915.       if (n>=1) and (n<=100) then getone(n) else
  916.         case k of
  917.           'P':pattern
  918.         end
  919.     until k='Q';
  920.     writeblock (b,buffer)
  921.   end;
  922.  
  923.   procedure showattribhelp;
  924.   var cnt:integer;
  925.  
  926.     procedure demo;
  927.     begin
  928.       setcolor (cnt);
  929.       write (cnt:2,')',colorstr[cnt],' ')
  930.     end;
  931.  
  932.   begin
  933.     gotoxy (1,23);
  934.     for cnt:=0 to 7 do demo;
  935.     gotoxy (1,24);
  936.     for cnt:=8 to 15 do demo;
  937.     cn
  938.   end;
  939.  
  940.   procedure doattrib;
  941.   var cnt,v:integer;
  942.       k:char;
  943.   begin
  944.     v:=valu(inp);
  945.     if ((v=0) and (inp[1]<>'0')) or (v<0) or (v>15) then begin
  946.       v:=-1;
  947.       for cnt:=0 to 15 do if match (inp,colorstr[cnt]) then v:=cnt;
  948.       if v=-1 then exit
  949.     end;
  950.     p.i^:=v
  951.   end;
  952.  
  953. begin
  954.   t:=things[n];
  955.   pu:=t.p;
  956.   gotopage (whichpage(n));
  957.   y:=whichline(n);
  958.   if not (t.ttype in [tbaudset,tusertime]) then begin
  959.     gotoxy (1,23);
  960.     clreol;
  961.     writeln;
  962.     clreol;
  963.     writeln;
  964.     write (t.descrip);
  965.     clreol;
  966.     gotoxy (1,24);
  967.     case t.ttype of
  968.       tinteger:
  969.         begin
  970.           buflen:=6;
  971.           showintrange
  972.         end;
  973.       tsstr,ttime:buflen:=15;
  974.       tmstr:buflen:=30;
  975.       tlstr,tpath:buflen:=80;
  976.       tboolean,tchar:buflen:=1;
  977.       tattrib:showattribhelp
  978.     end;
  979.     if buflen+dcol>79 then buflen:=79-dcol;
  980.     gotoxy (dcol,y);
  981.     clreol;
  982.     if editit then setdefaultinput (varstr(n));
  983.     readln (inp)
  984.   end else inp[0]:=^A;
  985.   if length(inp)<>0 then
  986.     case t.ttype of
  987.       tinteger:doint;
  988.       tsstr,tmstr,tlstr:dostr;
  989.       tboolean:doboolean;
  990.       tchar:dochar;
  991.       tbaudset:dobaud;
  992.       tpath:dopath;
  993.       ttime:dotime;
  994.       tattrib:doattrib;
  995.       tusertime:dousertime
  996.     end;
  997.   reshow;
  998.   gotoxy (1,23);
  999.   clreol;
  1000.   writeln;
  1001.   clreol;
  1002.   writeln;
  1003.   clreol;
  1004.   t.p:=pu;
  1005.   things[n]:=t
  1006. end;
  1007.  
  1008. procedure changenum (ns:integer; editit:boolean);
  1009. var n:integer;
  1010. begin
  1011.   n:=ns+top-1;
  1012.   if (n<1) or (n>numthings) then exit;
  1013.   getinput (n,editit)
  1014. end;
  1015.  
  1016. procedure maybemakeconfig;
  1017. var f:file of configsettype;
  1018.     s,w:integer;
  1019. begin
  1020.   s:=ofs(filler)-ofs(versioncode);
  1021.   w:=sizeof(configsettype);
  1022.   {if s>w then begin
  1023.     writeln;
  1024.     writeln ('****** ERROR: CONFIGSETTYPE is too short!');
  1025.     writeln ('              Size of configuration is: ',s);
  1026.     writeln ('                   Bytes being written: ',w);
  1027.     writeln;
  1028.     halt
  1029.   end;}
  1030.   assign (f,'TCS.CFG');
  1031.   reset (f);
  1032.   if ioresult=0 then begin
  1033.     close (f);
  1034.     exit
  1035.   end;
  1036.   fillchar (configset,sizeof(configset),0);
  1037.   formatconfig
  1038. end;
  1039.  
  1040. var command:sstr;
  1041.     i:integer;
  1042. begin
  1043. { textmode (BW80); }
  1044.   initscrnunit;
  1045.   curwindowptr^.normalcolor:=normalcolor;
  1046.   curwindowptr^.boldcolor:=boldcolor;
  1047.   curwindowptr^.barcolor:=barcolor;
  1048.   curwindowptr^.inputcolor:=inputcolor;
  1049.   curwindowptr^.choicecolor:=choicecolor;
  1050.   curwindowptr^.datacolor:=datacolor;
  1051.   clrscr;
  1052.   gotoxy (1,1);
  1053.   writeln ('Loading...');
  1054.   readdata;
  1055.   assignptrs;
  1056.   maybemakeconfig;
  1057.   readconfig;
  1058.   i:=ioresult;
  1059.   numpages:=whichpage(numthings);
  1060.   page:=0;
  1061.   gotopage (1);
  1062.   repeat
  1063.     setfilter (checksnowmode);
  1064.     gotoxy (1,24);
  1065.     cd; write ('[');
  1066.     cs; write ('F1');
  1067.     cd; write (']:Edit Entry [');
  1068.     cs; write ('F10');
  1069.     cd; write (']:Save/Exit [');
  1070.     cs; write ('PgUp');
  1071.     cd; write (']:Last Page [');
  1072.     cs; write ('PgDn');
  1073.     cd; write (']:Next Page [');
  1074.     cs; write ('Esc');
  1075.     cd; write (']:Abort');
  1076.     i:=useprompts(prompt);
  1077.     if bioslook in [#32..#126]
  1078.       then changenum (i,false)
  1079.       else case bioskey of
  1080.         #187:begin
  1081.               gotoxy (1,1);
  1082.               write (i);
  1083.               changenum (i,true);
  1084.              end;
  1085.         #196:begin
  1086.               writeconfig;
  1087.               byebye
  1088.              end;
  1089.         #27:abortyn;
  1090.         #13:changenum (i,false);
  1091.         #201:gotopage (page-1);
  1092.         #209:gotopage (page+1);
  1093.       end
  1094.   until 0=1
  1095. end.
  1096.