Mercurial > hg > xemacs-beta
comparison src/data.c @ 169:15872534500d r20-3b11
Import from CVS: tag r20-3b11
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:46:53 +0200 |
parents | 28f395d8dc7a |
children | 929b76928fce |
comparison
equal
deleted
inserted
replaced
168:9851d5c6556e | 169:15872534500d |
---|---|
1242 else | 1242 else |
1243 abort (); | 1243 abort (); |
1244 return build_string (buffer); | 1244 return build_string (buffer); |
1245 } | 1245 } |
1246 | 1246 |
1247 DEFUN ("string-to-number", Fstring_to_number, 1, 1, 0, /* | 1247 static int |
1248 digit_to_number (int character, int base) | |
1249 { | |
1250 int digit; | |
1251 | |
1252 if (character >= '0' && character <= '9') | |
1253 digit = character - '0'; | |
1254 else if (character >= 'a' && character <= 'z') | |
1255 digit = character - 'a' + 10; | |
1256 else if (character >= 'A' && character <= 'Z') | |
1257 digit = character - 'A' + 10; | |
1258 else | |
1259 return -1; | |
1260 | |
1261 if (digit >= base) | |
1262 return -1; | |
1263 else | |
1264 return digit; | |
1265 } | |
1266 | |
1267 DEFUN ("string-to-number", Fstring_to_number, 1, 2, 0, /* | |
1248 Convert STRING to a number by parsing it as a decimal number. | 1268 Convert STRING to a number by parsing it as a decimal number. |
1249 This parses both integers and floating point numbers. | 1269 This parses both integers and floating point numbers. |
1250 It ignores leading spaces and tabs. | 1270 It ignores leading spaces and tabs. |
1251 */ | 1271 |
1252 (string)) | 1272 If BASE, interpret STRING as a number in that base. If BASE isn't |
1253 { | 1273 present, base 10 is used. BASE must be between 2 and 16 (inclusive). |
1254 Lisp_Object value; | 1274 Floating point numbers always use base 10. |
1275 */ | |
1276 (string, base)) | |
1277 { | |
1255 char *p; | 1278 char *p; |
1279 int b; | |
1280 | |
1256 CHECK_STRING (string); | 1281 CHECK_STRING (string); |
1257 | 1282 |
1283 if (NILP (base)) | |
1284 b = 10; | |
1285 else | |
1286 { | |
1287 CHECK_INT (base); | |
1288 b = XINT (base); | |
1289 if (b < 2 || b > 16) | |
1290 Fsignal (Qargs_out_of_range, Fcons (base, Qnil)); | |
1291 } | |
1292 | |
1258 p = (char *) XSTRING_DATA (string); | 1293 p = (char *) XSTRING_DATA (string); |
1294 | |
1259 /* Skip any whitespace at the front of the number. Some versions of | 1295 /* Skip any whitespace at the front of the number. Some versions of |
1260 atoi do this anyway, so we might as well make Emacs lisp consistent. */ | 1296 atoi do this anyway, so we might as well make Emacs lisp consistent. */ |
1261 while (*p == ' ' || *p == '\t') | 1297 while (*p == ' ' || *p == '\t') |
1262 p++; | 1298 p++; |
1263 | 1299 |
1264 #ifdef LISP_FLOAT_TYPE | 1300 #ifdef LISP_FLOAT_TYPE |
1265 if (isfloat_string (p)) | 1301 if (isfloat_string (p)) |
1266 return make_float (atof (p)); | 1302 return make_float (atof (p)); |
1267 #endif /* LISP_FLOAT_TYPE */ | 1303 #endif /* LISP_FLOAT_TYPE */ |
1268 | 1304 |
1269 if (sizeof (int) == sizeof (EMACS_INT)) | 1305 if (XINT(base) == 10) |
1270 XSETINT (value, atoi (p)); | 1306 { |
1271 else if (sizeof (long) == sizeof (EMACS_INT)) | 1307 /* Use the system-provided functions for base 10. */ |
1272 XSETINT (value, atol (p)); | 1308 Lisp_Object value; |
1309 if (sizeof (int) == sizeof (EMACS_INT)) | |
1310 XSETINT (value, atoi (p)); | |
1311 else if (sizeof (long) == sizeof (EMACS_INT)) | |
1312 XSETINT (value, atol (p)); | |
1313 else | |
1314 abort (); | |
1315 return value; | |
1316 } | |
1273 else | 1317 else |
1274 abort (); | 1318 { |
1275 return value; | 1319 int digit, negative = 1; |
1320 EMACS_INT v = 0; | |
1321 | |
1322 if (*p == '-') | |
1323 { | |
1324 negative = -1; | |
1325 p++; | |
1326 } | |
1327 else if (*p == '+') | |
1328 p++; | |
1329 while (1) | |
1330 { | |
1331 digit = digit_to_number (*p++, b); | |
1332 if (digit < 0) | |
1333 break; | |
1334 v = v * b + digit; | |
1335 } | |
1336 return make_int (negative * v); | |
1337 } | |
1276 } | 1338 } |
1277 | 1339 |
1278 enum arithop | 1340 enum arithop |
1279 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin }; | 1341 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin }; |
1280 | 1342 |