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

    {
    From: jonpecc@alpha1.csd.uwm.edu (Jon Louis Peccarelli)
    }
    unit CSV;
    {$X+}

    interface

    uses winstack, Strings;

    var
      Stack: StackType;

    procedure ReadLargeData(var handle: text; delimiter: char; var code: integer;
    var temppchar: pchar);

    implementation

    { Data is returned in temppchar and code is returned (0 if ok, -1 if error)}
    procedure ReadLargeData(var handle: text; delimiter: char; var code: integer;
    var temppchar: pchar);
    var
      prevchar: char;
      okcontinue: boolean;
      ch: array[0..1] of char;
      tempch: char;
      counter: integer;
      charptr: pointer;
      index : word;
      x : word;
    begin
    { Initializes a stack }
      CreateStack(Stack);

    { Initialize var's }
      temppchar := '';
      index := 0;
      code := 0;
      okcontinue := true;
      prevchar := #0;
      ch[0] := ' ';
      ch[1] := #0;

      while (ch[0] = ' ') do
        read(handle, ch[0]);

      while (okcontinue) do
      begin
        if (prevchar = #0) and (ch[0] = '"') then
        begin
          char(charptr) := ch[0];
          push(stack, charptr);
        end
        else if (prevchar = '"') and (ch[0] = '"') then
        begin
          pop(stack, charptr);
          ch[0] := char(charptr);
          strcat(temppchar, ch);
        end
        else if (ch[0] = '"') then
        begin
          char(charptr) := ch[0];
          push(stack, charptr)
        end
        else if (ch[0] = delimiter) or eoln(handle) or eof(handle) or
             (ch[0] = #13) then
        begin
          counter := 0;
          while not(emptystack(stack)) do
          begin
            pop(stack, charptr);
            tempch := char(charptr);
            inc(counter,1);
          end;
          if (counter = 1) then
          begin
            char(charptr) := tempch;
            push(stack, charptr);
            strcat(temppchar, ch);
          end
          else if (counter = 2) or (counter = 0) then
            okcontinue := false;
          if eoln(handle) then readln(handle);
        end
        else
        begin
          strcat(temppchar, ch);
        end;
        prevchar := ch[0];
        if not(eof(handle)) then
          read(handle, ch[0]);
      end;
      if eof(handle) then code := -1;
      DestroyStack(Stack);
    end;

    end.

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