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