zeh

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

zeh

Beitrag von theo »

Versteht jemand dieses C Konstrukt?

Code: Alles auswählen

int tbc;
    tbc =
      (uc == 0x000D) ? UTF8PROC_BOUNDCLASS_CR :
      (uc == 0x000A) ? UTF8PROC_BOUNDCLASS_LF :
      ((category == UTF8PROC_CATEGORY_ZL ||
        category == UTF8PROC_CATEGORY_ZP ||
        category == UTF8PROC_CATEGORY_CC ||
        category == UTF8PROC_CATEGORY_CF) &&
        !(uc == 0x200C || uc == 0x200D)) ? UTF8PROC_BOUNDCLASS_CONTROL :
      property->extend ? UTF8PROC_BOUNDCLASS_EXTEND :
      ((uc >= UTF8PROC_HANGUL_L_START && uc < UTF8PROC_HANGUL_L_END) ||
        uc == UTF8PROC_HANGUL_L_FILLER) ? UTF8PROC_BOUNDCLASS_L :
      (uc >= UTF8PROC_HANGUL_V_START && uc < UTF8PROC_HANGUL_V_END) ?
        UTF8PROC_BOUNDCLASS_V :
      (uc >= UTF8PROC_HANGUL_T_START && uc < UTF8PROC_HANGUL_T_END) ?
        UTF8PROC_BOUNDCLASS_T :
      (uc >= UTF8PROC_HANGUL_S_START && uc < UTF8PROC_HANGUL_S_END) ? (
        ((uc-UTF8PROC_HANGUL_SBASE) % UTF8PROC_HANGUL_TCOUNT == 0) ?
          UTF8PROC_BOUNDCLASS_LV : UTF8PROC_BOUNDCLASS_LVT
      ) :
      UTF8PROC_BOUNDCLASS_OTHER;
Kann man das mit einem Haufen "else" nach Pascal umwandeln?
z.B.

Code: Alles auswählen

if (uc = $000D) then tbc:=UTF8PROC_BOUNDCLASS_CR else
   if  (uc = $000A) then tbc:=UTF8PROC_BOUNDCLASS_LF else etc...

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

Re: zeh

Beitrag von theo »

So vielleicht?

Code: Alles auswählen

if (uc = $000D) then tbc:=UTF8PROC_BOUNDCLASS_CR else
      if (uc = $000A) then tbc:=UTF8PROC_BOUNDCLASS_LF else
      if (((category = UTF8PROC_CATEGORY_ZL) or (category = UTF8PROC_CATEGORY_ZP) or (category = UTF8PROC_CATEGORY_CC) or
        (category = UTF8PROC_CATEGORY_CF)) and not ((uc = $200C) or (uc = $200D))) then tbc:=UTF8PROC_BOUNDCLASS_CONTROL else
      if aproperty^.extend then tbc:=UTF8PROC_BOUNDCLASS_EXTEND else
      if (((uc >= UTF8PROC_HANGUL_L_START) and (uc < UTF8PROC_HANGUL_L_END)) or  (uc = UTF8PROC_HANGUL_L_FILLER)) then tbc:=UTF8PROC_BOUNDCLASS_L else
      if ((uc >= UTF8PROC_HANGUL_V_START) and (uc < UTF8PROC_HANGUL_V_END)) then tbc:= UTF8PROC_BOUNDCLASS_V else
      if ((uc >= UTF8PROC_HANGUL_T_START) and (uc < UTF8PROC_HANGUL_T_END)) then tbc:=UTF8PROC_BOUNDCLASS_T else
      if ((uc >= UTF8PROC_HANGUL_S_START) and (uc < UTF8PROC_HANGUL_S_END)) then begin
      if  ((uc-UTF8PROC_HANGUL_SBASE) mod UTF8PROC_HANGUL_TCOUNT = 0) then
         tbc:= UTF8PROC_BOUNDCLASS_LV else tbc:=UTF8PROC_BOUNDCLASS_LVT;
      end else tbc:= UTF8PROC_BOUNDCLASS_OTHER;
Kompilieren tut's aber ist das auch richtig?

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

sollte kommplett richtig sein. hab ich gerade durchgeguckt
Zuletzt geändert von hanibal am Do 11. Dez 2008, 22:03, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: zeh

Beitrag von af0815 »

theo hat geschrieben:Versteht jemand dieses C Konstrukt?
Nein :shock: aber umgesetzt schaut es richtig aus :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: zeh

Beitrag von theo »

Hat jemand nen Plan von C? ;-)

Wie wäre folgender Prozedur Parameter umzusetzen?

uint8_t **dstptr

Ist das ein var PByte resp. Pchar ?
Zuletzt geändert von theo am Do 11. Dez 2008, 22:07, insgesamt 1-mal geändert.

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

