home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / wincrd.zip / WINCRD.PAS < prev    next >
Pascal/Delphi Source File  |  1986-08-27  |  15KB  |  465 lines

  1.       program wincrd;
  2.  
  3. (*
  4.       This program converts a Microsoft Windows card file
  5.       file to or from an ASCII file format. The ASCII file
  6.       generated or read from consists of one card per line
  7.       with the fields delimited by a tab. The first field is
  8.       the card index line, with the remaining field being
  9.       lines on the card (a field in the ascii line will be
  10.       a series of characters ending in CR/LF on the card, it
  11.       may be more than one text line).
  12.  
  13.       The variable fielddelimiter set in the procedure init
  14.       is used as the field delimiter, and may be changed to
  15.       anything desired. A tab was chosen because windows
  16.       cardfile does not use it.
  17.  
  18.       This program only supports text cards, graphics is
  19.       not supported in any form.
  20.  
  21.       No checking is done on the length of anything input, so
  22.       when converting from ASCII to cardfile, the user must
  23.       insure that the first field (card index line) is less
  24.       than 39 characters long.
  25. *)
  26.  
  27.       type
  28.           filebytetype = string[1];
  29.  
  30.       var
  31.          Cardfile : file;
  32.          Asciifile : text;
  33.          cardfilename, asciifilename : string[64];
  34.          keyhit : string[1];
  35.          charactersin : array[1..1024] of char;
  36.          numberofcharacters : integer;
  37.          blockimage, blockimageblank : string[128];
  38.          currentblockindex : integer;
  39.          currentfilesize : integer;
  40.          i, j, k, l : integer;
  41.          numcards : integer;
  42.          xnumcards : real;
  43.          iop : integer;
  44.          indexchar, datachar : string[1];
  45.          indexblock, indexbyte : integer;
  46.          datablock, databyte : integer;
  47.          datalen : integer;
  48.          fielddelimiter : string [1];
  49.          indexout : boolean;
  50.  
  51.       procedure openfilecardtoascii; forward;
  52.  
  53.       function filebyte(blocknum,bytenum:integer):filebytetype;
  54.       var
  55.          block, byten : integer;
  56.       begin
  57.            block := blocknum * 2;
  58.            if bytenum > 127 then
  59.            begin
  60.            byten := bytenum-128;
  61.            block := block+1;
  62.            end
  63.            else
  64.            byten := bytenum;
  65.            if block = currentblockindex then
  66.            begin
  67.                 filebyte:=blockimage[byten];
  68.            end
  69.            else
  70.            begin
  71.                 seek(cardfile,block);
  72.                 blockread(cardfile,blockimage,1);
  73.                 currentblockindex := block;
  74.                 filebyte:=blockimage[byten];
  75.            end;
  76.       end;
  77.  
  78.       procedure waitforkey;
  79.       var
  80.          waitforkeybyte : string[1];
  81.       begin
  82.            read(kbd,waitforkeybyte);
  83.       end;
  84.  
  85.       function getnumcards:integer;
  86.       begin
  87.            getnumcards := ord(filebyte(0,3)) + ord(filebyte(0,4)) * 256;
  88.       end;
  89.  
  90.       procedure incrementindex(increment:integer);
  91.       begin
  92.            indexbyte := indexbyte + increment;
  93.            if indexbyte > 255 then
  94.            begin
  95.                 indexbyte := indexbyte - 256;
  96.                 indexblock := indexblock + 1;
  97.            end;
  98.       end;
  99.  
  100.       procedure incrementdata(increment:integer);
  101.       begin
  102.            databyte := databyte + increment;
  103.            if databyte > 255 then
  104.            begin
  105.                 databyte := databyte - 256;
  106.                 datablock := datablock + 1;
  107.            end;
  108.       end;
  109.       procedure outputdata;
  110.       var
  111.          i : integer;
  112.       begin
  113.            incrementdata(2);
  114.            datalen := ord(filebyte(datablock,databyte));
  115.            incrementdata(1);
  116.            datalen := datalen + ord(filebyte(datablock,databyte)) * 256;
  117.            i := 1;
  118.            while i <= datalen do
  119.            begin
  120.                 incrementdata(1);
  121.                 datachar := filebyte(datablock,databyte);
  122.                 if datachar = #13 then
  123.                 begin
  124.                      write(asciifile,fielddelimiter);
  125.                      incrementdata(1);
  126.                      i := i + 2;
  127.                 end
  128.                 else
  129.                 begin
  130.                      write(asciifile,datachar);
  131.                      i := i + 1;
  132.                 end;
  133.             end;
  134.        end;
  135.  
  136.        procedure usermessage(icard:integer);
  137.        begin
  138.             gotoxy(29,3);
  139.             write(icard);
  140.        end;
  141.  
  142.       procedure cardtoascii;
  143.       var
  144.          i, j : integer;
  145.       begin
  146.            openfilecardtoascii;
  147.            numcards := getnumcards;
  148.            clrscr;
  149.            writeln('Number of cards in file is ',numcards);
  150.            gotoxy(5,3);
  151.            write('Processing card number');
  152.            indexblock := 0;
  153.            indexbyte := 11;
  154.            for i := 1 to numcards do
  155.            begin
  156.                 databyte := ord(filebyte(indexblock,indexbyte));
  157.                 incrementindex(1);
  158.                 j := ord(filebyte(indexblock,indexbyte));
  159.                 incrementindex(1);
  160.                 j := j + ord(filebyte(indexblock,indexbyte)) * 256;
  161.                 datablock := j;
  162.                 incrementindex(2);
  163.                 indexout := true;
  164.                 for j := 1 to 46 do
  165.                 begin
  166.                      incrementindex(1);
  167.                      indexchar := filebyte(indexblock,indexbyte);
  168.                      if indexout and (ord(indexchar) = 0) then
  169.                      begin
  170.                           indexout := false;
  171.                           write(asciifile,fielddelimiter);
  172.                      end;
  173.                      if indexout then
  174.                      begin
  175.                           write(asciifile,indexchar);
  176.                      end;
  177.                  end;
  178.                  incrementindex(2);
  179.                  outputdata;
  180.            write(asciifile,#13,#10);
  181.            usermessage(i);
  182.            end;
  183.            close(asciifile);
  184.            close(cardfile);
  185.       end;
  186.  
  187.       procedure openfilecardtoascii;
  188.       begin
  189.            clrscr;
  190.            writeln('Enter name of Cardfile file');
  191.            readln(cardfilename);
  192.            clrscr;
  193.            writeln('Enter name of Ascii file');
  194.            readln(asciifilename);
  195.            clrscr;
  196.            assign(cardfile,cardfilename);
  197.            assign(asciifile,asciifilename);
  198.            reset(cardfile);
  199.            rewrite(asciifile);
  200.            currentblockindex := -1;
  201.       end;
  202.  
  203.       procedure openfileasciitocard;
  204.       begin
  205.            clrscr;
  206.            writeln('Enter name of Ascii file');
  207.            readln(asciifilename);
  208.            clrscr;
  209.            writeln('Enter name of Cardfile file');
  210.            readln(cardfilename);
  211.            clrscr;
  212.            assign(cardfile,cardfilename);
  213.            assign(asciifile,asciifilename);
  214.            rewrite(cardfile);
  215.            reset(asciifile);
  216.            currentblockindex := 0;
  217.            for I := 0 to 127 do
  218.            begin
  219.                 blockimage[i] := chr(0);
  220.            end;
  221.            blockimage[0] := chr($4d);
  222.            blockimage[1] := chr($47);
  223.            blockimage[2] := chr($43);
  224.            seek(cardfile,currentblockindex);
  225.            blockwrite(cardfile,blockimage,1);
  226.            currentfilesize := filesize(cardfile);
  227.       end;
  228.  
  229.       procedure closefileasciitocard;
  230.       begin
  231.            seek(cardfile,currentblockindex);
  232.            blockwrite(cardfile,blockimage,1);
  233.            close(cardfile);
  234.            close(asciifile);
  235.       end;
  236.  
  237.       procedure checkfilesize(block:integer);
  238.       var
  239.          i : integer;
  240.       begin
  241.            if block >= currentfilesize then
  242.            begin
  243.                 for i := currentfilesize to block do
  244.                 begin
  245.                      seek(cardfile,i);
  246.                      blockwrite(cardfile,blockimageblank,1);
  247.                 end;
  248.                 currentfilesize := filesize(cardfile);
  249.            end;
  250.       end;
  251.  
  252.       procedure outfilebyte(blocknum,bytenum:integer;outbyte:filebytetype);
  253.       var
  254.          block, byten : integer;
  255.       begin
  256.            block := blocknum * 2;
  257.            if bytenum > 127 then
  258.            begin
  259.                 byten := bytenum - 128;
  260.                 block := block + 1;
  261.            end
  262.            else
  263.                 byten := bytenum;
  264.            if block = currentblockindex then
  265.            begin
  266.                 blockimage[byten] := outbyte;
  267.            end
  268.            else
  269.            begin
  270.                 seek(cardfile,currentblockindex);
  271.                 blockwrite(cardfile,blockimage,1);
  272.                 checkfilesize(block);
  273.                 seek(cardfile,block);
  274.                 blockread(cardfile,blockimage,1);
  275.                 currentblockindex := block;
  276.                 blockimage[byten] := outbyte;
  277.            end;
  278.       end;
  279.  
  280.       function asciifilelength:integer;
  281.       var
  282.          i : integer;
  283.       begin
  284.            reset(asciifile);
  285.            i := 0;
  286.            while not eof(asciifile) do
  287.            begin
  288.                 readln(asciifile,datachar);
  289.                 i := i + 1;
  290.            end;
  291.            asciifilelength := i;
  292.       end;
  293.  
  294.       procedure setstartofdata;
  295.       var
  296.          i : integer;
  297.       begin
  298.            xnumcards := numcards * 52.0 + 5.0;
  299.            xnumcards := xnumcards / 256.0 + 0.0001;
  300.            datablock := trunc(int(xnumcards));
  301.            databyte := trunc(frac(xnumcards) * 256.0);
  302.            indexblock := 0;
  303.            indexbyte := 3;
  304.            datachar := chr(numcards mod 256);
  305.            outfilebyte(indexblock,indexbyte,datachar);
  306.            indexbyte := 4;
  307.            datachar := chr(numcards div 256);
  308.            outfilebyte(indexblock,indexbyte,datachar);
  309.            indexbyte := 5;
  310.       end;
  311.  
  312.       procedure outputindex;
  313.       var
  314.          i : integer;
  315.       begin
  316.            datachar := chr(0);
  317.            for i := 1 to 5 do
  318.            begin
  319.                 outfilebyte(indexblock,indexbyte,datachar);
  320.                 incrementindex(1);
  321.            end;
  322.            datachar := chr(256);
  323.            outfilebyte(indexblock,indexbyte,datachar);
  324.            incrementindex(1);
  325.            datachar := chr(databyte);
  326.            outfilebyte(indexblock,indexbyte,datachar);
  327.            incrementindex(1);
  328.            datachar := chr(datablock mod 256);
  329.            outfilebyte(indexblock,indexbyte,datachar);
  330.            incrementindex(1);
  331.            datachar := chr(datablock div 256);
  332.            outfilebyte(indexblock,indexbyte,datachar);
  333.            incrementindex(1);
  334.            datachar := chr(0);
  335.            for i := 1 to 2 do
  336.            begin
  337.                 outfilebyte(indexblock,indexbyte,datachar);
  338.                 incrementindex(1);
  339.            end;
  340.            indexout := true;
  341.            for i := 1 to 41 do
  342.            begin
  343.                 if indexout then
  344.                 begin
  345.                      read(asciifile,datachar);
  346.                      if datachar = chr(9) then
  347.                      begin
  348.                           indexout := false;
  349.                           datachar := chr(0);
  350.                      end;
  351.                 end;
  352.                 outfilebyte(indexblock,indexbyte,datachar);
  353.                 incrementindex(1);
  354.            end;
  355.       end;
  356.  
  357.       procedure outputasciidata;
  358.       var
  359.          i : integer;
  360.       begin
  361.            numberofcharacters := 0;
  362.            datachar := chr(0);
  363.            while not eoln(asciifile) do
  364.            begin
  365.                 read(asciifile,datachar);
  366.                 if datachar = chr(9) then
  367.                 begin
  368.                      numberofcharacters := numberofcharacters + 1;
  369.                      charactersin[numberofcharacters] := chr(13);
  370.                      numberofcharacters := numberofcharacters + 1;
  371.                      charactersin[numberofcharacters] := chr(10);
  372.                 end
  373.                 else
  374.                 begin
  375.                      numberofcharacters := numberofcharacters + 1;
  376.                      charactersin[numberofcharacters] := datachar;
  377.                 end;
  378.            end;
  379.            readln(asciifile);
  380.            datachar := chr(0);
  381.            outfilebyte(datablock,databyte,datachar);
  382.            incrementdata(1);
  383.            outfilebyte(datablock,databyte,datachar);
  384.            incrementdata(1);
  385.            datachar := chr(numberofcharacters mod 256);
  386.            outfilebyte(datablock,databyte,datachar);
  387.            incrementdata(1);
  388.            datachar := chr(numberofcharacters div 256);
  389.            outfilebyte(datablock,databyte,datachar);
  390.            incrementdata(1);
  391.            for i := 1 to numberofcharacters do
  392.            begin
  393.                 datachar := charactersin[i];
  394.                 outfilebyte(datablock,databyte,datachar);
  395.                 incrementdata(1);
  396.            end;
  397.       end;
  398.  
  399.       procedure asciitocard;
  400.       begin
  401.            openfileasciitocard;
  402.            numcards := asciifilelength;
  403.            clrscr;
  404.            writeln('Number of cards in ASCII file ',numcards);
  405.            gotoxy(5,3);
  406.            write('Processing card number');
  407.            reset(asciifile);
  408.            setstartofdata;
  409.            for i := 1 to numcards do
  410.            begin
  411.                 usermessage(i);
  412.                 outputindex;
  413.                 outputasciidata;
  414.            end;
  415.            closefileasciitocard;
  416.       end;
  417.  
  418.       procedure initialize;
  419.       begin
  420.            fielddelimiter := #9;
  421.            for i := 0 to 128 do
  422.            begin
  423.                 blockimageblank[i] := chr(0);
  424.            end;
  425.       end;
  426.  
  427.       procedure finish;
  428.       begin
  429.            textcolor(14);
  430.            textbackground(0);
  431.            clrscr;
  432.       end;
  433.  
  434.       procedure menu;
  435.       begin
  436.         iop := 1;
  437.         while iop <> 0 do
  438.         begin
  439.            clrscr;
  440.            writeln('Enter option');
  441.            writeln(' ');
  442.            writeln('    0)    Exit program');
  443.            writeln(' ');
  444.            writeln('    1)    Convert Cardfile to ASCII');
  445.            writeln('    2)    Convert ASCII to Cardfile');
  446.            read(kbd,keyhit);
  447.            iop := ord(keyhit) - 48;
  448.            case iop of
  449.                 0: ;
  450.                 1: cardtoascii;
  451.                 2: asciitocard;
  452.            else
  453.                 sound(600);
  454.                 delay(180);
  455.                 nosound;
  456.            end;
  457.         end;
  458.         clrscr;
  459.       end;
  460.  
  461.       begin
  462.            initialize;
  463.            menu;
  464.            finish;
  465.       end.