[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 2/9] lpt: ScanFile in Klasse ausgelagert



On Sun, Dec 13, 2009 at 06:31:37PM +0100, Antoine Kaufmann wrote:
> * lpt: ScanFile in Klasse ausgelagert, damit die Parserfunktion spaeter
>        auch fuer die Paketinformationen benutzt werden kann.
> 
> Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
> ---
>  src/modules/pas/lpt/helpers.pas |   87 +--------------------
>  src/modules/pas/lpt/pkglist.pas |  161 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 166 insertions(+), 82 deletions(-)
>  create mode 100644 src/modules/pas/lpt/pkglist.pas
> 
> diff --git a/src/modules/pas/lpt/helpers.pas b/src/modules/pas/lpt/helpers.pas
> index b26ff4b..67b02ed 100644
> --- a/src/modules/pas/lpt/helpers.pas
> +++ b/src/modules/pas/lpt/helpers.pas
> @@ -2,7 +2,8 @@ unit helpers;
>  {$MODE ObjFPC}
>  
>  interface
> -uses crt, sysutils, dos, classes, tar, packages, tcpip, http, multilang;
> +uses crt, sysutils, dos, classes, tar, packages, tcpip, http, multilang,
> +    pkglist;
>  
>  procedure ScanFile(pkgset: TPackageSet; filename, repository: String);
>  procedure DrawProgress(http: HTTPRequest);
> @@ -127,88 +128,10 @@ end;
>  
>  procedure ScanFile(pkgset: TPackageSet; filename, repository: String);
>  var
> -    f: Text;
> -    line: String;
> -    status: integer;
> -
> -    pkg: TPackage;
> -    section: TPackageSection;
> -    version: TPackageVersion;
> +    plp: TPkglistParser;
>  begin
> -    Assign(f, filename);
> -    Reset(f);
> -    status := 0;
> -    pkg := nil;
> -    try
> -        while not eof(f) do begin
> -            ReadLn(f, line);
> -
> -            if line = '' then begin
> -                continue;
> -            end;
> -
> -            case line[1] of
> -                'P':
> -                    begin
> -                        status := 1;
> -                        pkg := pkgset.add(Copy(line, 3, length(line)));
> -                    end;
> -                'D':
> -                    if status = 1 then begin
> -                        pkg.desc := Copy(line, 3, length(line));
> -                    end else begin
> -                        raise EPackageFileFormat.create(
> -                            'D in status ' + IntToStr(status));
> -                    end;
> -                'S':
> -                    if status >= 1 then begin
> -                        status := 2;
> -                        section := pkg.add(Copy(line, 3, length(line)));
> -                    end else begin
> -                        raise EPackageFileFormat.create(
> -                            'S in status ' + IntToStr(status));
> -                    end;
> -                'V':
> -                    if status >= 2 then begin
> -                        status := 3;
> -                        version := section.add(Copy(line, 3, length(line)));
> -                        version.pkg := pkg;
> -                        version.section := section;
> -                        version.repository := repository;
> -                    end else begin
> -                        raise EPackageFileFormat.create(
> -                            'V in status ' + IntToStr(status));
> -                    end;
> -                's':
> -                    if status >= 3 then begin
> -                        version.size := StrToInt(Copy(line, 3, length(line)));
> -                    end else begin
> -                        raise EPackageFileFormat.create(
> -                            's in status ' + IntToStr(status));
> -                    end;
> -                'd':
> -                    if status >= 3 then begin
> -                        if length(line) < 2 then begin
> -                            raise EPackageFileFormat.create(
> -                                'Einsames d');
> -                        end;
> -
> -                        version.addDependency(line[2], Copy(line, 4, length(line)));
> -
> -                    end else begin
> -                        raise EPackageFileFormat.create(
> -                            'd in status ' + IntToStr(status));
> -                    end;
> -                else
> -                    begin
> -                        raise EPackageFileFormat.create(
> -                            'Unbekannter Schluessel: ' + line[1]);
> -                    end;
> -            end;
> -        end;
> -    finally
> -        Close(f);
> -    end;
> +    plp := TPkglistParser.create(pkgset);
> +    plp.ProcessFile(filename, repository);

Wird plp hier geleakt?