af0815:
var0 = (x == y) ? var1 : var2;

würde bedeuten, das var0 den wert von var1 bekommt, wenn x = y ist, und den wert var2 wenn x ungleich y ist. man kann dies beliebig verschachteln

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

uint 8 ist ein 8 bit breiter integer ohne vorzeichen.

also eine variable vom type byte.

und was meinst du mit procedur parameter? in c gibt es nur funktionen.
eine funktion z.B. "uint8_t test"
entspricht "function test : byte"
Zuletzt geändert von hanibal am Do 11. Dez 2008, 22:11, insgesamt 1-mal geändert.

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

Re: zeh

Beitrag von theo »

hanibal hat geschrieben:uint 8 ist ein 8 bit breiter integer ohne vorzeichen.
Danke hanibal.
Aber das ist einfach ein Byte oder?
Ich meinte mehr das **, also var PByte ?

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

achso, das weiß ich gerade auch nicht so genau, bin gerade am c lernen ^^
für µC.

ich gucke mal im C buch nach.

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

Re: zeh

Beitrag von theo »

hanibal hat geschrieben: und was meinst du mit procedur parameter? in c gibt es nur funktionen.
So: ssize_t utf8proc_map( const uint8_t *str, ssize_t strlen, uint8_t **dstptr, int options)

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

das bedeutet, das das ein pointer ist. ich zitiere: "Eine Pointervariable ist eine Variable, deren Wert eine edresse ist. Eine Adresse benötigt im Normalfall je nach Rechner zwei bis vier bytes. Wenn eine Variable als Pointervariable deklariert werden soll, muß sie auch als solche kenntlich gemacht werden. Das geschit durch ein Sternchen (*) vor dem Variablen namen."

Edit, achso, das meinst du mit procedur parameter

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

Re: zeh

Beitrag von theo »

hanibal hat geschrieben: Edit, achso, das meinst du mit procedur parameter
Ich tippe mal auf:

Code: Alles auswählen

function utf8proc_map(str:Pchar; strlen: ssize_t; var dstptr:PByte; options:integer): ssize_t;
Du siehst ja das ** also Pointer Pointer. Ich glaube das var erledigt den zweiten Pointer.

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

so würde ich das auch schreiben, aber das eigenartige sind ja die zwei sternchen, ich kann nirgenz finden, was das damit auf sich hat.

EDIT: ich habe wohl deinen letzten satz überlesen. damait kannst du recht haben, weiß ich nicht.
wofür braucht man den pointer pointer?

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

Re: zeh

Beitrag von theo »

hanibal hat geschrieben:so würde ich das auch schreiben, aber das eigenartige sind ja die zwei sternchen, ich kann nirgenz finden, was das damit auf sich hat.

EDIT: ich habe wohl deinen letzten satz überlesen. damait kannst du recht haben, weiß ich nicht.
wofür braucht man den pointer pointer?
Naja wahrsch. kann man damit das ganze PByte nochmal woanders hin hängen.

Wenn du grad warmgelaufen bist: Was hältst du von dieser Umsetzung;

C:

Code: Alles auswählen

if (options & UTF8PROC_CASEFOLD) {
    if (property->casefold_mapping) {
      const int32_t *casefold_entry;
      ssize_t written = 0;
      for (casefold_entry = property->casefold_mapping;
          *casefold_entry >= 0; casefold_entry++) {
        written += utf8proc_decompose_char(*casefold_entry, dst+written,
          (bufsize > written) ? (bufsize - written) : 0, options,
          last_boundclass);
        if (written < 0) return UTF8PROC_ERROR_OVERFLOW;
      }
      return written;
    }
  }
PASCAL:

Code: Alles auswählen

if (options and UTF8PROC_CASEFOLD)<>0 then
    begin
     if aproperty^.casefold_mapping^<>0 then
      begin
        written:=0;
        casefold_entry:=aproperty^.casefold_mapping;
        while casefold_entry^>=0 do
        begin
        if (bufsize > written) then temp:=(bufsize - written) else temp:= 0;
        written:=written+utf8proc_decompose_char(casefold_entry^, dst+written, temp, options, last_boundclass);
        inc(casefold_entry);
        if (written < 0) then begin result:= UTF8PROC_ERROR_OVERFLOW; exit; end;
        end;
        Result:=written;
        exit;
      end;
    end;
Ich seh grad, das ist Käse:
if aproperty^.casefold_mapping^0 then
muss heissen
if aproperty^.casefold_mappingnil then

hanibal
Beiträge: 369
Registriert: Sa 3. Mär 2007, 16:03
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Bramsche (Emsland)

Re: zeh

Beitrag von hanibal »

moment ich drucke das kurz aus, dann gehts leichter ;)

Antworten