bzip2 unit nach lazarus ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

bzip2 unit nach lazarus ?

Beitrag von pluto »

Hallo,
habe eine frage zu folgender defination:

Code: Alles auswählen

TAlloc = function(opaque: Pointer; Items, Size: Integer): Pointer; cdecl;
  TFree = procedure(opaque, Block: Pointer); cdecl;
 
procedure BZCompressBuf(const InBuf: Pointer; InBytes: Integer;
  out OutBuf: Pointer; out OutBytes: Integer);
var
  strm: TBZStreamRec;
  P: Pointer;
begin
  FillChar(strm, sizeof(strm), 0);
  strm.bzalloc := bzip2AllocMem; // hier werden paramenter erwartet, aber welche ?
  strm.bzfree := bzip2FreeMem;
  OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
  GetMem(OutBuf, OutBytes);
  try
    strm.next_in := InBuf;
    strm.avail_in := InBytes;
    strm.next_out := OutBuf;
    strm.avail_out := OutBytes;
    CCheck(BZ2_bzCompressInit(strm, 9, 0, 0));
    try
      while CCheck(BZ2_bzCompress(strm, BZ_FINISH)) <> BZ_STREAM_END do
      begin
        P := OutBuf;
        Inc(OutBytes, 256);
        ReallocMem(OutBuf, OutBytes);
        strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
        strm.avail_out := 256;
      end;
    finally
      CCheck(BZ2_bzCompressEnd(strm));
    end;
    ReallocMem(OutBuf, strm.total_out_lo32);
    OutBytes := strm.total_out_lo32;
  except
    FreeMem(OutBuf);
    raise
  end;
end;

kann mir da jemmand helfen ?
ich kann das std pascal leider nicht ! ist wohl auch wieder eine delphi vereinfachung :(
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: bzip2 unit nach lazarus ?

Beitrag von theo »

Das ist aus dem Zusammenhang gerissen mal wieder kaum zu sagen.

Hast du mal mit dem Delphi mode probiert?
oder
strm.bzalloc := @bzip2AllocMem;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Warum einfach wenns auch schwirig geht was pluto :)

schau mal in deinem fpc verzeichnis in source\packages\extra\bzip2

da hast du eine wunderbare tstream basierte implementation
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

der erste weg geht wohl aber leider kann er die .o dateien nicht lesen...

und beim zweiten weg habe ich versucht teile aus diesem qullcode zu kopieren:

Code: Alles auswählen

program pasbzip;
 
uses objects,bzip2;
 
var infile,outfile:Tbufstream;
    decoder:Tbzip2_decode_stream;
    a:array[1..4096] of byte;
    i,readsize:cardinal;
 
begin
  assign(output,'pasbzip.out');
  rewrite(output);
  if paramcount<>1 then
    writeln('Usage: pasbunzip <file>')
  else
    begin
      infile.init(paramstr(1),stopenread,4096);
      outfile.init('OUTFILE',stcreate,4096);
      decoder.init(@infile);
      if decoder.status<>stok then
        writeln('Fout: ',decoder.status,' ',decoder.errorinfo);
      repeat
        readsize:=4096;
        decoder.read(a,readsize);
        dec(readsize,decoder.short);
        outfile.write(a,readsize);
      until decoder.status<>0;
      if decoder.status<>stok then
        writeln('Fout: ',decoder.status,' ',decoder.errorinfo);
      decoder.done;
      infile.done;
      outfile.done;
    end;
    close(output);
end.
 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  objects,Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons,bzip2,fileutil;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Memo1: TMemo;
    procedure BitBtn1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  infile,outfile:TBufStream;
  decoder:Tbzip2_decode_stream;
  a:array[1..4096] of byte;
  i,readsize:cardinal;
 
implementation
 
{ TForm1 }
 
procedure TForm1.BitBtn1Click(Sender: TObject); // packen
begin
  assign(output,'pasbzip.out'); // meckert das ich zuviele paramter nutze aber bei strg+leertaste zeigt er an das es mehre defination gibt aber da scheint lazarus wohl noch probleme zu habe er nimmt immer die erste und die stimmt leider nicht !
da bei der ersten nur ein parameter erwartet wird und herrausfinden wo sich die unit für den  assign konnte ich leider auch nicht !
  rewrite(output);
  Memo1.Lines.SaveToFile('/media/hda7/testText.txt')
  infile. init('/media/hda7/testText.txt',stopenread,4096);
 
  outfile.init('OUTFILE',stcreate,4096);
  decoder.init(@infile);
  infile.done;
  outfile.done;
 
  close(output);
end;
 
initialization
  {$I unit1.lrs}
 
end.
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

@pluto

Guckst Du hier...

Code: Alles auswählen

