ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/microscheme/scheme.c
(Generate patch)

Comparing microscheme/scheme.c (file contents):
Revision 1.56 by root, Tue Dec 1 03:44:32 2015 UTC vs.
Revision 1.57 by root, Tue Dec 1 04:57:49 2015 UTC

1475 return S_F; 1475 return S_F;
1476 else if (*name == '\\') /* #\w (character) */ 1476 else if (*name == '\\') /* #\w (character) */
1477 { 1477 {
1478 int c; 1478 int c;
1479 1479
1480 // TODO: optimise
1480 if (stricmp (name + 1, "space") == 0) 1481 if (stricmp (name + 1, "space") == 0)
1481 c = ' '; 1482 c = ' ';
1482 else if (stricmp (name + 1, "newline") == 0) 1483 else if (stricmp (name + 1, "newline") == 0)
1483 c = '\n'; 1484 c = '\n';
1484 else if (stricmp (name + 1, "return") == 0) 1485 else if (stricmp (name + 1, "return") == 0)
1485 c = '\r'; 1486 c = '\r';
1486 else if (stricmp (name + 1, "tab") == 0) 1487 else if (stricmp (name + 1, "tab") == 0)
1487 c = '\t'; 1488 c = '\t';
1489 else if (stricmp (name + 1, "alarm") == 0)
1490 c = 0x07;
1491 else if (stricmp (name + 1, "backspace") == 0)
1492 c = 0x08;
1493 else if (stricmp (name + 1, "escape") == 0)
1494 c = 0x1b;
1495 else if (stricmp (name + 1, "delete") == 0)
1496 c = 0x7f;
1497 else if (stricmp (name + 1, "null") == 0)
1498 c = 0;
1488 else if (name[1] == 'x' && name[2] != 0) 1499 else if (name[1] == 'x' && name[2] != 0)
1489 { 1500 {
1490 long c1 = strtol (name + 2, 0, 16); 1501 long c1 = strtol (name + 2, 0, 16);
1491 1502
1492 if (0 <= c1 && c1 <= UCHAR_MAX) 1503 if (0 <= c1 && c1 <= UCHAR_MAX)
2175 case '7': 2186 case '7':
2176 state = st_oct1; 2187 state = st_oct1;
2177 c1 = c - '0'; 2188 c1 = c - '0';
2178 break; 2189 break;
2179 2190
2191 case 'a': *p++ = '\a'; state = st_ok; break;
2192 case 'n': *p++ = '\n'; state = st_ok; break;
2193 case 'r': *p++ = '\r'; state = st_ok; break;
2194 case 't': *p++ = '\t'; state = st_ok; break;
2195
2196 //TODO: \whitespace eol whitespace
2197
2198 //TODO: x should end in ;, not two-digit hex
2180 case 'x': 2199 case 'x':
2181 case 'X': 2200 case 'X':
2182 state = st_x1; 2201 state = st_x1;
2183 c1 = 0; 2202 c1 = 0;
2184 break;
2185
2186 case 'n':
2187 *p++ = '\n';
2188 state = st_ok;
2189 break;
2190
2191 case 't':
2192 *p++ = '\t';
2193 state = st_ok;
2194 break;
2195
2196 case 'r':
2197 *p++ = '\r';
2198 state = st_ok;
2199 break; 2203 break;
2200 2204
2201 default: 2205 default:
2202 *p++ = c; 2206 *p++ = c;
2203 state = st_ok; 2207 state = st_ok;
4374 memcpy (pos, strvalue (car (x)), strlength (car (x))); 4378 memcpy (pos, strvalue (car (x)), strlength (car (x)));
4375 4379
4376 s_return (newstr); 4380 s_return (newstr);
4377 } 4381 }
4378 4382
4379 case OP_SUBSTR: /* substring */ 4383 case OP_STRING_COPY: /* substring/string-copy */
4380 { 4384 {
4381 char *str = strvalue (x); 4385 char *str = strvalue (x);
4382 int index0 = ivalue_unchecked (cadr (args)); 4386 int index0 = cadr (args) == NIL ? 0 : ivalue_unchecked (cadr (args));
4383 int index1; 4387 int index1;
4384 int len; 4388 int len;
4385 4389
4386 if (index0 > strlength (x)) 4390 if (index0 > strlength (x))
4387 Error_1 ("substring: start out of bounds:", cadr (args)); 4391 Error_1 ("string->copy: start out of bounds:", cadr (args));
4388 4392
4389 if (cddr (args) != NIL) 4393 if (cddr (args) != NIL)
4390 { 4394 {
4391 index1 = ivalue_unchecked (caddr (args)); 4395 index1 = ivalue_unchecked (caddr (args));
4392 4396
4393 if (index1 > strlength (x) || index1 < index0) 4397 if (index1 > strlength (x) || index1 < index0)
4394 Error_1 ("substring: end out of bounds:", caddr (args)); 4398 Error_1 ("string->copy: end out of bounds:", caddr (args));
4395 } 4399 }
4396 else 4400 else
4397 index1 = strlength (x); 4401 index1 = strlength (x);
4398 4402
4399 len = index1 - index0; 4403 len = index1 - index0;
4400 x = mk_empty_string (SCHEME_A_ len, ' '); 4404 x = mk_counted_string (SCHEME_A_ str + index0, len);
4401 memcpy (strvalue (x), str + index0, len);
4402 strvalue (x)[len] = 0;
4403 4405
4404 s_return (x); 4406 s_return (x);
4405 } 4407 }
4406 4408
4407 case OP_VECTOR: /* vector */ 4409 case OP_VECTOR: /* vector */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines