From c5199f6c6c3fd14c75d98c50d01a3e31974345d2 Mon Sep 17 00:00:00 2001 From: timmy Date: Sat, 6 Feb 2010 16:21:25 -0500 Subject: [PATCH] some shell helper methods --- src/lib/devsupport.slate | 2 +- src/lib/regex.slate | 3 ++ src/shell/init.slate | 6 +++ src/shell/matching.slate | 118 +++++++++++++++++++++++++++++++++++++++++++++++ src/shell/shell.slate | 31 +++++++++++++ 5 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/shell/init.slate create mode 100644 src/shell/matching.slate create mode 100644 src/shell/shell.slate diff --git a/src/lib/devsupport.slate b/src/lib/devsupport.slate index 8af2e88..8a18cc4 100644 --- a/src/lib/devsupport.slate +++ b/src/lib/devsupport.slate @@ -40,7 +40,7 @@ x@(Root traits) methodsUsingMe (role selector findOn: findOnArray) ifNotNilDo: [| :method | (method isSameAs: PrimitiveMethod) ifFalse: - [writer nextPut: method method]]]]]] writingAs: Set + [result nextPut: method method]]]]]] writingAs: Set ]. x@(Root traits) mostCommonlyCalledMethods diff --git a/src/lib/regex.slate b/src/lib/regex.slate index b6152cf..670d0ff 100644 --- a/src/lib/regex.slate +++ b/src/lib/regex.slate @@ -258,6 +258,9 @@ Matching -------- " +Regex Matcher define: #Fail -> -1. + + m@(Regex Matcher traits) newOn: s@(String traits) [ m newOn: (Regex Regex newOn: s) diff --git a/src/shell/init.slate b/src/shell/init.slate new file mode 100644 index 0000000..cf06d6b --- /dev/null +++ b/src/shell/init.slate @@ -0,0 +1,6 @@ +"shell routines" + +load: 'src/lib/regex.slate'. +load: 'src/shell/matching.slate'. +load: 'src/shell/shell.slate'. + diff --git a/src/shell/matching.slate b/src/shell/matching.slate new file mode 100644 index 0000000..be8c499 --- /dev/null +++ b/src/shell/matching.slate @@ -0,0 +1,118 @@ +lobby ensureNamespace: #Shell. + +Shell define: #MaskPattern &parents: {Cloneable} &slots: {#components}. +Shell define: #MaskPatternMatcher &parents: {Cloneable} &slots: {#reader. #maskPattern}. + +Shell define: #MaskPatternFailure. + +Shell define: #MaskPatternComponent &parents: {Cloneable}. +Shell define: #MaskPatternLiteral &parents: {Shell MaskPatternComponent} &slots: {#string}. +Shell define: #MaskPatternRange &parents: {Shell MaskPatternComponent} &slots: {#ranges. #negate}. +Shell define: #MaskPatternAny &parents: {Shell MaskPatternComponent}. +Shell define: #MaskPatternAnyOne &parents: {Shell MaskPatternComponent}. + +mp@(Shell MaskPattern traits) newOn: s@(String traits) +[ + mp components: ExtensibleArray new. + mp readFrom: s reader. + mp +]. + +mp@(Shell MaskPattern traits) readFrom: s@(ReadStream traits) +[ | prev matcher | + prev: '' writer. + matcher: mp components writer. + s do: + [|:token| ({$*. $?. $\[. } includes: token) /\ [prev contents isEmpty not] + ifTrue: [matcher nextPut: (Shell MaskPatternLiteral new `>> [string: prev contents. ]). + prev: '' writer]. + token caseOf: + { + $* -> [matcher nextPut: Shell MaskPatternAny]. + $? -> [matcher nextPut: Shell MaskPatternAnyOne]. + $\[ -> [matcher nextPut: (mp readRange: (s upTo: $\]))]. + + } otherwise: [prev nextPut: token]. + ]. + + prev contents isEmpty ifFalse: [matcher nextPut: (Shell MaskPatternLiteral new `>> [string: prev contents. ])]. + mp components: matcher contents. + +]. + + +mp@(Shell MaskPattern traits) readRange: str@(String traits) +[ | p char2 s | + s: str reader. + p: Shell MaskPatternRange new. + p ranges: ExtensibleArray new. + + char2: s peek. + char2 = $^ \/ [char2 = $!] ifTrue: [p negate: True] ifFalse: [p negate: False]. + + s do: + [|:char| + char2: s peek. + char2 = $- + ifTrue: [s next. p ranges addLast: char -> s next] + ifFalse: [p ranges addLast: char]. + + ]. + + p +]. + +mp@(Shell MaskPattern traits) match: str@(String traits) from: pos +[ + (Shell MaskPatternMatcher new `>> [maskPattern: mp. reader: mp components reader. ]) match: str from: pos +]. + +mp@(Shell MaskPatternMatcher traits) match: str@(String traits) from: pos +[ + "inform: 'match reader: ' ; mp reader printString ; ' pos: ' ; pos printString." + mp reader + do: [|:token| (token isSameAs: Shell MaskPatternAny) + ifTrue: [str size downTo: pos do: + [|:start | ((mp new `>> [reader: mp reader clone. ]) match: str from: start) = str size + ifTrue: [^ str size]]] + ifFalse: [pos: (token match: str from: pos). + pos == Shell MaskPatternFailure ifTrue: [^ pos]]]. + pos +]. + +mp@(Shell MaskPattern traits) matches: str@(String traits) +[ | match | + match: (mp match: str from: 0). + match ~== Shell MaskPatternFailure /\ [match = str size] +]. + + +p@(Shell MaskPatternAny traits) match: str@(String traits) from: pos +[ + (pos to: str size - pos) +]. + +p@(Shell MaskPatternAnyOne traits) match: str@(String traits) from: pos +[ + pos >= str size ifTrue: [Shell MaskPatternFailure] ifFalse: [pos + 1] +]. + +p@(Shell MaskPatternRange traits) match: str@(String traits) from: pos +[ + pos >= str size \/ [p matches: (str at: pos)] ifTrue: [Shell MaskPatternFailure] ifFalse: [pos + 1] +]. + +p@(Shell MaskPatternLiteral traits) match: str@(String traits) from: pos +[ + pos + p string size > str size ifTrue: [^ Shell MaskPatternFailure]. + (str copyFrom: pos to: pos + p string size - 1) = p string ifTrue: [pos + p string size] ifFalse: [Shell MaskPatternFailure] +]. + + +p@(Shell MaskPatternRange traits) matches: c@(String Character traits) +[ + p ranges do: [|:range| (range isSameAs: c) /\ [range = c] ifTrue: [^ True]. + range key code <= c code /\ [range value code >= c code] ifTrue: [^ True]]. + False +]. + diff --git a/src/shell/shell.slate b/src/shell/shell.slate new file mode 100644 index 0000000..6b4cbea --- /dev/null +++ b/src/shell/shell.slate @@ -0,0 +1,31 @@ +lobby ensureNamespace: #Shell. + +Shell define: #FileArray &parents: {ExtensibleArray}. + + +d@(Directory traits) maskedEntries: mask@(String traits) do: block +[ + d maskedEntries: (Shell MaskPattern newOn: mask) do: block +]. + + +d@(Directory traits) maskedEntries: mask@(Regex Regex traits) do: block +[ | matcher| + matcher: (Regex Matcher newOn: mask). + d reader reset do: [|:each| (matcher match: each) = Regex Matcher Fail ifFalse: [block applyWith: d / each]]. +]. + +d@(Directory traits) maskedEntries: mask@(Shell MaskPattern traits) do: block +[ + d reader reset do: [|:each| (mask matches: each) ifTrue: [block applyWith: d / each]]. +]. + + + +d@(Directory traits) collectMasked: mask +[ + [|:result| d maskedEntries: mask do: #nextPut: `er <- result. result] writingAs: Shell FileArray +]. + + + -- 2.11.4.GIT