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