help-smalltalk
[Top][All Lists]
Advanced

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

[Help-smalltalk] using Getopt in order.st


From: Paolo Bonzini
Subject: [Help-smalltalk] using Getopt in order.st
Date: Mon, 04 Sep 2006 14:19:36 +0200
User-agent: Thunderbird 1.5.0.5 (Macintosh/20060719)

Just for the record, since Getopt was mentioned recently on the mailing list I decided to set a good example and use it in the gtk/order.st script that Mike Anderson contributed a while ago (and that had its own small cmdline parser).

It works like a charm (i.e. backwards-compatibly), and I took the opportunity of making the script a little more flexible since I needed that functionality a while ago. The prefixes of the accepted include files are not hard-coded in the script, but also passed via a command-line argument.

Paolo
--- orig/gtk/order.st
+++ mod/gtk/order.st
@@ -30,23 +30,12 @@
  ======================================================================"
 
 Object subclass: #IncludesScanner 
-       instanceVariableNames: 'paths ordered processed'
+       instanceVariableNames: 'paths ordered processed prefixes'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Gtk-Building bindings'
 !
 
-!CharacterArray methodsFor: 'testing'!
-
-gPrefixes
-    ^#('g' 'atk' 'pango')!
-
-isGName
-    | name |
-    name := File stripPathFrom: self.
-    ^self gPrefixes anySatisfy: [ :each | name startsWith: each ]
-! !
-
 !SystemDictionary methodsFor: 'utility'!
 
 readOutput: aCommand
@@ -72,24 +61,28 @@ initialize
     ordered := OrderedCollection new.
     paths := OrderedCollection with: '.'.
     processed := Set new. "Same as order, but a set for faster lookup"
+    prefixes := OrderedCollection new.
 !
 
 process: args
-    args do: [ :arg |
-       [ self processArgument: arg ]
-           ifCurtailed: [ ('while processing ', arg) displayNl ]
-    ]!
-
-processArgument: arg
-    (arg startsWith: '-L') 
-       ifTrue: [ ^self processLib: (arg copyFrom: 3) ].
-
-    (arg startsWith: '-I')
-       ifTrue: [ ^self processPath: (arg copyFrom: 3) ].
-
+    Getopt
+       parse: args
+       with: '--include|-I: -L: --prefix|-P:'
+       do: [ :opt :arg |
+           [ self processArgument: opt with: arg ]
+               ifCurtailed: [ ('while processing -', opt asString, arg) 
displayNl ] ]!
+
+processArgument: opt with: arg
+    opt = $P ifTrue: [ ^self processPrefix: arg ].
+    opt = $L ifTrue: [ ^self processLib: arg ].
+    opt = $I ifTrue: [ ^self processPath: arg ].
     self processFile: arg
 !
 
+processPrefix: aString
+    prefixes add: aString
+!
+
 processPath: aPath
     (paths includes: aPath) 
        ifFalse: [ paths add: aPath ].
@@ -106,13 +99,18 @@ processLib: aLib
     ].
 !
 
+hasCorrectPrefix: aString
+    prefixes isEmpty ifTrue: [ ^true ].
+    ^prefixes anySatisfy: [ :each | aString startsWith: each ]
+!
+
 processFile: aFileName
     | incs file |
     (processed includes: aFileName) ifTrue: [ ^self ].
     processed add: aFileName.
     file := self findFile: aFileName.
     incs := self scanForIncludes: file.
-    incs do: [ :each | each isGName ifTrue: [ self processFile: each ] ].
+    incs do: [ :each | self processFile: each ].
     ordered add: file fullName.
 !
 
@@ -134,7 +132,7 @@ findFile: aFile
 !
 
 scanForIncludes: aFile
-    | fs r line last dir prefix f |
+    | fs r line last dir prefix f fname lastCh |
     "Get the path for quote-delimited #include directives."
     dir := (File pathFor: aFile name) copyWith: $/.
     fs := aFile readStream.
@@ -145,20 +143,22 @@ scanForIncludes: aFile
            (line startsWith: '#include') 
                ifTrue: [
                    line := (line copyFrom: 9) trimSeparators.
-                   (line size > 2 and: [ (line at: 1) = $< ])
-                       ifTrue: [ prefix := ''. last := line indexOf: $> ].
-                   (line size > 2 and: [ (line at: 1) = $" ])
-                       ifTrue: [
-                           last := line indexOf: $" startingAt: 2.
+                   prefix := ''.
+                   line first = $< ifTrue: [ lastCh := $> ].
+                   line first = $" ifTrue: [ lastCh := $" ].
+                   last := line indexOf: lastCh startingAt: 2.
+                   fname := line copyFrom: 2 to: last - 1.
 
+                   lastCh = $"
+                       ifTrue: [
                            "Try getting the file from the same directory as the
                             one with the #include directory.  If it succeeds, 
use
                             an absolute path."
-                           f := File name: dir, (line copyFrom: 2 to: last - 
1).
-                           prefix := f isReadable ifTrue: [ dir ] ifFalse: [ 
'' ].
+                           f := File name: (Directory append: fname to: dir).
+                           f isReadable ifTrue: [ prefix := dir ].
                        ].
 
-                   r add: prefix, (line copyFrom: 2 to: last - 1)
+                   (self hasCorrectPrefix: fname) ifTrue: [ r add: prefix, 
fname ].
                ].
        ].
     ^r
--- orig/gtk/Makefile.am
+++ mod/gtk/Makefile.am
@@ -94,7 +94,8 @@ enums.c: mk_enums cpp order
 
 order: order.st Makefile $(LOCAL_FILES)
        PKG_CONFIG='$(PKG_CONFIG)' ../gst \
-         -I ../gst.im $(srcdir)/order.st -a \
+         -I ../gst.im -f $(srcdir)/order.st \
+         -Pg -Patk -Ppango \
          `$(PKG_CONFIG) --cflags-only-I gobject-2.0` \
          `$(PKG_CONFIG) --cflags-only-I gdk-2.0` \
          `$(PKG_CONFIG) --cflags-only-I gdk-pixbuf-2.0` \

reply via email to

[Prev in Thread] Current Thread [Next in Thread]