home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
i
/
ifp1s156.zip
/
IFPSCRPT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-12-30
|
10KB
|
410 lines
unit IFPScrpt;
interface
uses Crt, Dos, IFPGlobl, IFPComon;
type
TPrinterRec = record
Mode: char;
Destination: char;
Filename: PathStr;
HiStrip: boolean;
HeaderStr: string;
ScreensPerPage: byte;
ScreenCount: byte;
end;
var
PrinterRec: TPrinterRec;
procedure ScreenPrint(Pg: byte; PgName, VerNum: string);
implementation
const
ESC = #27;
type
CharSet = set of char;
function GetKey(CS: CharSet): char;
var
c, x: char;
begin
repeat
C:=UpCase(ReadKey);
if KeyPressed and (c = #0) then
x:=ReadKey;
until c in CS;
if Ord(c) > 31 then
Writeln(c);
GetKey:=c
end;
function Today: string;
const
DOWName: array[0..6] of string[3] = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu',
'Fri', 'Sat');
MonthName: array[1..12] of string[3] = ('Jan', 'Feb', 'Mar', 'Apr', 'May',
'Jun', 'Jul', 'Aug', 'Sep', 'Oct',
'Nov', 'Dec');
var
Regs: Registers;
DayForm, Year, Month, Day, DOW: word;
YearStr, DayStr: string[5];
CInfo: array[0..$21] of byte;
temp: string;
begin
GetDate(Year, Month, Day, DOW);
with Regs do
begin
AH:=$38;
AL:=0;
DS:=Seg(CInfo);
DX:=Ofs(CInfo);
MsDos(Regs);
Dayform:=CInfo[0] + (word(256) * CInfo[1]);
end;
Str(Day, Daystr);
Str(Year, Yearstr);
case DayForm of
0,3..$FFFF: temp:=Monthname[Month] + ' ' + DayStr + ', ' + YearStr;
1: temp:=DayStr + ' ' + Monthname[Month] + ', ' + YearStr;
2: temp:=YearStr + ' ' + Monthname[Month] + ' ' + DayStr;
end;
Today:=DOWName[DOW] + ', ' + temp
end; {Today}
function Time: string;
var
Regs: Registers;
Hour, Min, Sec, sec100: word;
HourStr, MinStr, SecStr: string[2];
Cinfo: array[0..$21] of byte;
TForm: byte;
TSep: char;
temp: string[11];
begin
GetTime(Hour, Min, Sec, Sec100);
with Regs do
begin
AH:=$38;
AL:=0;
DS:=Seg(CInfo);
DX:=Ofs(CInfo);
MsDos(Regs);
TForm:=CInfo[$11];
TSep:=Chr(CInfo[$D]);
end;
Str(Hour, HourStr);
if (Hour > 12) and (TForm and 1 = 0) then
Str(Hour - 12, HourStr);
if (Hour = 0) and (TForm and 1 = 0) then
HourStr:='12';
Str(Min, MinStr);
if Length(MinStr) = 1 then
MinStr:='0' + MinStr;
Str(Sec, Secstr);
if Length(SecStr) = 1 then
SecStr:='0' + SecStr;
temp:=HourStr + TSep + MinStr + TSep + SecStr;
if (TForm and 1 = 0) then
if Hour > 11 then
temp:=temp + ' pm'
else
temp:=temp + ' am';
Time:=temp
end; {Time}
procedure ScreenPrint(Pg: byte; PgName, VerNum: string);
const
LoChars: array[#0..#$1F] of char = ' abcdefghijklmno' +
'pqrstuvwxyz<+>^v';
HiChars: array[#$80..#$FF] of char = 'cueaaaaceeeiiiAA' +
{90h} 'EaAooouuyOUcLYPf' +
{A0h} 'aiounNao?++24i<>' +
{B0h} '.oO|++++++|+++++' +
{C0h} '++++-++++++++-++' +
{D0h} '++++++++++++_||~' +
{E0h} 'aBr#Eout00^o80EU' +
{F0h} '=+><fj-~oOojn2O ';
Dashes: string[79] = '----------------------------------------' +
'---------------------------------------';
var
ScrBuf: array[0..9599] of char;
VidMode, VidLength, VidPg, OldAttr, OldX, OldY: byte;
VidSize, Position, VidWidth, x, y, BytesPerLine, BytesPerScreen, CharCount, first, last: word;
OldWindMin, OldWindMax: word;
Regs: Registers;
OutFile: text;
FileName: PathStr;
MonoScrn: array[0..3999] of char absolute $B000:0;
ColorScrn: array[0..9599] of char absolute $B800:0;
c: char;
StripHi: boolean;
ExtraStr: string;
FirstRun: boolean;
SingleScreen: boolean;
procedure Cleanup;
var
x, y: word;
begin
Position:=0;
if DirectVideo then
if VidMode = 7 then
Move(ScrBuf, MonoScrn, VidSize)
else
Move(ScrBuf, ColorScrn, VidSize)
else
for y:=0 to VidLength - 1 do
for x:=0 to VidWidth -1 do
with Regs do
begin
AH:=2;
BH:=VidPg;
DH:=y;
DL:=x;
Intr($10, Regs);
AH:=9;
AL:=Ord(ScrBuf[Position]);
BH:=VidPg;
BL:=Ord(ScrBuf[Position + 1]);
CX:=1;
Intr($10, Regs);
Inc(Position, 2);
end;
TextAttr:=OldAttr;
WindMin:=OldWindMin;
WindMax:=OldWindMax;
GotoXY(OldX, OldY);
end;
begin
if (PrinterRec.Mode = 'A') and (PrinterRec.Destination = '?') then
FirstRun:=true
else
FirstRun:=false;
if PrinterRec.Mode <> 'A' then
SingleScreen:=true
else
SingleScreen:=false;
OldAttr:=TextAttr;
OldWindMin:=WindMin;
OldWindMax:=WindMax;
OldX:=WhereX;
OldY:=WhereY;
ModeInfo(VidMode, VidLength, VidPg, VidWidth);
VidSize:=(VidWidth * VidLength) * 2;
Position:=0;
if DirectVideo then
if VidMode = 7 then
Move(MonoScrn, ScrBuf, VidSize)
else
Move(ColorScrn, ScrBuf, VidSize)
else
for y:=0 to VidLength - 1 do
for x:=0 to VidWidth - 1 do
with Regs do
begin
AH:=2;
BH:=VidPg;
DH:=y;
DL:=x;
Intr($10, Regs);
AH:=8;
BH:=VidPg;
Intr($10, Regs);
ScrBuf[Position]:=Chr(AL);
ScrBuf[Position + 1]:=Chr(AH);
Inc(Position, 2);
end;
if FirstRun or SingleScreen then
begin
TextColor(White);
TextBackground(Blue);
Window(5, (VidLength div 2) - 5, 75, (VidLength div 2) + 5);
box;
TextBackground(LightGray);
TextColor(Black);
ClrScr;
Write('Dump screen to a <F>ile or the <P>rinter.=>');
c:=GetKey([ESC, 'F', 'P']);
if c = ESC then
begin
Cleanup;
PrinterRec.Mode:='S';
Exit
end;
end
else
c:=PrinterRec.Destination;
if c = 'P' then
begin
Assign(OutFile, 'PRN');
ReWrite(OutFile);
if not SingleScreen then
PrinterRec.Destination:='P'
end
else
begin
if FirstRun or SingleScreen then
begin
Write('Filename to use.=>');
Readln(FileName);
if FileName = '' then
begin
Cleanup;
Exit
end;
end
else
FileName:=PrinterRec.Filename;
FileName:=FExpand(FileName);
Assign(OutFile, FileName);
{$I-} Reset(OutFile); {$I+}
if IOResult = 0 then
begin
if FirstRun or SingleScreen then
begin
Write(FileName, ' exists! <O>verwrite, <A>ppend, <Q>uit.=>');
c:=GetKey([ESC, 'O', 'A', 'Q']);
end
else
c:='A';
case c of
ESC, 'Q': begin
Close(OutFile);
Cleanup;
PrinterRec.Mode:='S';
Exit
end;
'A': begin
Close(OutFile);
Append(OutFile)
end;
'O': begin
Close(OutFile);
ReWrite(OutFile)
end
end
end
else
ReWrite(OutFile);
if not SingleScreen then
PrinterRec.Destination:='F';
if FirstRun then
PrinterRec.Filename:=FileName;
end;
if SingleScreen or FirstRun then
begin
Write('<N>ormal ASCII or <I>BM ASCII.=>');
c:=GetKey([ESC, 'N', 'I']);
if c = ESC then
begin
Cleanup;
PrinterRec.Mode:='S';
Exit
end;
if c = 'N' then
StripHi:=true
else
StripHi:=false;
if FirstRun then
PrinterRec.HiStrip:=StripHi;
end
else
StripHi:=PrinterRec.HiStrip;
if FirstRun or SingleScreen then
begin
Write('Do you wish to add an extra header line? <Y> or <N>.=>');
c:=GetKey([ESC, 'Y', 'N']);
if c = ESC then
begin
Cleanup;
PrinterRec.Mode:='S';
Exit
end;
ExtraStr:='';
if c = 'Y' then
begin
Write('Header>');
Readln(ExtraStr);
if FirstRun then
PrinterRec.HeaderStr:=ExtraStr;
end;
end
else
ExtraStr:=PrinterRec.HeaderStr;
if FirstRun then
begin
Write('Number of Screens per page (0=no form feed).=> ');
Readln(PrinterRec.ScreensPerPage);
end;
BytesPerLine:=VidWidth * 2;
BytesPerScreen:=BytesPerLine * VidLength;
{0 is top, print from line 2 to VidLength-2}
CharCount:=0;
first:=BytesPerLine * 2;
last:=BytesPerScreen - (BytesPerLine * 2) - 1;
Writeln(OutFile, Dashes);
if Length(ExtraStr) > 0 then
Writeln(OutFile, ExtraStr);
Writeln(OutFile, 'Infoplus ', VerNum, ' Page ', Pg, ' - ', PgName);
Writeln(OutFile, 'Generated: ', Today, ' at ', Time);
Writeln(OutFile, Dashes);
x:=first;
repeat
c:=ScrBuf[x];
if Ord(c) < 31 then
c:=LoChars[c];
if StripHi and (Ord(c) > 127) then
c:=HiChars[c];
Write(OutFile, c);
Inc(CharCount);
if CharCount = 80 then
begin
Writeln(OutFile);
CharCount:=0;
end;
Inc(x, 2);
until x >= last;
Writeln(OutFile);
if not SingleScreen then
with PrinterRec do
begin
if ScreensPerPage <> 0 then
Inc(ScreenCount);
if (ScreenCount < ScreensPerPage) or (ScreensPerPage = 0) then
Writeln(OutFile)
else
begin
Writeln(OutFile, ^L);
ScreenCount:=0;
end
end
else
Writeln(OutFile, ^L);
Close(OutFile);
Cleanup;
end;
begin
with PrinterRec do
begin
Mode:='S';
Destination:='?';
Filename:='';
HiStrip:=true;
HeaderStr:='';
ScreensPerPage:=2;
ScreenCount:=0;
end;
end.