da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.ds ;G \\*(;G\\f\\$1\\$3\\f\\$2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.if !\\$4 .Af \\$2 \\$1 "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.ie \\$3 .ft \\$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.nr ;G \\n(.f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.Af "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" "\\$9"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.ft \\n(;G \}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.aF 5 \\n(.f "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.aF 5 1 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.aF 1 5 "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.de EX \" start example
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.ta 1i 2i 3i 4i 5i 6i
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.de EE \" end example
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintok \- space separated token stream routines
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.SH SYNOPSIS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "#include <ast.h>"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "void* tokopen(char* string)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "char* tokread(void* tok)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "void tokclose(void* tok)"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "int tokscan(char* string, char** next, const char* format, ...);"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "Sfio_t* tokline(const char* input, int flags, int* line);"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.SH DESCRIPTION
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreturns a pointer to a space separated token stream on the 0 terminated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.LR string .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinreturns a pointer to the next
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinspace separated token in the token stream
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinas returned by
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.LR tokopen .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin0 is returned when no tokens remain.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintemporarily modifies
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinby inserting 0's to terminate each token.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L tokclose
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincloses the token stream and restores
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinto its original state.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinscans the string
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor tokens specified in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.LR format .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinIt is a more forgiving
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.IR sscanf (3).
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "next != 0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen it will point to the next unread character in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinThe number of scanned tokens is returned.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis returned if
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwas not empty and
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfailed to match and tokens.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmatches 0 or more
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincharacters.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinin format eats the remainder of the current line in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.LR string .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"...", '...' and \e\fIcharacter\fP quotes are interpreted.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I carriage-return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis converted to
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.IR newline .
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis equivalent to end of string except when quoted.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I \enewline
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis a line splice.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinprefixes format conversion characters; each conversion character
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincorresponds to a
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinargument following the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinThe format conversions are:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "%hd %d %ld"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[short, int, long] base 10 integer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "%hn %n %ln"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[short, int, long] C-style base integer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "%ho %o %lo"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[short, int, long] base 8 integer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "%hu %u %lu"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[short, int, long] C-style base unsigned integer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinThe next two arguments are a pointer to a
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinargument vector and the maximum number of elements in the vector.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "%hx %x %lx"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin[short, int, long] base 16 integer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindata may also be counted length strings of the form
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin\f5(\fIcount\fP:\fIdata\fP)\fR
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis the number of characters in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinand the terminating
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmay also be a
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinor the data may be
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhich represents the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.IR sfio (3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstream to a file or string that splices
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I \enewline
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininto single lines,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinallows "..." and '...' to quotes to span
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I newlines
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(done by translating quoted
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.IR carriage-return ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinabove converts quoted
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I carriage-return
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.IR newline ),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinand deletes
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.I "# ... newline"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinThis is done by pushing an
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindiscipline onto a string or file stream.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinSeeks are disabled on the resulting stream.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "flags == SF_READ"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis a file name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "flags == SF_STRING"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinis a 0 terminated string;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.L "line != 0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinthen it points to a line count that is initialized to 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinand is incremented for each input line.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin.SH "SEE ALSO"