OSSP CVS Repository

ossp - Check-in [1289]
Not logged in
[Honeypot]  [Browse]  [Home]  [Login]  [Reports
[Search]  [Ticket]  [Timeline
  [Patchset]  [Tagging/Branching

Check-in Number: 1289
Date: 2001-Nov-09 18:01:37 (local)
2001-Nov-09 17:01:37 (UTC)
User:rse
Branch:
Comment: Initial revision
Tickets:
Inspections:
Files:
ossp-pkg/var/Makefile      added-> 1.1
ossp-pkg/var/TODO      added-> 1.1

ossp-pkg/var/Makefile -> 1.1

*** /dev/null    Sat Nov 23 01:25:52 2024
--- -    Sat Nov 23 01:26:00 2024
***************
*** 0 ****
--- 1,50 ----
+ # Build libvarexp.
+ 
+ CC             = gcc
+ AR             = ar
+ RANLIB                 = ranlib
+ 
+ WARNFLAGS      = -Wall -pedantic
+ OPTFLAGS       = -O3 -pipe
+ 
+ CPPFLAGS       =
+ CFLAGS         =
+ LDFLAGS                =
+ 
+ OBJS           = expand-named-characters.o expand-character-class.o command.o \
+                  expression.o variable.o text.o expand.o input.o tokenbuf.o   \
+                  search-and-replace.o cut-out-offset.o transpose.o padding.o
+ 
+ .c.o:
+        $(CC) $(CPPFLAGS) $(WARNFLAGS) $(OPTFLAGS) $(CFLAGS) -c $<
+ 
+ all:   libvarexp.a
+ 
+ libvarexp.a:   $(OBJS)
+        @rm -f $@
+        $(AR) cr $@ $(OBJS)
+        $(RANLIB) $@
+ 
+ clean::
+        @(cd regression-tests && $(MAKE) clean)
+        rm -f $(OBJS)
+        rm -f libvarexp.a
+ 
+ check::
+        (cd regression-tests && $(MAKE) check)
+ 
+ # Dependencies
+ 
+ command.o: internal.h varexp.h
+ cut-out-offset.o: internal.h varexp.h
+ expand-character-class.o: internal.h varexp.h
+ expand-named-characters.o: internal.h varexp.h
+ expand.o: internal.h varexp.h
+ expression.o: internal.h varexp.h
+ input.o: internal.h varexp.h
+ padding.o: internal.h varexp.h
+ search-and-replace.o: internal.h varexp.h
+ text.o: internal.h varexp.h
+ tokenbuf.o: internal.h varexp.h
+ transpose.o: internal.h varexp.h
+ variable.o: internal.h varexp.h


ossp-pkg/var/TODO -> 1.1

*** /dev/null    Sat Nov 23 01:25:52 2024
--- -    Sat Nov 23 01:26:00 2024
***************
*** 0 ****
--- 1,175 ----
+                               libvar.a
+ 
+  - Prefix ist "var_", beziehungsweise "VAR_".
+ 
+  - Eine Variable kann im Text in der Form $name oder ${name} angegeben
+    werden, wobei die Wahl der Klammern '{' '}' und des '$'
+    parametriesiert werden können.
+ 
+  - Gültige Zeichen für einen Variablennamen sind konfigurierbar.
+    Garbage in -- garbage out.
+ 
+  - Ein echtes '$'-Zeichen im Text kann durch Voranstellung eines
+    wählbaren Escapezeichen dargestellt werden. Default ist der
+    Backslash ('\').
+ 
+  - Der Aufrufer der Funktion soll steuern können, wie sich die Library
+    verhält, wenn eine Variable nicht existiert. Denkbar sind:
+ 
+     - Abbruch mit Fehler,
+     - die Variable wird zu "", oder
+     - der Ausdruck wird unverändert in den Ausgabetext übernommen,
+       sodaß eventuell ein zweiter Pass gemacht werden kann.
+ 
+  - ${parameter:-word} wird normal expandiert. Wenn "parameter" leer
+    ist, wird stattdessen "word" eingesetzt.
+ 
+  - ${parameter:+word} substituiert "word" wenn "parameter" nicht leer
+    ist, sonst wird "" substituiert.
+ 
+  - ${parameter:o<start>-}, ${parameter:o<start>-<end>}
+ 
+  - ${parameter:o<start>,}, ${parameter:o<start>,<length>}
+ 
+  - ${parameter:#} expandiert zur Länge des Inhaltes von "parameter".
+ 
+  - ${parameter:s/pattern/string/[gti]} expandiert "parameter" und
+    führt dann eine Ersetzung mittels des regulären Ausdrucks "pattern"
+    durch. Wird das 'g'-Flag angegeben, wird nicht nur eine Instanz von
+    "pattern" durch "string" ersetzt, sondern alle. Das 't'-Flag
+    signalisiert, daß eine reine Text-Ersetzung ohne Unterstützung von
+    regulären Ausdrücken gewünscht ist. Das 'i'-Flag besagt, daß die
+    Suche nach "pattern" case-insensitiv durchgeführt wird.
+ 
+  - ${parameter:y/ochars/nchars/} expandiert den Inhalt von "parameter"
+    und transformiert dabei nach dem Prinzip von tr(1) die "ochars" im
+    Text zu "nchars".
+ 
+  - ${parameter:l} wandelt den Inhalt von "parameter" in
+    Kleinbuchstaben, bevor es die Variable expandiert. Dies geschieht
+    über toupper(3).
+ 
+  - ${parameter:u} wandelt den Inhalt von "parameter" in
+    Großbuchstaben, bevor es die Variable expandiert. Dies geschieht
+    über tolower(3).
+ 
+  - ${parameter:*word} expandiert zum leeren Wort, wenn "parameter"
+    nicht leer ist, sonst zu "word".
+ 
+  - Padding: ${parameter:p/<width>/<string>/<align>} expandiert
+    "parameter" in einen String der Mindestbreite <width>, wobei abhaengig
+    von <align> ("r" = right, "l" = left, "c" = center) noch fehlende
+    Zeichen mit <string> aufgefuellt werden. Diest ist gedacht, um in
+    Templates saubere Tabellen erzeugen zu koennen.
+    Beispiele (foo="bar"):
+        "${foo:p/6/./r}" -> "bar..."
+        "${foo:p/6/./l}" -> "...bar"
+        "${foo:p/6/./c}" -> ".bar.." (oder "..bar.", egal)
+        "${foo:p/20/-=/c}" -> "-=-=-=-=-bar-=-=-=-="
+ 
+  - Jedes Vorkommen eines der folgenden Konstrukte im Text wird durch
+    das zugehörige Sonderzeichen ersetzt.
+ 
+        \t          tab
+        \n          newline
+        \r          return
+        \033        octal char
+        \x1B        hex char
+        \x{263a}    wide hex char
+ 
+  - Syntax:
+ 
+     input           : ( TEXT | variable )*
+ 
+     variable        : '$' ( name | expression )
+ 
+     expression      : START-DELIM ( name | variable )+ ( ':' command )* END-DELIM
+ 
+     name            : ( VARNAME | SPECIAL1 | SPECIAL2 )+
+ 
+     command         : '-' ( EXPTEXT | variable )+
+                     | '+' ( EXPTEXT | variable )+
+                     | 'o' ( NUMBER ('-' | ',') ( NUMBER )? )
+                     | '#'
+                     | '*' ( EXPTEXT | variable )+
+                     | 's' '/' ( variable | SUBSTTEXT )+ '/' ( variable | SUBSTTEXT )* '/' ( 'g' | 'i' | 't' )*
+                     | 'y' '/' ( variable | SUBSTTEXT )+ '/' ( variable | SUBSTTEXT )* '/'
+                     | 'p' '/' NUMBER '/' ( variable | SUBSTTEXT )* '/' ( 'r' | 'l' | 'c' )
+                     | 'l'
+                     | 'u'
+ 
+     START-DELIM     : '{'
+ 
+     END-DELIM       : '}'
+ 
+     VARNAME         : '[a-zA-Z0-9_]+'
+ 
+     SPECIAL1        : '['
+ 
+     SPECIAL2        : ']'
+ 
+     NUMBER          : '[0-9]+'
+ 
+     SUBSTTEXT       : '[^$/]'
+ 
+     EXPTEXT         : '[^$}:]+'
+ 
+     TEXT            : '[^$]+'
+ 
+  - Doku sollte ein Beispiel für Quoting von Shell- und
+    Regexp-Ausdrücken enthalten.
+ 
+  - Wir unterstützen PCRE-, POSIX-Regex- oder keine regulären
+    Ausdrücke. Dies kann über autoconf zur Compilezeit angegeben
+    werden.
+ 
+  - Das Escaping-Problem:
+ 
+ Unsere Library macht zwei Dinge:
+ 
+  (1) Sie expandiert Variablen-Ausdrücke mit Unterstützung von
+      Operationen wie Suchen/Ersetzen, und
+ 
+  (2) sie expandiert sogenannte "quoted pairs", wie zum Beispiel \n.
+ 
+ Das Problem ist nun, daß sie dies in zwei Pässen tun will -- und muß.
+ Die Frage ist jedoch, in welcher Reihenfolge tut sie es und welche
+ Ergebnisse werden in den Ausgabetext ausgegeben? Betrachtet man
+ folgendes Beispiel, wird das Problem klarer:
+ 
+     Variablen: TEST = foo
+     Eingabe..: Der Betrag auf Konto $TEST ist \$50.
+ 
+ Soll die korrekte Ausgabe an dieser Stelle nun
+ 
+     Der Betrag auf Konto foo ist \$50.
+ 
+ oder
+ 
+     Der Betrag auf Konto foo ist $50.
+ 
+ sein? Die erste Form ist die, die man intuitiv erwartet, die zweite
+ Form ist jedoch die, die man braucht, wenn man den Text durch mehrere
+ Pässe jagen will -- was wir ausdrücklich vorgesehen haben.
+ 
+ Schlimmer noch: Wie soll die Library die Eingabe
+ 
+     Der Betrag auf Konto ${TEST:s/(.*)/\1bar/} ist \$50.
+ 
+ interpretieren? Würde unser Parser das Token "\1" interpretieren,
+ würde nur eine "1" zurückbleiben, der Benutzer müßte also "\\1"
+ schreiben, um das Ergebnis zu erhalten, was er erwartet.
+ Interpretierte unser Parser die "quoted pairs" nicht, könnte man den
+ Ausdruck
+ 
+     ${TEST:s/\n/ /g}
+ 
+ nicht verwenden, weil die Regular-Expression-Funktionen ein '\n' nicht
+ kennen.
+ 
+ Nehmen wir also an, wir interpretieren "quoted pairs" und leben damit,
+ daß der Benutzer dann doppelt escapen muß ... Wie verhält sich das
+ dann mit mehreren Pässen? Läuft die Library zweimal über die Eingabe,
+ bräuchte man bereits
+ 
+     Der Betrag auf Konto ${TEST:s/(.*)/\\1bar/} ist \$50.

CVSTrac 2.0.1