[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]