procedure BZCompressBuf(const InBuf: Pointer; InBytes: Integer;
  out OutBuf: Pointer; out OutBytes: Integer);


dann müßte dir auffallen, das "out" fettgedruckt ist. Das ist also offenbar ein Schlüsselwort, das du so wohl kaum verwenden darfst. Hinzu kommt noch, das du 2 parameter im Interface mit "out" angibst. Wundert mich schon das er das überhaupt nimmt. Damit überschreibst du normalerweise die erste Definition.

Im zweiten Versuch gilt, assign ist kommt vom Standardpascal, da brauchste keine Unit. Das müßte neu auch eher AssignFile heißen. Ansonsten gilt für assign:

assign(f, filename);

f ist entweder strukturiert:

Code: Alles auswählen

type
  TMyFileRecord = record
    ...
  end;
 
var
  f: file of TMyFileRecord;


oder Text (meint dann Recordsize = 1).

Dann kommt mir dein Zugriff "/media/hda7..." etwas merkwürdig vor. Das macht man unter LINUX so eigentlich nicht. Da greift man auf das Verzeichnis zu, um das Medium mußt du dich eigentlich nur kümmern wenn es sich um Wechselmedien handelt. Dann muß dem aber ein "mount /dev/hda7 /media/hda7" auf Betriebssystemebene vorausgehen. Schon deshalb sollt man das bei Festplatten nicht machen. Ist ja auch unnötig kompliziert, da die Platten in aller Regel bereits auf einem Mountpoint beim starten über /etc/fstab einghängt sind. Sie mal in der Datei nach welcher für hda7 da gültig ist.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

vielen dank das mit out verstehe ich noch nicht so wie du das meinst... mir ist schon klar das es ein schlüsselwort ist nur ich kann beim besten will nicht erkennen wo ich out nutze und was du hier mit z.b. meisnt:
dann müßte dir auffallen, das "out" fettgedruckt ist. Das ist also offenbar ein Schlüsselwort, das du so wohl kaum verwenden darfst. Hinzu kommt noch, das du 2 parameter im Interface mit "out" angibst. Wundert mich schon das er das überhaupt nimmt. Damit überschreibst du normalerweise die erste Definition.

das mit assginfile werde ich mal probieren !

vielen dank erstmal !
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Das wird wohl eher von Delphi so verwendet, das dürfte mit dem "out" nicht unbedingt von FPC nicht unbedingt kompatibel sein. Schlag das mal nach.

Für f gibt es noch die Möglichkeit:
var f: file;

das ist dann ebenfalls Recordsize = 1 und wird für unstrukturierte Daten so verwendet. Damit kann man dann variable Recordlängen mit BufWrite schreiben. BufWrite setzt kein eof im File, das passiert erst beim Schließen am Ende des Files.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

schnullerbacke hat geschrieben:Das wird wohl eher von Delphi so verwendet, das dürfte mit dem "out" nicht unbedingt von FPC nicht unbedingt kompatibel sein. Schlag das mal nach.


Wird glaub ich im Zusammenhang mit COM /Corba verwendet.
Sieht mir hier auch eher ungesund aus.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Dann kommt mir dein Zugriff "/media/hda7..." etwas merkwürdig vor. Das macht man unter LINUX so eigentlich nicht. Da greift man auf das Verzeichnis zu, um das Medium mußt du dich eigentlich nur kümmern wenn es sich um Wechselmedien handelt. Dann muß dem aber ein "mount /dev/hda7 /media/hda7" auf Betriebssystemebene vorausgehen. Schon deshalb sollt man das bei Festplatten nicht machen. Ist ja auch unnötig kompliziert, da die Platten in aller Regel bereits auf einem Mountpoint beim starten über /etc/fstab einghängt sind. Sie mal in der Datei nach welcher für hda7 da gültig ist.


/media ist der standart einhängepunkt für dateisysteme und debian basierte distributionen nennen den mountpoint dann gleich wie das gerät von daher ist das schon vollkommen ok

Text gibts seit Delphi3 !? auch nicht mehr wurde zusammen mit AssignFile zu TextFile
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Na ja, aber die werden ja normal dann über fstab auf /, /usr, /opt oder sonstwas gesetzt, also kann man auch darauf Bezug nehmen.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nö, das macht nur Suse so und nicht gerade Standartkonfor es gibt nämlich eine Beschreibung was im Linux dateisystem wo zu lamden hat und dort werden dateisysteme entweder auf /mnt oder /media eingehängt und nicht irgendwo im user Zweig SuSE ist nicht unbedingt die Standartkonformste Distribution die fallen mit so ziemlich allem aus dem Rahmen darauf würd ich mich nicht unbedingt beziehen :)

Falls du mir nicht glaubst nachzulesen hier bei der FRilesystem Standart hirarchy Group

