[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]

    {
    Functions returning Strings are generally space wasters.  For example,
    suppose you have :

    Function UpCaseStr(s : String) : String;

    if you're implementing it in plain Pascal, you'll need 1024 Bytes of data
    at a minimum:
    - 256 Bytes are allocated For "s", the Formal parameter
    - 256 Bytes For a local copy of "s" since it was passed as a value parameter
    - 256 Bytes For a local Variable of the Type String, working storage to build
          the Function result
    - 256 Bytes For assigning the result to the Function result
          (as in: "UpCaseStr := Result").

    You can cut this figure by 50% by taking the following steps:
    - (Version 7) Change the parameter header into
      "Function UpCaseStr(Const s : String) : String".  Provided you don't
      change "s", no local copy of the String will be created.
    - (Version 6) Implement the routine in Assembler.  Requires knowledge of
      Asm, of course - but it generally will do away With the need of allocating
      256 Bytes of working storage.

    Now you have reduced data space to 512 Bytes: it has become a basic
    input-output Function.  One question remains: it is necessary to load the
    String to examine the result of such a Function.  Suppose we want to figure out
    whether the user has entered a switch on the command line: do we need a
    Variable of the Type String to acComplish this?  You don't.  The following
    snippet of code will show how: using a 2 Bytes macro, we'll convert a String
    into a Pointer to a String.  You only have to dereference the Pointer to get
    the result - and save 256 Bytes of data space in the process.
    }

    Type
      PString      = ^String;

    Function StrPtr(Const s : String) : PString;

    InLine(
      $58/         { POP  AX }
      $5A);        { POP  DX }

    Var
      i            : Integer;
      sp           : PString;
      QuietFlag    : Boolean;

    begin
      For i := 1 to ParamCount Do
        begin
          sp := StrPtr(ParamStr(i));
          if (sp^[1] in ['/', '-']) and (UpCase(sp^[2]) = 'Q') then
            QuietFlag := True;
          { Et cetera }
        end;
    end.

[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]