Mercurial > emacs
comparison src/lread.c @ 9149:fe6b30db719d
(readchar, readchar, unreadchar, read_filtered_event, Fread, read0, read1,
read_list, check_obarray, intern, Fintern, Fintern_soft, oblookup,
init_lread): Use type test macros.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Tue, 27 Sep 1994 04:10:43 +0000 |
parents | 93f3d6f5753c |
children | 5c66d8b65a7c |
comparison
equal
deleted
inserted
replaced
9148:e7ab930bb7eb | 9149:fe6b30db719d |
---|---|
111 { | 111 { |
112 Lisp_Object tem; | 112 Lisp_Object tem; |
113 register struct buffer *inbuffer; | 113 register struct buffer *inbuffer; |
114 register int c, mpos; | 114 register int c, mpos; |
115 | 115 |
116 if (XTYPE (readcharfun) == Lisp_Buffer) | 116 if (BUFFERP (readcharfun)) |
117 { | 117 { |
118 inbuffer = XBUFFER (readcharfun); | 118 inbuffer = XBUFFER (readcharfun); |
119 | 119 |
120 if (BUF_PT (inbuffer) >= BUF_ZV (inbuffer)) | 120 if (BUF_PT (inbuffer) >= BUF_ZV (inbuffer)) |
121 return -1; | 121 return -1; |
122 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, BUF_PT (inbuffer)); | 122 c = *(unsigned char *) BUF_CHAR_ADDRESS (inbuffer, BUF_PT (inbuffer)); |
123 SET_BUF_PT (inbuffer, BUF_PT (inbuffer) + 1); | 123 SET_BUF_PT (inbuffer, BUF_PT (inbuffer) + 1); |
124 | 124 |
125 return c; | 125 return c; |
126 } | 126 } |
127 if (XTYPE (readcharfun) == Lisp_Marker) | 127 if (MARKERP (readcharfun)) |
128 { | 128 { |
129 inbuffer = XMARKER (readcharfun)->buffer; | 129 inbuffer = XMARKER (readcharfun)->buffer; |
130 | 130 |
131 mpos = marker_position (readcharfun); | 131 mpos = marker_position (readcharfun); |
132 | 132 |
152 } | 152 } |
153 #endif | 153 #endif |
154 return c; | 154 return c; |
155 } | 155 } |
156 | 156 |
157 if (XTYPE (readcharfun) == Lisp_String) | 157 if (STRINGP (readcharfun)) |
158 { | 158 { |
159 register int c; | 159 register int c; |
160 /* This used to be return of a conditional expression, | 160 /* This used to be return of a conditional expression, |
161 but that truncated -1 to a char on VMS. */ | 161 but that truncated -1 to a char on VMS. */ |
162 if (read_from_string_index < read_from_string_limit) | 162 if (read_from_string_index < read_from_string_limit) |
183 { | 183 { |
184 if (c == -1) | 184 if (c == -1) |
185 /* Don't back up the pointer if we're unreading the end-of-input mark, | 185 /* Don't back up the pointer if we're unreading the end-of-input mark, |
186 since readchar didn't advance it when we read it. */ | 186 since readchar didn't advance it when we read it. */ |
187 ; | 187 ; |
188 else if (XTYPE (readcharfun) == Lisp_Buffer) | 188 else if (BUFFERP (readcharfun)) |
189 { | 189 { |
190 if (XBUFFER (readcharfun) == current_buffer) | 190 if (XBUFFER (readcharfun) == current_buffer) |
191 SET_PT (point - 1); | 191 SET_PT (point - 1); |
192 else | 192 else |
193 SET_BUF_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1); | 193 SET_BUF_PT (XBUFFER (readcharfun), BUF_PT (XBUFFER (readcharfun)) - 1); |
194 } | 194 } |
195 else if (XTYPE (readcharfun) == Lisp_Marker) | 195 else if (MARKERP (readcharfun)) |
196 XMARKER (readcharfun)->bufpos--; | 196 XMARKER (readcharfun)->bufpos--; |
197 else if (XTYPE (readcharfun) == Lisp_String) | 197 else if (STRINGP (readcharfun)) |
198 read_from_string_index--; | 198 read_from_string_index--; |
199 else if (EQ (readcharfun, Qget_file_char)) | 199 else if (EQ (readcharfun, Qget_file_char)) |
200 ungetc (c, instream); | 200 ungetc (c, instream); |
201 else | 201 else |
202 call1 (readcharfun, make_number (c)); | 202 call1 (readcharfun, make_number (c)); |
235 | 235 |
236 /* Read until we get an acceptable event. */ | 236 /* Read until we get an acceptable event. */ |
237 retry: | 237 retry: |
238 val = read_char (0, 0, 0, Qnil, 0); | 238 val = read_char (0, 0, 0, Qnil, 0); |
239 | 239 |
240 if (XTYPE (val) == Lisp_Buffer) | 240 if (BUFFERP (val)) |
241 goto retry; | 241 goto retry; |
242 | 242 |
243 /* switch-frame events are put off until after the next ASCII | 243 /* switch-frame events are put off until after the next ASCII |
244 character. This is better than signalling an error just because | 244 character. This is better than signalling an error just because |
245 the last characters were typed to a separate minibuffer frame, | 245 the last characters were typed to a separate minibuffer frame, |
254 } | 254 } |
255 | 255 |
256 if (ascii_required) | 256 if (ascii_required) |
257 { | 257 { |
258 /* Convert certain symbols to their ASCII equivalents. */ | 258 /* Convert certain symbols to their ASCII equivalents. */ |
259 if (XTYPE (val) == Lisp_Symbol) | 259 if (SYMBOLP (val)) |
260 { | 260 { |
261 Lisp_Object tem, tem1, tem2; | 261 Lisp_Object tem, tem1, tem2; |
262 tem = Fget (val, Qevent_symbol_element_mask); | 262 tem = Fget (val, Qevent_symbol_element_mask); |
263 if (!NILP (tem)) | 263 if (!NILP (tem)) |
264 { | 264 { |
269 XFASTINT (val) = XINT (tem1) | XINT (Fcar (Fcdr (tem))); | 269 XFASTINT (val) = XINT (tem1) | XINT (Fcar (Fcdr (tem))); |
270 } | 270 } |
271 } | 271 } |
272 | 272 |
273 /* If we don't have a character now, deal with it appropriately. */ | 273 /* If we don't have a character now, deal with it appropriately. */ |
274 if (XTYPE (val) != Lisp_Int) | 274 if (!INTEGERP (val)) |
275 { | 275 { |
276 if (error_nonascii) | 276 if (error_nonascii) |
277 { | 277 { |
278 Vunread_command_events = Fcons (val, Qnil); | 278 Vunread_command_events = Fcons (val, Qnil); |
279 error ("Non-character input-event"); | 279 error ("Non-character input-event"); |
883 #ifndef standalone | 883 #ifndef standalone |
884 if (EQ (readcharfun, Qread_char)) | 884 if (EQ (readcharfun, Qread_char)) |
885 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil); | 885 return Fread_minibuffer (build_string ("Lisp expression: "), Qnil); |
886 #endif | 886 #endif |
887 | 887 |
888 if (XTYPE (readcharfun) == Lisp_String) | 888 if (STRINGP (readcharfun)) |
889 return Fcar (Fread_from_string (readcharfun, Qnil, Qnil)); | 889 return Fcar (Fread_from_string (readcharfun, Qnil, Qnil)); |
890 | 890 |
891 return read0 (readcharfun); | 891 return read0 (readcharfun); |
892 } | 892 } |
893 | 893 |
937 { | 937 { |
938 register Lisp_Object val; | 938 register Lisp_Object val; |
939 char c; | 939 char c; |
940 | 940 |
941 val = read1 (readcharfun); | 941 val = read1 (readcharfun); |
942 if (XTYPE (val) == Lisp_Internal) | 942 if (INTERNALP (val)) |
943 { | 943 { |
944 c = XINT (val); | 944 c = XINT (val); |
945 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (&c, 1), Qnil)); | 945 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (&c, 1), Qnil)); |
946 } | 946 } |
947 | 947 |
1150 Lisp_Object tmp; | 1150 Lisp_Object tmp; |
1151 struct gcpro gcpro1; | 1151 struct gcpro gcpro1; |
1152 | 1152 |
1153 /* Read the string itself. */ | 1153 /* Read the string itself. */ |
1154 tmp = read1 (readcharfun); | 1154 tmp = read1 (readcharfun); |
1155 if (XTYPE (tmp) != Lisp_String) | 1155 if (!STRINGP (tmp)) |
1156 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil)); | 1156 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("#", 1), Qnil)); |
1157 GCPRO1 (tmp); | 1157 GCPRO1 (tmp); |
1158 /* Read the intervals and their properties. */ | 1158 /* Read the intervals and their properties. */ |
1159 while (1) | 1159 while (1) |
1160 { | 1160 { |
1161 Lisp_Object beg, end, plist; | 1161 Lisp_Object beg, end, plist; |
1162 | 1162 |
1163 beg = read1 (readcharfun); | 1163 beg = read1 (readcharfun); |
1164 if (XTYPE (beg) == Lisp_Internal) | 1164 if (INTERNALP (beg)) |
1165 { | 1165 { |
1166 if (XINT (beg) == ')') | 1166 if (XINT (beg) == ')') |
1167 break; | 1167 break; |
1168 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("invalid string property list", 28), Qnil)); | 1168 Fsignal (Qinvalid_read_syntax, Fcons (make_string ("invalid string property list", 28), Qnil)); |
1169 } | 1169 } |
1170 end = read1 (readcharfun); | 1170 end = read1 (readcharfun); |
1171 if (XTYPE (end) == Lisp_Internal) | 1171 if (INTERNALP (end)) |
1172 Fsignal (Qinvalid_read_syntax, | 1172 Fsignal (Qinvalid_read_syntax, |
1173 Fcons (make_string ("invalid string property list", 28), Qnil)); | 1173 Fcons (make_string ("invalid string property list", 28), Qnil)); |
1174 | 1174 |
1175 plist = read1 (readcharfun); | 1175 plist = read1 (readcharfun); |
1176 if (XTYPE (plist) == Lisp_Internal) | 1176 if (INTERNALP (plist)) |
1177 Fsignal (Qinvalid_read_syntax, | 1177 Fsignal (Qinvalid_read_syntax, |
1178 Fcons (make_string ("invalid string property list", 28), Qnil)); | 1178 Fcons (make_string ("invalid string property list", 28), Qnil)); |
1179 Fset_text_properties (beg, end, plist, tmp); | 1179 Fset_text_properties (beg, end, plist, tmp); |
1180 } | 1180 } |
1181 UNGCPRO; | 1181 UNGCPRO; |
1478 while (1) | 1478 while (1) |
1479 { | 1479 { |
1480 GCPRO2 (val, tail); | 1480 GCPRO2 (val, tail); |
1481 elt = read1 (readcharfun); | 1481 elt = read1 (readcharfun); |
1482 UNGCPRO; | 1482 UNGCPRO; |
1483 if (XTYPE (elt) == Lisp_Internal) | 1483 if (INTERNALP (elt)) |
1484 { | 1484 { |
1485 if (flag > 0) | 1485 if (flag > 0) |
1486 { | 1486 { |
1487 if (XINT (elt) == ']') | 1487 if (XINT (elt) == ']') |
1488 return val; | 1488 return val; |
1497 XCONS (tail)->cdr = read0 (readcharfun); | 1497 XCONS (tail)->cdr = read0 (readcharfun); |
1498 else | 1498 else |
1499 val = read0 (readcharfun); | 1499 val = read0 (readcharfun); |
1500 elt = read1 (readcharfun); | 1500 elt = read1 (readcharfun); |
1501 UNGCPRO; | 1501 UNGCPRO; |
1502 if (XTYPE (elt) == Lisp_Internal && XINT (elt) == ')') | 1502 if (INTERNALP (elt) && XINT (elt) == ')') |
1503 return val; | 1503 return val; |
1504 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil)); | 1504 return Fsignal (Qinvalid_read_syntax, Fcons (make_string (". in wrong context", 18), Qnil)); |
1505 } | 1505 } |
1506 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil)); | 1506 return Fsignal (Qinvalid_read_syntax, Fcons (make_string ("] in a list", 11), Qnil)); |
1507 } | 1507 } |
1525 | 1525 |
1526 Lisp_Object | 1526 Lisp_Object |
1527 check_obarray (obarray) | 1527 check_obarray (obarray) |
1528 Lisp_Object obarray; | 1528 Lisp_Object obarray; |
1529 { | 1529 { |
1530 while (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0) | 1530 while (!VECTORP (obarray) || XVECTOR (obarray)->size == 0) |
1531 { | 1531 { |
1532 /* If Vobarray is now invalid, force it to be valid. */ | 1532 /* If Vobarray is now invalid, force it to be valid. */ |
1533 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray; | 1533 if (EQ (Vobarray, obarray)) Vobarray = initial_obarray; |
1534 | 1534 |
1535 obarray = wrong_type_argument (Qvectorp, obarray); | 1535 obarray = wrong_type_argument (Qvectorp, obarray); |
1547 Lisp_Object tem; | 1547 Lisp_Object tem; |
1548 int len = strlen (str); | 1548 int len = strlen (str); |
1549 Lisp_Object obarray; | 1549 Lisp_Object obarray; |
1550 | 1550 |
1551 obarray = Vobarray; | 1551 obarray = Vobarray; |
1552 if (XTYPE (obarray) != Lisp_Vector || XVECTOR (obarray)->size == 0) | 1552 if (!VECTORP (obarray) || XVECTOR (obarray)->size == 0) |
1553 obarray = check_obarray (obarray); | 1553 obarray = check_obarray (obarray); |
1554 tem = oblookup (obarray, str, len); | 1554 tem = oblookup (obarray, str, len); |
1555 if (XTYPE (tem) == Lisp_Symbol) | 1555 if (SYMBOLP (tem)) |
1556 return tem; | 1556 return tem; |
1557 return Fintern ((!NILP (Vpurify_flag) | 1557 return Fintern ((!NILP (Vpurify_flag) |
1558 ? make_pure_string (str, len) | 1558 ? make_pure_string (str, len) |
1559 : make_string (str, len)), | 1559 : make_string (str, len)), |
1560 obarray); | 1560 obarray); |
1574 obarray = check_obarray (obarray); | 1574 obarray = check_obarray (obarray); |
1575 | 1575 |
1576 CHECK_STRING (str, 0); | 1576 CHECK_STRING (str, 0); |
1577 | 1577 |
1578 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size); | 1578 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size); |
1579 if (XTYPE (tem) != Lisp_Int) | 1579 if (!INTEGERP (tem)) |
1580 return tem; | 1580 return tem; |
1581 | 1581 |
1582 if (!NILP (Vpurify_flag)) | 1582 if (!NILP (Vpurify_flag)) |
1583 str = Fpurecopy (str); | 1583 str = Fpurecopy (str); |
1584 sym = Fmake_symbol (str); | 1584 sym = Fmake_symbol (str); |
1585 | 1585 |
1586 ptr = &XVECTOR (obarray)->contents[XINT (tem)]; | 1586 ptr = &XVECTOR (obarray)->contents[XINT (tem)]; |
1587 if (XTYPE (*ptr) == Lisp_Symbol) | 1587 if (SYMBOLP (*ptr)) |
1588 XSYMBOL (sym)->next = XSYMBOL (*ptr); | 1588 XSYMBOL (sym)->next = XSYMBOL (*ptr); |
1589 else | 1589 else |
1590 XSYMBOL (sym)->next = 0; | 1590 XSYMBOL (sym)->next = 0; |
1591 *ptr = sym; | 1591 *ptr = sym; |
1592 return sym; | 1592 return sym; |
1605 obarray = check_obarray (obarray); | 1605 obarray = check_obarray (obarray); |
1606 | 1606 |
1607 CHECK_STRING (str, 0); | 1607 CHECK_STRING (str, 0); |
1608 | 1608 |
1609 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size); | 1609 tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size); |
1610 if (XTYPE (tem) != Lisp_Int) | 1610 if (!INTEGERP (tem)) |
1611 return tem; | 1611 return tem; |
1612 return Qnil; | 1612 return Qnil; |
1613 } | 1613 } |
1614 | 1614 |
1615 Lisp_Object | 1615 Lisp_Object |
1621 int hash; | 1621 int hash; |
1622 int obsize; | 1622 int obsize; |
1623 register Lisp_Object tail; | 1623 register Lisp_Object tail; |
1624 Lisp_Object bucket, tem; | 1624 Lisp_Object bucket, tem; |
1625 | 1625 |
1626 if (XTYPE (obarray) != Lisp_Vector | 1626 if (!VECTORP (obarray) |
1627 || (obsize = XVECTOR (obarray)->size) == 0) | 1627 || (obsize = XVECTOR (obarray)->size) == 0) |
1628 { | 1628 { |
1629 obarray = check_obarray (obarray); | 1629 obarray = check_obarray (obarray); |
1630 obsize = XVECTOR (obarray)->size; | 1630 obsize = XVECTOR (obarray)->size; |
1631 } | 1631 } |
1633 hash = hash_string (ptr, size); | 1633 hash = hash_string (ptr, size); |
1634 hash %= obsize; | 1634 hash %= obsize; |
1635 bucket = XVECTOR (obarray)->contents[hash]; | 1635 bucket = XVECTOR (obarray)->contents[hash]; |
1636 if (XFASTINT (bucket) == 0) | 1636 if (XFASTINT (bucket) == 0) |
1637 ; | 1637 ; |
1638 else if (XTYPE (bucket) != Lisp_Symbol) | 1638 else if (!SYMBOLP (bucket)) |
1639 error ("Bad data in guts of obarray"); /* Like CADR error message */ | 1639 error ("Bad data in guts of obarray"); /* Like CADR error message */ |
1640 else for (tail = bucket; ; XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next)) | 1640 else for (tail = bucket; ; XSET (tail, Lisp_Symbol, XSYMBOL (tail)->next)) |
1641 { | 1641 { |
1642 if (XSYMBOL (tail)->name->size == size && | 1642 if (XSYMBOL (tail)->name->size == size && |
1643 !bcmp (XSYMBOL (tail)->name->data, ptr, size)) | 1643 !bcmp (XSYMBOL (tail)->name->data, ptr, size)) |
1919 !NILP (path_tail); | 1919 !NILP (path_tail); |
1920 path_tail = XCONS (path_tail)->cdr) | 1920 path_tail = XCONS (path_tail)->cdr) |
1921 { | 1921 { |
1922 Lisp_Object dirfile; | 1922 Lisp_Object dirfile; |
1923 dirfile = Fcar (path_tail); | 1923 dirfile = Fcar (path_tail); |
1924 if (XTYPE (dirfile) == Lisp_String) | 1924 if (STRINGP (dirfile)) |
1925 { | 1925 { |
1926 dirfile = Fdirectory_file_name (dirfile); | 1926 dirfile = Fdirectory_file_name (dirfile); |
1927 if (access (XSTRING (dirfile)->data, 0) < 0) | 1927 if (access (XSTRING (dirfile)->data, 0) < 0) |
1928 fprintf (stderr, | 1928 fprintf (stderr, |
1929 "Warning: Lisp directory `%s' does not exist.\n", | 1929 "Warning: Lisp directory `%s' does not exist.\n", |