http://www.pathname.com/fhs/pub/fhs-2.3.html
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Jo, netter Link. Ändert aber nix daran, das Unix oder Unixähnliche Systeme eben gerade nicht den direkten Link (oder Mountpoint) auf ein bestimmtes Medium (/dev/hdaX) legen sondern /dev/hdaX an einem bestimmten vorgebenen Mount innerhalb des Systems mounten (z.B. root, /usr, /home...etc). Das hatte was mit den früher gebräuchlichen SCSI-System zu tun, da konnte man ne Menge Medien einhängen (immerhin bis zu 16), das wäre aber für die Verwaltung ziemlich aufwendig gewesen als da jeder hätte wiisen müssen, was sdaXX denn nun sein soll. Deswegen haben UNIX-konforme System einen Moutpoint gewählt der unabhängig vom Medium existieren darf. Deswegen kann man /dev/hdaXX z.B. unter /home/web/s eihängen und bleibt im Verzeichnisbaum.

So gesehen hält sich SuSE eher an die Vorgaben während die anderen Distris davon abweichen. Einzig hält sich SuSE bei der Kompilierung von lokalen Anwendungen eben leider nicht an die Vorgaben. Der Apache ist nicht shared, der läuft auf dem presenten System und hat nix in /sbin oder /usr/sbin zu suchen (s = shared). Der gehört eher nach /usr/local/bin oder /usr/local/apache-x.x.x/bin. Aber das kann ne lange Diskussion werden, die wir beide nicht lösen werden.

Aber die geschichtliche Entwicklung von UNIX sollte man sich schonmal reinziehen. Das sollte ein verteiltes Dateisystem für für kleinere bis mittlere Rechnernetze sein und trotzdem den Raum für große Massenspeicher zur Verfügung stellen. Deswegen die eindeutige Festlegung was wohin gehört. Wers nicht glaubt googelt nach "Tanenbaum". Dort ist UNIX das erstemal beschrieben (besser das Booklet kaufen ca. 15,- €). Demnach gehören alle Platten die nicht ausdrücklich öffentlich sein sollen nach /usr/local/{blabla}. Die ließen sich auch noch unter einem Volumelabel zusammenfassen, was das System und vor allem den Programmierer kräftig entlastet. Bei wachsender Datenbank landen eben die Daten immer noch sicher im Massenspeicher.

Anstatt also mit durchnummerieren hätte eine Platte auch /usr/shared/buchhaltung heißen dürfen und könnte für sich ein komplettes Volume sein. Soweit der Anspruch, man betrachte das Ergebnis.

In der Großrechnertechnik kann man schließlich jede neue Platte einem Volume hinzufügen, damit umgeht man Platzprobleme durch wachsende Datenmengen, genau das sollte UNIX für kleinere Firmen möglich machen. Mit der DOS-Praxis (LW C:, B:, D:...) hat das nichts gemein, das führte ganz im Gegenteil davon weg.

/media/hdax ist aber genau die Entsprechung zu den DOS-Systemen, Platte volle Affe tot.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Den ersten Textabschnitt versteh ich nicht erklärst du da wozu man ein medium mounten muss ? Wenn ja ists falsch man muss es mounten um die dateisystemschicht zwischen das Gerät und den verzeichnisbaum zu bekommen. Was das jetzt mir dem Problem zu tun hat weiss ich nicht.

Es ist auch klar das man mounten kann wohin man will nur gibt es für die distris nen Leitfaden und den hab ich dir mit dem Link gegeben und danach sollten automatisch in /etc/fstab eingetragenen mountpunkte auf /media oder /mnt zeigen und nicht irgendwo nach /usr dort sollte sich nämlich benutzersoftware finden

Man kann mit dem einhängen von Datenträgern auch nicht den Plattenplatz vergrössern dazu müsste man ja mehrere Datenträger auf einen mountpoint hängen können kann man aber nicht dafür gibt es lvm. Welches deiner Aussage zufolge ja volkommen sinnlos wäre.

Und der Herr Andrew S. Tannebaum hat mehrere Bücher über Betriebsysteme und Betriebsystementwicklung geschrieben der is aber auch nur n mensch und hat auch nich immer recht ich weiss nicht genau worauf du dich nun dort genau beziehst aber ich glaube eher einer Gruppe die Standarts festlegt als einem einzelnen Entwickler der irgendwann mal was in seinem Buch geschrieben hat.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

naja mir ist es erstmal nicht so wichtig... ich frage mich aber warum fpcsoruce unter /usr/share/fpcsrc ist wo ich dort doch nicht schreiben kann... dort ist lazarus nicht in der lage irgrendwelche dateien beim komplieren anzulegen...
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

warum sollte lazarus auch in den fpcsrc ordner schreiben wollen ?!
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten