This is multival.c in view mode; [Download] [Up]
/* Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa This file is part of GNU Common Lisp, herein referred to as GCL GCL is free software; you can redistribute it and/or modify it under the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by the Free Software Foundation; either version 2, or (at your option) any later version. GCL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with GCL; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* multival.c Multiple Values */ #include "include.h" Lvalues() { if (vs_base == vs_top) vs_base[0] = Cnil; } Lvalues_list() { object endp_temp; object list; check_arg(1); list = vs_base[0]; vs_top = vs_base; while (!endp(list)) { vs_push(MMcar(list)); list = MMcdr(list); } if (vs_top == vs_base) vs_base[0] = Cnil; } Fmultiple_value_list(form) object form; { object endp_temp; object *top = vs_top; if (endp(form)) FEtoo_few_argumentsF(form); if (!endp(MMcdr(form))) FEtoo_many_argumentsF(form); vs_push(Cnil); eval(MMcar(form)); while (vs_base < vs_top) { top[0] = MMcons(vs_top[-1],top[0]); vs_top--; } vs_base = top; vs_top = top+1; } Fmultiple_value_call(form) object form; { object endp_temp; object *top = vs_top; object *top1; object *top2; if (endp(form)) FEtoo_few_argumentsF(form); eval(MMcar(form)); vs_top = top; vs_push(vs_base[0]); form = MMcdr(form); while (!endp(form)) { top1 = vs_top; eval(MMcar(form)); top2 = vs_top; vs_top = top1; while (vs_base < top2) { vs_push(vs_base[0]); vs_base++; } form = MMcdr(form); } vs_base = top+1; super_funcall(top[0]); } Fmultiple_value_prog1(forms) object forms; { object endp_temp; object *top; object *base = vs_top; if (endp(forms)) FEtoo_few_argumentsF(forms); eval(MMcar(forms)); top = vs_top; vs_top=base; while (vs_base < top) { vs_push(vs_base[0]); vs_base++; } top = vs_top; forms = MMcdr(forms); while (!endp(forms)) { eval(MMcar(forms)); vs_top = top; forms = MMcdr(forms); } vs_base = base; vs_top = top; if (vs_base == vs_top) vs_base[0] = Cnil; } init_multival() { make_constant("MULTIPLE-VALUES-LIMIT",make_fixnum(32)); make_function("VALUES",Lvalues); make_function("VALUES-LIST",Lvalues_list); make_special_form("MULTIPLE-VALUE-CALL",Fmultiple_value_call); make_special_form("MULTIPLE-VALUE-PROG1", Fmultiple_value_prog1); make_special_form("MULTIPLE-VALUE-LIST",Fmultiple_value_list); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.