scan.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '" Copyright (c) 2000 Scriptics Corporation.
  5. '"
  6. '" See the file "license.terms" for information on usage and redistribution
  7. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  8. '" 
  9. '" RCS: @(#) $Id: scan.n,v 1.9.2.1 2004/10/27 14:23:58 dkf Exp $
  10. '" 
  11. .so man.macros
  12. .TH scan n 8.4 Tcl "Tcl Built-In Commands"
  13. .BS
  14. '" Note:  do not modify the .SH NAME line immediately below!
  15. .SH NAME
  16. scan - Parse string using conversion specifiers in the style of sscanf
  17. .SH SYNOPSIS
  18. fBscan fIstring format fR?fIvarName varName ...fR?
  19. .BE
  20. .SH INTRODUCTION
  21. .PP
  22. This command parses fields from an input string in the same fashion as the
  23. ANSI C fBsscanffR procedure and returns a count of the number of
  24. conversions performed, or -1 if the end of the input string is reached
  25. before any conversions have been performed.  fIStringfR gives the input
  26. to be parsed and fIformatfR indicates how to parse it, using fB%fR
  27. conversion specifiers as in fBsscanffR.  Each fIvarNamefR gives the
  28. name of a variable; when a field is scanned from fIstringfR the result is
  29. converted back into a string and assigned to the corresponding variable.
  30. If no fIvarNamefR variables are specified, then fBscanfR works in an
  31. inline manner, returning the data that would otherwise be stored in the
  32. variables as a list.  In the inline case, an empty string is returned when
  33. the end of the input string is reached before any conversions have been
  34. performed.
  35. .SH "DETAILS ON SCANNING"
  36. .PP
  37. fBScanfR operates by scanning fIstringfR and fIformatfR together.
  38. If the next character in fIformatfR is a blank or tab then it
  39. matches any number of white space characters in fIstringfR (including
  40. zero).
  41. Otherwise, if it isn't a fB%fR character then it 
  42. must match the next character of fIstringfR.
  43. When a fB%fR is encountered in fIformatfR, it indicates
  44. the start of a conversion specifier.
  45. .VS 8.4
  46. A conversion specifier contains up to four fields after the fB%fR:
  47. a fB*fR, which indicates that the converted value is to be discarded 
  48. instead of assigned to a variable; a XPG3 position specifier; a number
  49. indicating a maximum field width; a field size modifier; and a
  50. conversion character.
  51. .VE 8.4
  52. All of these fields are optional except for the conversion character.
  53. The fields that are present must appear in the order given above.
  54. .PP
  55. When fBscanfR finds a conversion specifier in fIformatfR, it
  56. first skips any white-space characters in fIstringfR (unless the
  57. specifier is fB[fR or fBcfR).
  58. Then it converts the next input characters according to the 
  59. conversion specifier and stores the result in the variable given
  60. by the next argument to fBscanfR.
  61. .PP
  62. If the fB%fR is followed by a decimal number and a fB$fR, as in
  63. ``fB%2$dfR'', then the variable to use is not taken from the next
  64. sequential argument.  Instead, it is taken from the argument indicated
  65. by the number, where 1 corresponds to the first fIvarNamefR.  If
  66. there are any positional specifiers in fIformatfR then all of the
  67. specifiers must be positional.  Every fIvarNamefR on the argument
  68. list must correspond to exactly one conversion specifier or an error
  69. is generated, or in the inline case, any position can be specified
  70. at most once and the empty positions will be filled in with empty strings.
  71. .PP
  72. The following conversion characters are supported:
  73. .TP 10
  74. fBdfR
  75. The input field must be a decimal integer.
  76. It is read in and the value is stored in the variable as a decimal string.
  77. .VS 8.4
  78. If the fBlfR or fBLfR field size modifier is given, the scanned
  79. value will have an internal representation that is at least 64-bits in
  80. size.
  81. .VE 8.4
  82. .TP 10
  83. fBofR
  84. The input field must be an octal integer. It is read in and the 
  85. value is stored in the variable as a decimal string.
  86. .VS 8.4
  87. If the fBlfR or fBLfR field size modifier is given, the scanned
  88. value will have an internal representation that is at least 64-bits in
  89. size.
  90. If the value exceeds MAX_INT (017777777777 on platforms using 32-bit
  91. integers when the fBlfR and fBLfR modifiers are not given), it
  92. will be truncated to a signed integer.  Hence, 037777777777 will
  93. appear as -1 on a 32-bit machine by default.
  94. .VE 8.4
  95. .TP 10
  96. fBxfR
  97. The input field must be a hexadecimal integer. It is read in 
  98. and the value is stored in the variable as a decimal string.
  99. .VS 8.4
  100. If the fBlfR or fBLfR field size modifier is given, the scanned
  101. value will have an internal representation that is at least 64-bits in
  102. size.
  103. If the value exceeds MAX_INT (0x7FFFFFFF on platforms using 32-bit
  104. integers when the fBlfR and fBLfR modifiers are not given), it
  105. will be truncated to a signed integer.  Hence, 0xFFFFFFFF will appear
  106. as -1 on a 32-bit machine.
  107. .VE 8.4
  108. .TP 10
  109. fBufR
  110. The input field must be a decimal integer.  The value is stored in the
  111. variable as an unsigned decimal integer string.
  112. .VS 8.4
  113. If the fBlfR or fBLfR field size modifier is given, the scanned
  114. value will have an internal representation that is at least 64-bits in
  115. size.
  116. .VE 8.4
  117. .TP 10
  118. fBifR 
  119. The input field must be an integer.  The base (i.e. decimal, octal, or
  120. hexadecimal) is determined in the same fashion as described in
  121. fBexprfR.  The value is stored in the variable as a decimal string.
  122. .VS 8.4
  123. If the fBlfR or fBLfR field size modifier is given, the scanned
  124. value will have an internal representation that is at least 64-bits in
  125. size.
  126. .VE 8.4
  127. .TP 10
  128. fBcfR
  129. A single character is read in and its binary value is stored in 
  130. the variable as a decimal string.
  131. Initial white space is not skipped in this case, so the input
  132. field may be a white-space character.
  133. This conversion is different from the ANSI standard in that the
  134. input field always consists of a single character and no field
  135. width may be specified.
  136. .TP 10
  137. fBsfR
  138. The input field consists of all the characters up to the next 
  139. white-space character; the characters are copied to the variable.
  140. .TP 10
  141. fBefR or fBffR or fBgfR
  142. The input field must be a floating-point number consisting 
  143. of an optional sign, a string of decimal digits possibly
  144. containing a decimal point, and an optional exponent consisting 
  145. of an fBefR or fBEfR followed by an optional sign and a string of 
  146. decimal digits.
  147. It is read in and stored in the variable as a floating-point string.
  148. .TP 10
  149. fB[fIcharsfB]fR
  150. The input field consists of any number of characters in 
  151. fIcharsfR.
  152. The matching string is stored in the variable.
  153. If the first character between the brackets is a fB]fR then
  154. it is treated as part of fIcharsfR rather than the closing
  155. bracket for the set.
  156. If fIcharsfR
  157. contains a sequence of the form fIafB-fIbfR then any
  158. character between fIafR and fIbfR (inclusive) will match.
  159. If the first or last character between the brackets is a fB-fR, then
  160. it is treated as part of fIcharsfR rather than indicating a range.
  161. .TP 10
  162. fB[^fIcharsfB]fR
  163. The input field consists of any number of characters not in 
  164. fIcharsfR.
  165. The matching string is stored in the variable.
  166. If the character immediately following the fB^fR is a fB]fR then it is 
  167. treated as part of the set rather than the closing bracket for 
  168. the set.
  169. If fIcharsfR
  170. contains a sequence of the form fIafB-fIbfR then any
  171. character between fIafR and fIbfR (inclusive) will be excluded
  172. from the set.
  173. If the first or last character between the brackets is a fB-fR, then
  174. it is treated as part of fIcharsfR rather than indicating a range.
  175. .TP 10
  176. fBnfR
  177. No input is consumed from the input string.  Instead, the total number
  178. of characters scanned from the input string so far is stored in the variable.
  179. .LP
  180. The number of characters read from the input for a conversion is the
  181. largest number that makes sense for that particular conversion (e.g.
  182. as many decimal digits as possible for fB%dfR, as 
  183. many octal digits as possible for fB%ofR, and so on).
  184. The input field for a given conversion terminates either when a
  185. white-space character is encountered or when the maximum field 
  186. width has been reached, whichever comes first.
  187. If a fB*fR is present in the conversion specifier 
  188. then no variable is assigned and the next scan argument is not consumed.
  189. .SH "DIFFERENCES FROM ANSI SSCANF"
  190. .PP
  191. The behavior of the fBscanfR command is the same as the behavior of
  192. the ANSI C fBsscanffR procedure except for the following differences:
  193. .IP [1]
  194. fB%pfR conversion specifier is not currently supported.
  195. .IP [2]
  196. For fB%cfR conversions a single character value is
  197. converted to a decimal string, which is then assigned to the
  198. corresponding fIvarNamefR;
  199. no field width may be specified for this conversion.
  200. .IP [3]
  201. .VS 8.4
  202. The fBhfR modifier is always ignored and the fBlfR and fBLfR
  203. modifiers are ignored when converting real values (i.e. type
  204. fBdoublefR is used for the internal representation).
  205. .VE 8.4
  206. .IP [4]
  207. If the end of the input string is reached before any conversions have been
  208. performed and no variables are given, an empty string is returned.
  209. .SH EXAMPLES
  210. Parse a simple color specification of the form fI#RRGGBBfR using
  211. hexadecimal conversions with field sizes:
  212. .CS
  213. set string "#08D03F"
  214. fBscanfR $string "#%2x%2x%2x" r g b
  215. .CE
  216. .PP
  217. Parse a fIHH:MMfR time string, noting that this avoids problems with
  218. octal numbers by forcing interpretation as decimals (if we did not
  219. care, we would use the fB%ifR conversion instead):
  220. .CS
  221. set string "08:08"   ;# *Not* octal!
  222. if {[fBscanfR $string "%d:%d" hours minutes] != 2} {
  223.    error "not a valid time string"
  224. }
  225. # We have to understand numeric ranges ourselves...
  226. if {$minutes < 0 || $minutes > 59} {
  227.    error "invalid number of minutes"
  228. }
  229. .CE
  230. .PP
  231. Break a string up into sequences of non-whitespace characters (note
  232. the use of the fB%nfR conversion so that we get skipping over
  233. leading whitespace correct):
  234. .CS
  235. set string " a string {with braced words} + leading space "
  236. set words {}
  237. while {[fBscanfR $string %s%n word length] == 2} {
  238.    lappend words $word
  239.    set string [string range $string $length end]
  240. }
  241. .CE
  242. .PP
  243. Parse a simple coordinate string, checking that it is complete by
  244. looking for the terminating character explicitly:
  245. .CS
  246. set string "(5.2,-4e-2)"
  247. # Note that the spaces before the literal parts of
  248. # the scan pattern are significant, and that ")" is
  249. # the Unicode character \u0029
  250. if {
  251.    [fBscanfR $string " (%f ,%f %c" x y last] != 3
  252.    || $last != 0x0029
  253. } then {
  254.    error "invalid coordinate string"
  255. }
  256. puts "X=$x, Y=$y"
  257. .CE
  258. .SH "SEE ALSO"
  259. format(n), sscanf(3)
  260. .SH KEYWORDS
  261. conversion specifier, parse, scan