[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
(*
===========================================================================
BBS: Canada Remote Systems
Date: 06-25-93 (13:52) Number: 25767
From: GUY MCLOUGHLIN Refer#: NONE
To: CHRIS PRIEDE Recvd: NO
Subj: STRING CENTERING ROUTINES Conf: (552) R-TP
---------------------------------------------------------------------------
Hi, Chris:
CP>Ideally such function should be written in assembly, but since this
CP>is Pascal conference and I've flooded it with my assembly code enough
CP>lately, we will use plain Turbo Pascal.
Try running this program using your routine and the one I posted,
you might notice something "funny" about the ouput displayed. <g>
*)
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+}
{$M 1024,0,0}
program DemoStringRoutines;
USES Crt;
function FCenter(S: string; W: byte): string;
var
SpaceCnt: byte;
begin
if Length(S) < W then
begin
SpaceCnt := (W - Length(S)) div 2;
Move(S[1], S[1+SpaceCnt], Length(S));
FillChar(S[1], SpaceCnt, '-');
S[0] := Chr(Length(S) + SpaceCnt);
end;
FCenter := S;
end;
(* Set these constants according to your needs. *)
const
BlankChar = '-';
ScreenWidth = 80;
(***** Create video-display string with input string centered. *)
(* *)
function CenterVidStr({input} InText : string) : {output} string;
var
InsertPos : byte;
TempStr : string;
begin
(* Initialize TempStr. *)
TempStr[0] := chr(ScreenWidth);
fillchar(TempStr[1], ScreenWidth, BlankChar);
(* Calculate string insertion position. *)
InsertPos := succ((ScreenWidth - length(InText)) div 2);
(* Insert text in the center of TempStr. *)
move(InText[1], TempStr[InsertPos], length(InText));
(* Return function result. *)
CenterVidStr := TempStr
end; (* CenterVidStr. *)
var
TempStr : string;
BEGIN
Clrscr;
fillchar(TempStr[1], 30, 'X');
TempStr[0] := #30;
writeln(FCenter(TempStr, 80));
writeln(CenterVidStr(TempStr))
END.
...I tried timing these two routines on my PC (Recently upgraded
to a 386dx-40 AMD motherboard), and here are the results:
Compiler ³ Length ³ Your routine ³ My routine ³ Ratio
ÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ
TP 7 ³ 30 ³ 0.03167 ³ 0.04043 ³ 1.28
ÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄ
PASCAL+ ³ 30 ³ 0.02037 ³ 0.01959 ³ 0.96
*** Both functions were called in a loop 1000 times on each run,
result was discarded ($X+ directive).
For curiosity sake I'll post the StonyBrook PASCAL+ machine-code
listing in the next message.
- Guy
---
þ DeLuxeý/386 1.25 #5060 þ
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]