|
|
1.1 root 1: /*
2: * tclGet.c --
3: *
4: * This file contains procedures to convert strings into
5: * other forms, like integers or floating-point numbers or
6: * booleans, doing syntax checking along the way.
7: *
8: * Copyright 1990-1991 Regents of the University of California
9: * Permission to use, copy, modify, and distribute this
10: * software and its documentation for any purpose and without
11: * fee is hereby granted, provided that the above copyright
12: * notice appear in all copies. The University of California
13: * makes no representations about the suitability of this
14: * software for any purpose. It is provided "as is" without
15: * express or implied warranty.
16: */
17:
18: #ifndef lint
19: static char rcsid[] = "$Header: /user6/ouster/tcl/RCS/tclGet.c,v 1.11 92/02/29 16:13:14 ouster Exp $ SPRITE (Berkeley)";
20: #endif /* not lint */
21:
22: #include "tclint.h"
23:
24: /*
25: *----------------------------------------------------------------------
26: *
27: * Tcl_GetInt --
28: *
29: * Given a string, produce the corresponding integer value.
30: *
31: * Results:
32: * The return value is normally TCL_OK; in this case *intPtr
33: * will be set to the integer value equivalent to string. If
34: * string is improperly formed then TCL_ERROR is returned and
35: * an error message will be left in interp->result.
36: *
37: * Side effects:
38: * None.
39: *
40: *----------------------------------------------------------------------
41: */
42:
43: int
44: Tcl_GetInt(interp, string, intPtr)
45: Tcl_Interp *interp; /* Interpreter to use for error reporting. */
46: char *string; /* String containing a (possibly signed)
47: * integer in a form acceptable to strtol. */
48: int *intPtr; /* Place to store converted result. */
49: {
50: char *end;
51: int i;
52:
53: i = strtol(string, &end, 0);
54: while ((*end != '\0') && isspace(*end)) {
55: end++;
56: }
57: if ((end == string) || (*end != 0)) {
58: Tcl_AppendResult(interp, "expected integer but got \"", string,
59: "\"", (char *) NULL);
60: return TCL_ERROR;
61: }
62: *intPtr = i;
63: return TCL_OK;
64: }
65:
66: /*
67: *----------------------------------------------------------------------
68: *
69: * Tcl_GetDouble --
70: *
71: * Given a string, produce the corresponding double-precision
72: * floating-point value.
73: *
74: * Results:
75: * The return value is normally TCL_OK; in this case *doublePtr
76: * will be set to the double-precision value equivalent to string.
77: * If string is improperly formed then TCL_ERROR is returned and
78: * an error message will be left in interp->result.
79: *
80: * Side effects:
81: * None.
82: *
83: *----------------------------------------------------------------------
84: */
85:
86: int
87: Tcl_GetDouble(interp, string, doublePtr)
88: Tcl_Interp *interp; /* Interpreter to use for error reporting. */
89: char *string; /* String containing a floating-point number
90: * in a form acceptable to strtod. */
91: double *doublePtr; /* Place to store converted result. */
92: {
93: char *end;
94: double d;
95:
96: d = strtod(string, &end);
97: while ((*end != '\0') && isspace(*end)) {
98: end++;
99: }
100: if ((end == string) || (*end != 0)) {
101: Tcl_AppendResult(interp, "expected floating-point number but got \"",
102: string, "\"", (char *) NULL);
103: return TCL_ERROR;
104: }
105: *doublePtr = d;
106: return TCL_OK;
107: }
108:
109: /*
110: *----------------------------------------------------------------------
111: *
112: * Tcl_GetBoolean --
113: *
114: * Given a string, return a 0/1 boolean value corresponding
115: * to the string.
116: *
117: * Results:
118: * The return value is normally TCL_OK; in this case *boolPtr
119: * will be set to the 0/1 value equivalent to string. If
120: * string is improperly formed then TCL_ERROR is returned and
121: * an error message will be left in interp->result.
122: *
123: * Side effects:
124: * None.
125: *
126: *----------------------------------------------------------------------
127: */
128:
129: int
130: Tcl_GetBoolean(interp, string, boolPtr)
131: Tcl_Interp *interp; /* Interpreter to use for error reporting. */
132: char *string; /* String containing a boolean number
133: * specified either as 1/0 or true/false or
134: * yes/no. */
135: int *boolPtr; /* Place to store converted result, which
136: * will be 0 or 1. */
137: {
138: char c;
139: char lowerCase[10];
140: int i, length;
141:
142: /*
143: * Convert the input string to all lower-case.
144: */
145:
146: for (i = 0; i < 9; i++) {
147: c = string[i];
148: if (c == 0) {
149: break;
150: }
151: if ((c >= 'A') && (c <= 'Z')) {
152: c += 'a' - 'A';
153: }
154: lowerCase[i] = c;
155: }
156: lowerCase[i] = 0;
157:
158: length = strlen(lowerCase);
159: c = lowerCase[0];
160: if ((c == '0') && (lowerCase[1] == '\0')) {
161: *boolPtr = 0;
162: } else if ((c == '1') && (lowerCase[1] == '\0')) {
163: *boolPtr = 1;
164: } else if ((c == 'y') && (strncmp(lowerCase, "yes", length) == 0)) {
165: *boolPtr = 1;
166: } else if ((c == 'n') && (strncmp(lowerCase, "no", length) == 0)) {
167: *boolPtr = 0;
168: } else if ((c == 't') && (strncmp(lowerCase, "true", length) == 0)) {
169: *boolPtr = 1;
170: } else if ((c == 'f') && (strncmp(lowerCase, "false", length) == 0)) {
171: *boolPtr = 0;
172: } else if ((c == 'o') && (length >= 2)) {
173: if (strncmp(lowerCase, "on", length) == 0) {
174: *boolPtr = 1;
175: } else if (strncmp(lowerCase, "off", length) == 0) {
176: *boolPtr = 0;
177: }
178: } else {
179: Tcl_AppendResult(interp, "expected boolean value but got \"",
180: string, "\"", (char *) NULL);
181: return TCL_ERROR;
182: }
183: return TCL_OK;
184: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.