diff options
Diffstat (limited to 'fickle/examples/cl.fcl')
-rw-r--r-- | fickle/examples/cl.fcl | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/fickle/examples/cl.fcl b/fickle/examples/cl.fcl new file mode 100644 index 0000000..0949843 --- /dev/null +++ b/fickle/examples/cl.fcl @@ -0,0 +1,76 @@ +# $Id: cl.fcl,v 1.1.1.1 2004/07/23 19:22:41 tang Exp $ + +# Scans its command line for various arguments. + +# This is based upon example 'ape-05.l' (which is the flex version of +# 'ch2-05.l') from "lex & yacc" by John R. Levine, Tony Mason, and +# Doug Brown (by O'Reilly & Associates, ISBN 1-56592-000-7). For more +# information on using lex and yacc, see +# http://www.oreilly.com/catalog/lex/. + +# myinput() could have been written much more efficiently because Tcl +# handles command line arguments as a list. For the sake of porting +# the original example to Tcl, I used the same logic found within the +# original flex code. + +%{ +#!/usr/bin/tclsh +%} + +%buffersize 1024 +%option nodefault + +%% + +-h | +-\? | +-help { + puts "usage is: $::progName \[-help | -h | -? \] \[-verbose | -v \] \[(-file | -f) filename\]" + # actually, the -f option is not handled by this program. + # that is left as an exercise to the reader. + } +-v | +-verbose { + puts "verbose mode is on" + set ::verbose 1 + } + +%% + +proc YY_INPUT {buf result max} { + upvar $result ret_val + upvar $buf buf_data + set ret_val [myinput buf_data $max] +} + +set ::offset 0 +proc myinput {buf max} { + upvar $buf buf_data + if {[llength $::targv] == 0} { + # no arguments left, so return an EOF + return 0 + } + set len [string length [lindex $::targv 0]] + if {$len >= $max} { + set copylen [expr {$max - 1}] + } else { + set copylen $len + } + if {$len > 0} { + set buf_data [string range [lindex $::targv 0] $::offset $copylen] + } + if {[string length [lindex $::targv 0]] >= $::offset + $copylen} { + append buf " " + incr copylen + set ::offset 0 + set ::targv [lrange $::targv 1 end] + } else { + incr ::offset $copylen + } + return $copylen +} + +set progName $argv0 +set verbose 0 +set ::targv $argv ;# holds remainder of argument list +yylex |