>  end;
>  
>  procedure Untar(tar: TTarArchive; targetpath: String = 'file:/');
> diff --git a/src/modules/pas/lpt/pkglist.pas b/src/modules/pas/lpt/pkglist.pas
> new file mode 100644
> index 0000000..996bd9d
> --- /dev/null
> +++ b/src/modules/pas/lpt/pkglist.pas
> @@ -0,0 +1,161 @@
> +unit pkglist;
> +{$MODE ObjFPC}
> +
> +interface
> +uses classes, sysutils, packages;
> +
> +type
> +    TPkglistParser = class
> +        private
> +            status:     Integer;
> +            package:    TPackage;
> +            section:    TPackageSection;
> +            version:    TPackageVersion;
> +            pkgset:     TPackageSet;
> +
> +        public
> +            (**
> +             * Konstruktor.
> +             *
> +             * @param ps PakageSet in dem die angegebenen Pakete erfasst werden
> +             *           sollen.
> +             *)
> +            constructor Create(ps: TPackageSet);
> +
> +            (**
> +             * Einzelne Zeile der pkglist verarbeiten.
> +             *
> +             * @param line Zeile
> +             * @param repo Repository-Url, die in den Paketen eingetragen werden
> +             *             soll.
> +             *)
> +            procedure ProcessLine(line, repo: String);
> +
> +            (**
> +             * pkglist-Datei verarbeiten
> +             *
> +             * @param path Pfad zur Datei
> +             * @param repo Repository-Url, die in den Paketen eingetragen werden
> +             *             soll.
> +             *)
> +            procedure ProcessFile(path, repo: String);
> +    end;
> +
> +implementation
> +
> +(**
> + * Konstruktor.
> + *
> + * @param ps PakageSet in dem die angegebenen Pakete erfasst werden
> + *           sollen.
> + *)
> +constructor TPkglistParser.Create(ps: TPackageSet);
> +begin
> +    status  := 0;
> +    package := nil;
> +    section := nil;
> +    version := nil;
> +    pkgset  := ps;
> +end;
> +
> +(**
> + * Einzelne Zeile der pkglist verarbeiten.
> + *
> + * @param line Zeile
> + * @param repo Repository-Url, die in den Paketen eingetragen werden
> + *             soll.
> + *)
> +procedure TPkglistParser.ProcessLine(line, repo: String);
> +begin
> +    if line = '' then begin
> +        Exit;
> +    end;
> +
> +    case line[1] of
> +        'P':
> +            begin
> +                status := 1;
> +                package := pkgset.add(Copy(line, 3, length(line)));
> +            end;
> +        'D':
> +            if status = 1 then begin
> +                package.desc := Copy(line, 3, length(line));
> +            end else begin
> +                raise EPackageFileFormat.create(
> +                    'D in status ' + IntToStr(status));
> +            end;
> +        'S':
> +            if status >= 1 then begin
> +                status := 2;
> +                section := package.add(Copy(line, 3, length(line)));
> +            end else begin
> +                raise EPackageFileFormat.create(
> +                    'S in status ' + IntToStr(status));
> +            end;
> +        'V':
> +            if status >= 2 then begin
> +                status := 3;
> +                version := section.add(Copy(line, 3, length(line)));
> +                version.pkg := package;
> +                version.section := section;
> +                version.repository := repo;
> +            end else begin
> +                raise EPackageFileFormat.create(
> +                    'V in status ' + IntToStr(status));
> +            end;
> +        's':
> +            if status >= 3 then begin
> +                version.size := StrToInt(Copy(line, 3, length(line)));
> +            end else begin
> +                raise EPackageFileFormat.create(
> +                    's in status ' + IntToStr(status));
> +            end;
> +        'd':
> +            if status >= 3 then begin
> +                if length(line) < 2 then begin
> +                    raise EPackageFileFormat.create(
> +                        'Einsames d');
> +                end;
> +
> +                version.addDependency(line[2], Copy(line, 4, length(line)));
> +
> +            end else begin
> +                raise EPackageFileFormat.create(
> +                    'd in status ' + IntToStr(status));
> +            end;
> +        else
> +            begin
> +                raise EPackageFileFormat.create(
> +                    'Unbekannter Schluessel: ' + line[1]);
> +            end;
> +    end;
> +end;
> +
> +
> +(**
> + * pkglist-Datei verarbeiten
> + *
> + * @param path Pfad zur Datei
> + * @param repo Repository-Url, die in den Paketen eingetragen werden
> + *             soll.
> + *)
> +procedure TPkglistParser.ProcessFile(path, repo: String);
> +var
> +    f: Text;
> +    l: String;
> +begin
> +    Assign(f, path);
> +    Reset(f);
> +
> +    try
> +        while not Eof(f) do begin
> +            ReadLn(f, l);
> +            ProcessLine(l, repo);
> +        end;
> +    finally
> +        Close(f);
> +    end;
> +end;
> +
> +begin

Wenn da nichts drin steht ist das begin überflüssig.

> +end.
> -- 
> 1.6.3.3

Ansonsten dürfte das so hinkommen.