[Top][All Lists]
[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` \
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Help-smalltalk] using Getopt in order.st,
Paolo Bonzini <=