View Full Version : REGEX - CCSID???
CCSID-Probleme habe schon viele aber merken es ggf. gar nicht.
Was ich mit der Diskrepanz meine ist, dass die C-Funktionen nl_langinfo oder localeconv immer ein korrektes Ergebnis liefern, auch wenn die Variable LANG nicht besetzt ist.
Du kannst ja per getenv() die Variable abfragen, wenn nicht besetzt, ist CCSID = 037, ansonsten per nl_langinfo("CODESET") die CCSID abfragen.
Vielleicht liefert die ja auch einen Leerstring, wenn LANG nicht besetzt ist.
chrisssiie
25-05-10, 15:33
wie ruft man denn diese nl_langinfo auf?
so geht es irgendwie nicht:
D nllanginfo PR * ExtProc('nl_langinfo')
D * VALUE OPTIONS(*STRING:*TRIM)
/free
envccsid = %str(nllanginfo('CODESET'));
/end-free
da krieg ich immer nen leeren String zurück....
hab auch schon envlang = %str(nllanginfo('0'));
probiert.... krieg ich aber auch nur nen leerstring...
der Übergabeparameter bei nllanginfo ist ja vom typ nl_item, blos woher krieg ich den im RPG?
-----------------------------------------------------
edit:
hat sich erledigt.... man muss ne zahl übergeben, kein String -.-
D nllanginfo PR * ExtProc('nl_langinfo')
D 10i 0 VALUE
envccsid = %str(nllanginfo(1));
1 ist die ccsid(codeset)...
und ich habe endlich eine funktionierende REGEX Funktion in RPG :D
Regex arbeitet anscheinend mit der CCSID welche nl_langinfo zurückggibt, also nicht unbedingt mit dem Wert, welcher in der Umgebungsvariable LANG steht!!!!
Ist LANG leer, bekommt man CCSID 37 zurück....
Hab dies ausprobiert und er hat immer mit der CCSID von nl_langinfo gearbeitet!!!!
SourceCoder
08-10-12, 13:35
Schönen guten Tag Zusammen,
also ich muss für meine Ausbildung RPG/ILE verwenden/lernen da kommt es öfters vor das ich ein Teil eines Strings suchen oder ersetzten muss. Ich selbst verwendet Regulärer Ausdruck in C# und war immer begeistert wie viel man damit anstellen kann. Nun würde ich das gern in RPGILE (Free) verwende leider bin ich aus den Beiträgen vor mir nicht ganz schlau geworden gibt es vielleicht ein gutes deutsches Tutorial zu diesem Thema?
So sieht man Beispiel Programm aus, leider funktioniert es nicht:
/FREE
Source = 'Das ist ein TEST(123) Regulaerer Ausdruck';
DSPLY %SCAN('([0-9])' :Source);
*Inlr = *On;
/END-FREE
PS: Ich hoffe es ist dein Problem das ich hier Anfänger Fragen stelle.
PS: Ein kleines Beispiel Programm mit Kommentaren würde mir sicher weiterhelfen.
%scan kennt keine regulären Ausdrücke sonder durchsucht einfach nach dem Vorkommen der Zeichenkette.
Für reguläre Ausdrücke benötigst du die C-Funktionen regcomp() und regexec().
In ILERPG definiert man dann einen Prototype (ähnlich der .h-Dateien in C++), der dann aufgerufen wird.
Beim sog. binden wird dann das "BNDDIR('QC2LE')" benötigt, damit das Programm dann eben die Funktionen verwenden kann.
Da z.B. regcomp() selber Speicher anlegt sollte dieser auch mittels free() wieder freigegeben werden.
Ansonsten ist das Thema "ILE-Schulung" für das Forum zu komplex.
SourceCoder
18-10-12, 14:42
Hab es nun mit Ihrer Hilfe und Vorlagen aus dem Internet versucht etwas nachzubauen, das ist dabei raus gekommen.
Code (http://pastebin.com/uvjh8QeH)
Leider bekomme ich beim Aufrufen: regexec() failed with: regexec() failed to find a match..
Dann hast du ggf. regcomp() vergesssen bzw. den Status von regcomp() nicht abgefragt ob der Ausdruck denn überhaupt gültig ist.
SourceCoder
18-10-12, 18:32
Also ich bin mal mit dbg durch gegangen regcomp Status ist ok nur bei :
C* Execute RE c eval rc = regexec(preg: %addr(string):
c nmatch: pmatch: 0)
c if rc <> 0
gibt es ein Fehler zurück also rc nicht mehr 0 sondern 1. Welche gründe könnte das haben?
Ggf. falsche Prototypdeklaration. Prüfe die doch noch mal gegen das C-Handbuch ab.
Ggf. hast du die Lib QSYSINC installiert, dann gibts die ganzen C-Header in den H/SYS-Dateien (und noch ein paar mehr).
SourceCoder
28-08-13, 08:22
Ohh vergessen das es diesen Thread gab, sonst hätte ich keinen neuen erstellt :p.
@Fuerchau
Sie haben ja die Methode mit dem Befehl putenv vorgeschlagen, diese würde ich gern in einem C/C++ anwenden.
So etwa?
So sieht der Befehl aus:
putenv("LANG=QSYS.LIB/DE_DE.LOCALE");
Vorteil bei putenv():
- gilt nur für das aktive Prgrammobjekt
- keine ENVVAR's im Job <-- Envvar wird gesetzt