mirror of
https://github.com/Interlisp/maiko.git
synced 2026-05-03 23:09:34 +00:00
Reorganize cdr implementation to move error test to front, early check for (cdr nil), reduce number of else clauses, reduce indentation.
This commit is contained in:
@@ -97,39 +97,28 @@ LispPTR cdr(register LispPTR datum)
|
|||||||
register DLword cdr_code;
|
register DLword cdr_code;
|
||||||
register ConsCell *temp;
|
register ConsCell *temp;
|
||||||
|
|
||||||
|
if (datum == NIL_PTR) return (NIL_PTR);
|
||||||
|
if (!Listp(datum)) error("cdr : ARG not list");
|
||||||
|
|
||||||
datum68k = (ConsCell *)(Addr68k_from_LADDR(datum));
|
datum68k = (ConsCell *)(Addr68k_from_LADDR(datum));
|
||||||
cdr_code = datum68k->cdr_code;
|
cdr_code = datum68k->cdr_code;
|
||||||
|
|
||||||
if (Listp(datum)) {
|
if (cdr_code == CDR_NIL) return (NIL_PTR); /* cdr is nil */
|
||||||
if (cdr_code == CDR_NIL)
|
if ((cdr_code & CDR_ONPAGE) != 0) /* cdr-samepage */
|
||||||
return (NIL_PTR); /* cdr is nil */
|
|
||||||
|
|
||||||
else if ((cdr_code & CDR_ONPAGE) != 0) /* cdr-samepage */
|
|
||||||
#ifdef NEWCDRCODING
|
#ifdef NEWCDRCODING
|
||||||
return (datum + ((cdr_code & 7) << 1));
|
return (datum + ((cdr_code & 7) << 1));
|
||||||
#else
|
#else
|
||||||
return (POINTER_PAGEBASE(datum) + ((cdr_code & 127) << 1));
|
return (POINTER_PAGEBASE(datum) + ((cdr_code & 127) << 1));
|
||||||
#endif /* NEWCDRCODING */
|
#endif /* NEWCDRCODING */
|
||||||
else if (cdr_code == CDR_INDIRECT) /* cdr_code > CDR_ONPAGE */
|
if (cdr_code == CDR_INDIRECT) /* cdr_code > CDR_ONPAGE cdr-indirect */
|
||||||
/* cdr-indirect */
|
return (cdr((LispPTR)(datum68k->car_field)));
|
||||||
return (cdr((LispPTR)(datum68k->car_field)));
|
/* cdr isn't a CONS, but is stored on this page. */
|
||||||
|
|
||||||
else {
|
|
||||||
/* cdr isn't a CONS, but is stored on this page. */
|
|
||||||
#ifdef NEWCDRCODING
|
#ifdef NEWCDRCODING
|
||||||
temp = (ConsCell *)(Addr68k_from_LADDR(datum + (cdr_code << 1)));
|
temp = (ConsCell *)(Addr68k_from_LADDR(datum + (cdr_code << 1)));
|
||||||
#else
|
#else
|
||||||
temp = (ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(datum) + (cdr_code << 1)));
|
temp = (ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(datum) + (cdr_code << 1)));
|
||||||
#endif /* NEWCDRCODING */
|
#endif /* NEWCDRCODING */
|
||||||
return ((LispPTR)temp->car_field);
|
return ((LispPTR)temp->car_field);
|
||||||
}
|
|
||||||
} else if (datum == NIL_PTR)
|
|
||||||
return (NIL_PTR);
|
|
||||||
|
|
||||||
/**** We assume CAR/CDRERR is CDR ****************/
|
|
||||||
else
|
|
||||||
error("cdr : ARG not list");
|
|
||||||
|
|
||||||
} /* end of cdr */
|
} /* end of cdr */
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
@@ -366,39 +355,29 @@ LispPTR N_OP_cdr(register LispPTR tos) {
|
|||||||
register ConsCell *datum68k;
|
register ConsCell *datum68k;
|
||||||
register DLword cdr_code;
|
register DLword cdr_code;
|
||||||
|
|
||||||
|
if (tos == NIL_PTR) return (tos);
|
||||||
|
if (!Listp(tos)) {
|
||||||
|
ERROR_EXIT(tos);
|
||||||
|
}
|
||||||
|
|
||||||
datum68k = (ConsCell *)(Addr68k_from_LADDR(tos));
|
datum68k = (ConsCell *)(Addr68k_from_LADDR(tos));
|
||||||
cdr_code = datum68k->cdr_code;
|
cdr_code = datum68k->cdr_code;
|
||||||
|
|
||||||
if (Listp(tos)) {
|
if (cdr_code == CDR_NIL) return (NIL_PTR); /* cdr-nil */
|
||||||
if (cdr_code == CDR_NIL)
|
if (cdr_code > CDR_ONPAGE) /* cdr-samepage */
|
||||||
return (NIL_PTR); /* cdr-nil */
|
|
||||||
|
|
||||||
else if (cdr_code > CDR_ONPAGE) /* cdr-samepage */
|
|
||||||
#ifdef NEWCDRCODING
|
#ifdef NEWCDRCODING
|
||||||
return (tos + ((cdr_code & 7) << 1));
|
return (tos + ((cdr_code & 7) << 1));
|
||||||
#else
|
#else
|
||||||
return (POINTER_PAGEBASE(tos) + ((cdr_code & 127) << 1));
|
return (POINTER_PAGEBASE(tos) + ((cdr_code & 127) << 1));
|
||||||
#endif /*NEWCDRCODING */
|
#endif /*NEWCDRCODING */
|
||||||
else if (cdr_code == CDR_INDIRECT) /* cdr_code < CDR_ONPAGE */
|
if (cdr_code == CDR_INDIRECT) /* cdr-indirect */
|
||||||
/* cdr-indirect */
|
|
||||||
return (cdr((LispPTR)(datum68k->car_field)));
|
return (cdr((LispPTR)(datum68k->car_field)));
|
||||||
|
/* cdr-differentpage */
|
||||||
else {
|
|
||||||
/* cdr-differentpage */
|
|
||||||
|
|
||||||
#ifdef NEWCDRCODING
|
#ifdef NEWCDRCODING
|
||||||
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(tos + (cdr_code << 1))))->car_field);
|
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(tos + (cdr_code << 1))))->car_field);
|
||||||
#else
|
#else
|
||||||
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(tos) + (cdr_code << 1))))
|
return ((LispPTR)((ConsCell *)(Addr68k_from_LADDR(POINTER_PAGEBASE(tos) + (cdr_code << 1))))->car_field);
|
||||||
->car_field);
|
|
||||||
#endif /*NEWCDRCODING */
|
#endif /*NEWCDRCODING */
|
||||||
}
|
|
||||||
} else if (tos == NIL_PTR)
|
|
||||||
return (tos);
|
|
||||||
else {
|
|
||||||
ERROR_EXIT(tos);
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* end of N_OP_cdr */
|
} /* end of N_OP_cdr */
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|||||||
Reference in New Issue
Block a user