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