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

{
RN> I have a routine in one of my programs that that reads a delimited string
RN> from a configuration file, the string is defined such as: ~040~055~099~144
RN> etc. (these are message base area numbers)

RN> In the program a check is done to see if the current area exists or does
RN> not exist in the list via a simple Pos() function.

RN> Works great! but.......

RN> I have been asked to include the capabilty to include a RANGE of numbers in
RN> this list, this being due to the 255 char limit of a normal string.


RN> So lets assume the list above will look like this:

RN> ~040~055~060-080~099~144

RN> How can I pull out the 060-080 and include all numbers between into the
RN> list or actually, do a check, possibly creating a Set?

RN> OR would I have to create another function/configuration item to do this?

RN> I hope my explanation of what I wish to accomplish can be understood. <g>

RN> All replies are very welcomed!!

Try this, the code is ugly but it works!
{Written, Tested and Compiled with BP 7.x}

uses crt;

type
  Str3 = string[3];
var
  Area, RangeLo, RangeHi : str3;
  List : String;

function Found(List:string;Area:str3):boolean;
begin
  if Pos(Area, List)>0 then begin
    Found := true;
  end else begin
    {
        Area not found yet, are there ranges??
    }
    if Pos('-', List)>0 then begin
      {
        Yes! Process ranges
      }
      while Pos('-', List) > 0 do begin
        RangeLo := Copy(List, Pos('-', List)-3, 3);
        {
          Area must be BETWEEN Lo and hi otherwise it would have
          been found by the first POS check. So if RangeLo is > Area
          No need to lose time extracting RangeHi
        }
        if RangeLo<Area then begin
          RangeHi := Copy(List, Pos('-', List)+1, 3);
          if RangeHi > Area then begin
            {
                Lo < Area < hi, We found a Match
            }
            Found := true;
            {
                Kill list to exit while-loop
            }
            List := '';
          end else begin
            {
                Kill this range's DASH, POS only reports the first match
            }
            Delete(List, Pos('-', List), 1);
          end;
        end else begin
            {
                Kill this range's DASH, POS only reports the first match
            }
          Delete(List, Pos('-', List), 1);
        end;
      end;
      {
        Only two possibilities when we get here
            1- List = '' which means a match was found and list was
                cleared to exit the while-loop.
            2- No match was found, in which case List is non-empty.
      }
      if List<>'' then
        Found := false;
    end else begin
      Found := false;
    end;
  end;
end;

var
  X : byte;

begin
  List := '~012~020~033~060-079~081~090~095-123~';
  clrscr;
  for X := 0 to 255 do begin
    Area := chr(48 + (X div 100)) +
            chr(48 + ((X mod 100) div 10)) +
            chr(48 + ((X mod 10)));
    writeln(Area, ' ', List, ' ', Found(List, Area));
    if (not boolean(x mod 24)) and (x>0) then begin
      while not keypressed do;
      while keypressed do readkey;
      clrscr;
    end;
  end;
end.


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