From 3f07f7d0137a757f1908805f809ddcba8ba4c21e Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sun, 19 Jul 1998 06:48:50 +0000 Subject: * mig: Subdirectory removed, now in separate dist. --- ChangeLog | 88 +- mig/ChangeLog | 163 ---- mig/alloc.h | 34 - mig/boolean.h | 38 - mig/cpu.sym | 58 -- mig/error.c | 91 -- mig/error.h | 61 -- mig/global.c | 94 -- mig/global.h | 77 -- mig/header.c | 210 ----- mig/lexxer.c | 2518 ------------------------------------------------------ mig/lexxer.h | 33 - mig/lexxer.l | 269 ------ mig/message.h | 37 - mig/mig.sh | 95 -- mig/mig_string.h | 49 -- mig/migcom.c | 298 ------- mig/parser.c | 1700 ------------------------------------ mig/parser.h | 87 -- mig/parser.y | 671 --------------- mig/routine.c | 1334 ----------------------------- mig/routine.h | 401 --------- mig/server.c | 1322 ---------------------------- mig/statement.c | 48 -- mig/statement.h | 65 -- mig/string.c | 79 -- mig/type.c | 918 -------------------- mig/type.h | 218 ----- mig/user.c | 1332 ----------------------------- mig/utils.c | 417 --------- mig/utils.h | 76 -- mig/vprint.c | 433 ---------- mig/write.h | 41 - 33 files changed, 46 insertions(+), 13309 deletions(-) delete mode 100644 mig/ChangeLog delete mode 100644 mig/alloc.h delete mode 100644 mig/boolean.h delete mode 100644 mig/cpu.sym delete mode 100644 mig/error.c delete mode 100644 mig/error.h delete mode 100644 mig/global.c delete mode 100644 mig/global.h delete mode 100644 mig/header.c delete mode 100644 mig/lexxer.c delete mode 100644 mig/lexxer.h delete mode 100644 mig/lexxer.l delete mode 100644 mig/message.h delete mode 100644 mig/mig.sh delete mode 100644 mig/mig_string.h delete mode 100644 mig/migcom.c delete mode 100644 mig/parser.c delete mode 100644 mig/parser.h delete mode 100644 mig/parser.y delete mode 100644 mig/routine.c delete mode 100644 mig/routine.h delete mode 100644 mig/server.c delete mode 100644 mig/statement.c delete mode 100644 mig/statement.h delete mode 100644 mig/string.c delete mode 100644 mig/type.c delete mode 100644 mig/type.h delete mode 100644 mig/user.c delete mode 100644 mig/utils.c delete mode 100644 mig/utils.h delete mode 100644 mig/vprint.c delete mode 100644 mig/write.h diff --git a/ChangeLog b/ChangeLog index ca6069b..b6bfbed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +1998-07-19 Roland McGrath + + * mig: Subdirectory removed, now in separate dist. + Fri Apr 24 14:24:15 1998 Thomas Bushnell, n/BSG * i386/i386/pcb.c (thread_setstatus): Set STATE before validating @@ -22,7 +26,7 @@ Wed Aug 20 16:05:19 1997 Thomas Bushnell, n/BSG * include/mach/task_info.h: New member `creation_time'. * kern/task.c (task_create): Set creation time stamp. (task_info) [TASK_BASIC_INFO]: Fill in new creation time field. - Carefully preserve compatibility with old callers. + Carefully preserve compatibility with old callers. * kern/mach_clock.c (record_time_stamp): New function. * kern/time_out.h (record_time_stamp): Add prototype. @@ -67,7 +71,7 @@ Fri Aug 1 16:15:33 1997 Thomas Bushnell, n/BSG if PC sampling is configured: MACH_PCSAMPLE, not MACH_SAMPLE. * i386/i386/locore.S (discover_x86_cpu_type): Comment out routine - for now. + for now. * i386/i386at/model_dep.c (c_boot_entry): Comment out use of discover_x86_cpu_type for now. @@ -96,7 +100,7 @@ Thu Jun 26 13:48:31 1997 Thomas Bushnell, n/BSG * i386/i386/locore.S (discover_x86_cpu_type): New function. * i386/i386at/model_dep.c (c_boot_entry): Fill in cpu type in MACHINE_SLOT using new function. - + * include/mach/machine.h (CPU_TYPE_I486, CPU_TYPE_PENTIUM, CPU_TYPE_PENTIUMPRO, CPU_TYPE_POWERPC): New CPU types. These conform to current OSF Mach values, but note that some of the @@ -110,7 +114,7 @@ Mon Jun 16 12:14:17 1997 Thomas Bushnell, n/BSG Thu Jun 12 18:08:29 1997 Thomas Bushnell, n/BSG Version 1.1.3 released. - + * version.c (version): Update to 1.1.3. Wed Jun 11 20:16:47 1997 Thomas Bushnell, n/BSG @@ -121,21 +125,21 @@ Wed Jun 11 20:16:47 1997 Thomas Bushnell, n/BSG Tue Jun 10 13:33:37 1997 Thomas Bushnell, n/BSG Version 1.1.2 released. - + * Makefile.in (install): Install cross-migcom as `migcom', not as - `mig'. + `mig'. * i386/Makefrag (objfiles += $(device_drivers)): Sort $(device_drivers) before adding to objfiles in order to remove - duplicates. + duplicates. Mon Jun 9 22:14:09 1997 Thomas Bushnell, n/BSG * i386/Drivers.in: Fix typos apt.o -> atp.o; 3c403.o -> 3c503.o. - + * Drivers.macros (AC_DRIVER): Test the class selected flag - correctly. - + correctly. + Mon May 26 14:33:19 1997 Thomas Bushnell, n/BSG * version.c (version): Update to version 1.1.2. @@ -147,16 +151,16 @@ Fri May 23 10:08:48 1997 Thomas Bushnell, n/BSG * Makefile.in (topfiles): Add aclocal.m4. Reported by Marcus G. Daniels (marcus@cathcart.sysc.pdx.edu). - + Mon May 12 11:25:38 1997 Thomas Bushnell, n/BSG Version 1.1.1 released. - + * version.c (version): Update to version 1.1.1. * bogus/mach_kdb.h: Make sure MACH_KDB is always defined, to zero if necessary. Bug report from Marcus Daniels - (marcus@cathcart.sysc.pdx.edu). + (marcus@cathcart.sysc.pdx.edu). Fri May 9 13:06:25 1997 Thomas Bushnell, n/BSG @@ -181,7 +185,7 @@ Fri May 2 12:43:46 1997 Thomas Bushnell, n/BSG * i386/i386/_setjmp.S: New file, from UK22 libmach. * i386/Files: Add i386/i386/_setjmp.S. * i386/Makefrag (objfiles): Add _setjmp.o if enable_kdb. - + 1997-04-30 Marcus G. Daniels * Makefile.in (clib-routines): Add htons not because it is necessary, @@ -195,7 +199,7 @@ Wed Apr 30 14:12:12 1997 Thomas Bushnell, n/BSG Mon Apr 28 12:09:53 1997 Thomas Bushnell, n/BSG * Makefile.in (check): New target. Reported by - xtest@postman.epa.go.jp. + xtest@postman.epa.go.jp. * i386/Drivers.in (ncr53c7xx): Change file name to 53c78xx.o. * i386/i386at/gpl/linux/scsi/53c7,8xx.c: Moved to ... @@ -218,12 +222,12 @@ Wed Apr 23 13:21:23 1997 Thomas Bushnell, n/BSG from configure now. * Makefile.in (clean, distclean, mostlyclean, maintainter-clean): - New targets. - (all-archs-configures): New variable. + New targets. + (all-archs-configures): New variable. (MIG): Change to ./local-mig. (./local-mig): Change to build this instead of ./mig (check-clib-routines): Use nm -g in case there are local symbols. - Suggested by Matthew Wilcox (willy@odie.barnet.ac.uk). + Suggested by Matthew Wilcox (willy@odie.barnet.ac.uk). Fri Apr 18 15:25:10 1997 Thomas Bushnell, n/BSG @@ -245,7 +249,7 @@ Wed Apr 16 16:55:36 1997 Marcus G. Daniels be possible to build it. (all, install): Use $(cross-migcom). (install): Install cross-migcom only if was to be built. - (mkinstalldirs): Add $(bindir), $(includedir)/mach/exec + (mkinstalldirs): Add $(bindir), $(includedir)/mach/exec (cross-lexxer.o lexxer.o): lexxer.o needs cpu.h. (./cross-migcom): Prevent dependency generation for cross-* MiG files unless they can actually be built. @@ -260,7 +264,7 @@ Wed Apr 16 12:52:25 1997 Thomas Bushnell, n/BSG * Makefile.in (cross-lexxer.o lexxer.o): Add pump-priming dependency on cpu.h. Reported by Marcus G. Daniels - (marcus@cathcart.sysc.pdx.edu). + (marcus@cathcart.sysc.pdx.edu). * configure.in: Fail if configure target is not for GNU os. @@ -271,19 +275,19 @@ Wed Apr 16 12:52:25 1997 Thomas Bushnell, n/BSG * i386/bogus/com.h: Revert change of March 10. * i386/device-drivers.h.in (CONFIG_MACH_COM): Delete option. Bug report from Marcus G. Daniels (marcus@cathcart.sysc.pdx.edu). - - * Makefile.in (./cross-mig): New rule. + + * Makefile.in (./cross-mig): New rule. (mkinstalldirs): Add $(libexecdir). - * configure.in: Recognize i686. + * configure.in: Recognize i686. Reported by Marcus G. Daniels (marcus@cathcart.sysc.pdx.edu). Mon Apr 14 11:50:45 1997 Thomas Bushnell, n/BSG - * Released version 1.0. - + * Released version 1.0. + * kern/exception.c (exception_no_server): Try and suspend the failing thread before killing the task. Then a debugger can be - used. + used. * i386/Makefrag: Add rebuilding rules for configure subscript. @@ -302,10 +306,10 @@ Mon Apr 14 11:50:45 1997 Thomas Bushnell, n/BSG (mach-exec-headers): New variable. (other-headers): New variable. (installed-headers): Add mach-exec-headers. - (dist): Distribute other-mach-headers, other-sys-headers, + (dist): Distribute other-mach-headers, other-sys-headers, mach-exec-headers, and other-headers. (device-files): Add device.srv. - + * Makefile.in (check-clib-routines): Use more efficient rule. Fri Apr 11 15:18:09 1997 Thomas Bushnell, n/BSG @@ -327,7 +331,7 @@ Fri Mar 21 15:50:09 1997 Thomas Bushnell, n/BSG * i386/i386at/gpl/linux/scsi/aha1740.c (aha1740_test_port): Try and turn on PORTADDR_ENH before checking it. - * vm/vm_object.c (vm_object_cached_max): Increase to 200. + * vm/vm_object.c (vm_object_cached_max): Increase to 200. Thu Mar 20 12:33:06 1997 Thomas Bushnell, n/BSG @@ -339,12 +343,12 @@ Thu Mar 20 12:33:06 1997 Thomas Bushnell, n/BSG * version.c (version): Push back to 0.1. * Makefile.in (cross_compiling, bindir, libexecdir): New - variable. - + variable. + * Makefile.in (install): Depend on cross-mig and cross-migcom; install them. New rules added to build mig, migcom, cross-mig, and cross-migcom. - + * configure.in (AC_PROG_LEX, AC_PROG_YACC): New tests. (BUILD_CC): New test to set these. @@ -352,13 +356,13 @@ Thu Mar 20 12:33:06 1997 Thomas Bushnell, n/BSG (%_interface.h %_server.c): Likewise. (MIG): Don't use @MIG@; hard code it to the one we build. (BUILD_CC, BUILD_CFLAGS, MIGCOM, LEX, YACC, LEXLIB): New variables. - + Wed Mar 19 16:47:28 1997 Thomas Bushnell, n/BSG * i386/i386at/kd.c (BROKEN_KEYBOARD_RESET): Turn off this so that we attempt the keyboard resets. * i386/i386/locore.S (cpu_shutdown): Attempt to provide a more - `robust' null_idtr. + `robust' null_idtr. Mon Mar 17 13:47:14 1997 Thomas Bushnell, n/BSG @@ -366,7 +370,7 @@ Mon Mar 17 13:47:14 1997 Thomas Bushnell, n/BSG gratuitious obnoxiousness. * i386/i386at/gpl/linux/scsi/scsi.c (scsi_dev_init): Likewise. * i386/i386at/gpl/linux/block/triton.c (ide_init_triton): - Likewise. + Likewise. (init_triton_dma): Likewise. * i386/i386at/gpl/linux/pci/pci.c (pci_init): Likewise. * i386/i386at/gpl/linux/pci/bios32.c (check_pcibios): Likewise. @@ -374,7 +378,7 @@ Mon Mar 17 13:47:14 1997 Thomas Bushnell, n/BSG * i386/i386at/gpl/linux/block/genhd.c (add_partition): Likewise. * i386/i386at/gpl/linux/net/8390.c (ei_debug): Make default value - zero. + zero. Wed Mar 12 14:50:46 1997 Thomas Bushnell, n/BSG @@ -396,10 +400,10 @@ Mon Mar 10 15:04:47 1997 Thomas Bushnell, n/BSG * i386/i386at/gpl/linux/linux_init.c (calibrate_delay): Don't print out gratuitous obnoxiousness. - + * i386/i386at/gpl/linux/linux_init.c (linux_init): Only call linux_net_emulation_init if CONFIG_INET. Include - . + . * i386/i386at/i386at_ds_routines.c: Include . Don't mention linux_net_emulation_ops @@ -414,7 +418,7 @@ Mon Mar 10 15:04:47 1997 Thomas Bushnell, n/BSG * i386/Makefrag: Include i386/driverlist; don't include all device drivers in kernel image; instead use list from driverlist. * configure.in: Configure in $systype subdir too. - + * i386/i386at/gpl/linux/include/linux/autoconf.h: Damage severly to conform to device-drivers.h model. @@ -428,13 +432,13 @@ Mon Mar 3 16:26:58 1997 Thomas Bushnell, n/BSG Tue Feb 25 15:42:23 1997 Thomas Bushnell, n/BSG * i386/Makefrag (INCLUDES): Find `include' directory in new - location. + location. * Makefile (INCLUDES): Find `include' directory in new location. (%.symc): Find gensym.awk in new location. - + * Reorganized directories into new layout and unified mach4 and mach4-i386 into a single tree. Older changes in ChangeLog.00 (for i386 directory) and ChangeLog.0 (for -all other files). +all other files). diff --git a/mig/ChangeLog b/mig/ChangeLog deleted file mode 100644 index 00182f4..0000000 --- a/mig/ChangeLog +++ /dev/null @@ -1,163 +0,0 @@ -Thu Mar 20 14:56:34 1997 Thomas Bushnell, n/BSG - - * error.c (unix_error_string): Assume HAVE_STRERROR. - -Wed May 15 13:55:01 1996 Miles Bader - - * user.c (WriteRequestArgs): Don't check args against akbUserArg. - (WritePackArg): Do check poly args also against akbUserArg. - -Thu May 2 19:13:32 1996 Miles Bader - - * routine.h (struct routine): Split rtReplyPort field into - rtUReplyPort and rtSReplyPort fields. - * routine.c (rtAddDummyReplyPort): Add USER arg, and use it. - (rtCheckRoutineArg): Set user or server or both reply ports. - (rtSetArgDefaults, rtCheckArgTypes, rtCheckRoutine): Deal with - split reply ports. - * user.c (WriteRequestHead, WriteMsgCheckReceive): Use - rtUReplyPort field instead of rtReplyPort. - (WriteRequestArgs): Only deal with user-side args. - -Wed May 15 13:55:01 1996 Miles Bader - - * user.c (WriteRequestArgs): Don't check args against akbUserArg. - (WritePackArg): Do check poly args also against akbUserArg. - -Thu May 2 19:13:32 1996 Miles Bader - - * routine.h (struct routine): Split rtReplyPort field into - rtUReplyPort and rtSReplyPort fields. - * routine.c (rtAddDummyReplyPort): Add USER arg, and use it. - (rtCheckRoutineArg): Set user or server or both reply ports. - (rtSetArgDefaults, rtCheckArgTypes, rtCheckRoutine): Deal with - split reply ports. - * user.c (WriteRequestHead, WriteMsgCheckReceive): Use - rtUReplyPort field instead of rtReplyPort. - (WriteRequestArgs): Only deal with user-side args. - -Thu Feb 29 12:46:40 1996 steve clawson - - * user.c (WriteMsgCheckReceive): If the reply-port isn't - user-supplied and there was a message transmission error, then - deallocate it. From Michael I Bushnell (mib@gnu.ai.mit.edu). - - * user.c (WriteMsgCheckIdentity): Dealloc reply port if a - mismatched reply comes in to avoid cascaded errors. From - Michael I Bushnell (mib@gnu.ai.mit.edu). - -Wed May 3 13:59:54 MDT 1995 Bryan Ford - - Merged in diffs from UK02p12 to UK02p15: - - Wed May 3 10:47:41 MDT 1995 Bryan Ford - - * Released UK02p15. - - * mig_string.h: include string.h instead of strings.h - - * user.c, lexxer.l: changed index/rindex to strchr/strrchr. - -Fri Feb 10 13:25:54 MST 1995 Bryan Ford - - Merged in diffs from UK02p7 to UK02p9: - - Sun, 29 Jan 1995 Remy.Card@masi.ibp.fr (Remy CARD) - - Fixed a bug that causes mig to generate bad file names - in #include directives when generating the user source file. - -Fri Nov 25 13:56:32 MST 1994 Bryan Ford (baford@cs.utah.edu) - - Merged in diffs from UK02p6 to UK02p7: - - * MIG now compiles under BSD without 'vm_???_t' types - conflicting between host (BSD) and target (Mach) - header files. Basically, the MIG source files compiled - to run on the host machine no longer include mach/message.h; - instead they get the needed defines through cpu.h - which is built by compiling cpu.sym for the target machine. - -Mon Aug 29 18:31:21 1994 Bryan Ford (baford@cs.utah.edu) - - * got rid of /usr/bin pathname in call to basename: - basename isn't always in /usr/bin. - -Fri Aug 26 11:36:10 1994 Louis-D. Dubeau (hallu@info.polymtl.ca) - - * Fixed mig.sh to pass -imacros flags to CPP correctly. - -Tue Sep 6 10:00:29 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Released UK02p6. - - * use strerror instead of sys_errlist if it's available. - - * Other minor portability fixes. - -Mon Aug 15 18:37:47 1994 Roland McGrath - - * global.c (more_global): Prepend RoutinePrefix to ServerDemux - even for non-default value of ServerDemux. - -Fri Jul 8 14:36:53 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * routine.h (rtSkip): Take int arg. - * routine.c (rtSkip): Take int arg and increment by that many. - * parser.y (Statement): Grok `skip N;'; pass int arg to rtSkip. - -Fri May 13 15:08:56 1994 Michael I Bushnell (mib@churchy.gnu.ai.mit.edu) - - * user.c (WriteMsgCheckReceive): Deallocate the reply port also if - we get one of the send errors that can cause the message to be - partially sent and then destroyed; otherwise we might later get a - spurious send-once notification. - -Wed Aug 4 10:34:42 1993 Michael I. Bushnell (mib at ernst.gnu.ai.mit.edu) - - * Makefile: Don't use flex or bison; use lex and yacc instead. - - * migcom.c (myfopen): Added extern declaration of errno. - -Wed Jun 30 19:46:51 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * user.c (WriteUser): Call WriteImport for skImport and skUImport - statements. - (WriteUserIndividual): Write all the import and uimport statements - to each file. - -Mon Jun 28 22:07:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * utils.c (WriteStaticShortDecl, WriteCheckDecl, - WriteStaticLongDecl): Generate a `const' definition. - -Fri Jun 25 17:53:26 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * utils.c (WriteCopyType): Write SubrPrefix before `mig_strncpy'. - - * user.c (WriteRequestHead): Write SubrPrefix before - `mig_get_reply_port'. - (WriteMsgCheckReceive): Write SubrPrefix before - `mig_dealloc_reply_port'. - (WritePackArgValue): Write SubrPrefix before `mig_strncpy'. - (WriteExtractArgValue): Likewise. - (WriteExtractArgValue): Write SubrPrefix before `mig_allocate'. - (WriteMsgSend): Write SubrPrefix before `mach_msg_send_from_kernel' - and `mach_msg'. - (WriteMsgSendReceive): Write SubrPrefix before `mach_msg'. - (WriteMsgRPC): Write SubrPrefix before `mach_msg_rpc_from_kernel' - and `mach_msg'. - - * server.c (WriteDestroyArg): Write SubrPrefix before `mig_deallocate'. - (WritePackArgValue): Write SubrPrefix before `mig_strncpy'. - (WriteDestroyPortArg): Write SubrPrefix before `ipc_port_release_send'. - (WriteAdjustMsgCircular): Write SubrPrefix before - `ipc_port_check_circularity'. - - * routine.c (rtCheckRoutine): Prepend RoutinePrefix to - RT->rtServerName and RT->rtUserName. - - * migcom.c (parseArgs): Recognize -subrprefix and -prefix. - - * global.c (SubrPrefix, RoutinePrefix): Define new variables. - * global.h: Declare them. diff --git a/mig/alloc.h b/mig/alloc.h deleted file mode 100644 index 1d0b88f..0000000 --- a/mig/alloc.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _ALLOC_H -#define _ALLOC_H - -extern char *malloc(); -extern char *calloc(); -extern void free(); - -#endif _ALLOC_H diff --git a/mig/boolean.h b/mig/boolean.h deleted file mode 100644 index 5773e5e..0000000 --- a/mig/boolean.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 1994 The University of Utah and - * the Computer Systems Laboratory at the University of Utah (CSL). - * All rights reserved. - * - * Permission to use, copy, modify and distribute this software is hereby - * granted provided that (1) source code retains these copyright, permission, - * and disclaimer notices, and (2) redistributions including binaries - * reproduce the notices in supporting documentation, and (3) all advertising - * materials mentioning features or use of this software display the following - * acknowledgement: ``This product includes software developed by the - * Computer Systems Laboratory at the University of Utah.'' - * - * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS - * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF - * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * CSL requests users of this software to return to csl-dist@cs.utah.edu any - * improvements that they make and grant CSL redistribution rights. - * - * Author: Bryan Ford, University of Utah CSL - */ -#ifndef _MIG_BOOLEAN_H_ -#define _MIG_BOOLEAN_H_ - -#ifndef boolean_t -#define boolean_t int -#endif - -#ifndef TRUE -#define TRUE ((boolean_t) 1) -#endif - -#ifndef FALSE -#define FALSE ((boolean_t) 0) -#endif - -#endif /* _MIG_BOOLEAN_H_ */ diff --git a/mig/cpu.sym b/mig/cpu.sym deleted file mode 100644 index eca50f3..0000000 --- a/mig/cpu.sym +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 1994 The University of Utah and - * the Computer Systems Laboratory at the University of Utah (CSL). - * All rights reserved. - * - * Permission to use, copy, modify and distribute this software is hereby - * granted provided that (1) source code retains these copyright, permission, - * and disclaimer notices, and (2) redistributions including binaries - * reproduce the notices in supporting documentation, and (3) all advertising - * materials mentioning features or use of this software display the following - * acknowledgement: ``This product includes software developed by the - * Computer Systems Laboratory at the University of Utah.'' - * - * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS - * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF - * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * CSL requests users of this software to return to csl-dist@cs.utah.edu any - * improvements that they make and grant CSL redistribution rights. - * - * Author: Bryan Ford, University of Utah CSL - */ - -#include - -expr sizeof(integer_t) word_size -expr sizeof(integer_t)*8 word_size_in_bits -expr sizeof(void*) sizeof_pointer -expr sizeof(mach_msg_header_t) sizeof_mach_msg_header_t -expr sizeof(mach_msg_type_t) sizeof_mach_msg_type_t -expr sizeof(mach_msg_type_long_t) sizeof_mach_msg_type_long_t - -expr MACH_MSG_TYPE_UNSTRUCTURED -expr MACH_MSG_TYPE_POLYMORPHIC -expr MACH_MSG_TYPE_BIT -expr MACH_MSG_TYPE_BOOLEAN -expr MACH_MSG_TYPE_INTEGER_16 -expr MACH_MSG_TYPE_INTEGER_32 -expr MACH_MSG_TYPE_CHAR -expr MACH_MSG_TYPE_BYTE -expr MACH_MSG_TYPE_INTEGER_8 -expr MACH_MSG_TYPE_REAL -expr MACH_MSG_TYPE_INTEGER_64 -expr MACH_MSG_TYPE_STRING -expr MACH_MSG_TYPE_STRING_C - -expr MACH_MSG_TYPE_MOVE_RECEIVE -expr MACH_MSG_TYPE_MOVE_SEND -expr MACH_MSG_TYPE_MOVE_SEND_ONCE -expr MACH_MSG_TYPE_COPY_SEND -expr MACH_MSG_TYPE_MAKE_SEND -expr MACH_MSG_TYPE_MAKE_SEND_ONCE - -expr MACH_MSG_TYPE_PORT_NAME -expr MACH_MSG_TYPE_PORT_RECEIVE -expr MACH_MSG_TYPE_PORT_SEND -expr MACH_MSG_TYPE_PORT_SEND_ONCE - diff --git a/mig/error.c b/mig/error.c deleted file mode 100644 index ae97143..0000000 --- a/mig/error.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include -#include - -#include "global.h" -#include "error.h" -#include "lexxer.h" - -static const char *program; -int errors = 0; - -void -fatal(const char *format, ...) -{ - va_list pvar; - va_start(pvar, format); - fprintf(stderr, "%s: fatal: ", program); - (void) vfprintf(stderr, format, pvar); - fprintf(stderr, "\n"); - va_end(pvar); - exit(1); -} - -void -warn(const char *format, ...) -{ - va_list pvar; - va_start(pvar, format); - if (!BeQuiet && (errors == 0)) - { - fprintf(stderr, "\"%s\", line %d: warning: ", inname, lineno-1); - (void) vfprintf(stderr, format, pvar); - fprintf(stderr, "\n"); - } - va_end(pvar); -} - -void -error(const char *format, ...) -{ - va_list pvar; - va_start(pvar, format); - fprintf(stderr, "\"%s\", line %d: ", inname, lineno-1); - (void) vfprintf(stderr, format, pvar); - fprintf(stderr, "\n"); - va_end(pvar); - errors++; -} - -const char * -unix_error_string(int error_num) -{ - static char buffer[256]; - const char *error_mess; - - error_mess = strerror (error_num); - - sprintf(buffer, "%s (%d)", error_mess, error_num); - return buffer; -} - -void -set_program_name(const char *name) -{ - program = name; -} diff --git a/mig/error.h b/mig/error.h deleted file mode 100644 index a5962fe..0000000 --- a/mig/error.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _ERROR_H -#define _ERROR_H - -#include -extern int errno; - -#if defined(__GNUC__) -extern void fatal(const char *format, ...) -#if __GNUC__ > 1 - __attribute__ ((format (printf, 1, 2), - noreturn)) -#endif - ; -extern void warn(const char *format, ...) -#if __GNUC__ > 1 - __attribute__ ((format (printf, 1, 2))) -#endif - ; -extern void error(const char *format, ...) -#if __GNUC__ > 1 - __attribute__ ((format (printf, 1, 2))) -#endif - ; -#else /* not defined(__GNUC__) */ -extern void fatal(const char *format, ...); -extern void warn(const char *format, ...); -extern void error(const char *format, ...); -#endif /* defined(__GNUC__) */ - -extern const char *unix_error_string(int error_num); - -extern int errors; -extern void set_program_name(const char *name); - -#endif /* _ERROR_H */ diff --git a/mig/global.c b/mig/global.c deleted file mode 100644 index f1b25ac..0000000 --- a/mig/global.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include "error.h" -#include "global.h" - -boolean_t BeQuiet = FALSE; -boolean_t BeVerbose = FALSE; -boolean_t UseMsgRPC = TRUE; -boolean_t GenSymTab = FALSE; - -boolean_t IsKernelUser = FALSE; -boolean_t IsKernelServer = FALSE; - -const_string_t RCSId = strNULL; - -const_string_t SubsystemName = strNULL; -u_int SubsystemBase = 0; - -const_string_t MsgOption = strNULL; -const_string_t WaitTime = strNULL; -const_string_t ErrorProc = "MsgError"; -const_string_t ServerPrefix = ""; -const_string_t UserPrefix = ""; -const_string_t ServerDemux = strNULL; -const_string_t SubrPrefix = ""; -const_string_t RoutinePrefix = ""; - -string_t yyinname; - -const char LintLib[] = "defined(LINTLIBRARY)"; - -void -init_global(void) -{ - yyinname = strmake(""); -} - -string_t UserFilePrefix = strNULL; -string_t UserHeaderFileName = strNULL; -string_t ServerHeaderFileName = strNULL; -string_t InternalHeaderFileName = strNULL; -string_t UserFileName = strNULL; -string_t ServerFileName = strNULL; - -void -more_global(void) -{ - if (SubsystemName == strNULL) - fatal("no SubSystem declaration"); - - if (UserHeaderFileName == strNULL) - UserHeaderFileName = strconcat(SubsystemName, ".h"); - else if (streql(UserHeaderFileName, "/dev/null")) - UserHeaderFileName = strNULL; - - if (UserFileName == strNULL) - UserFileName = strconcat(SubsystemName, "User.c"); - else if (streql(UserFileName, "/dev/null")) - UserFileName = strNULL; - - if (ServerFileName == strNULL) - ServerFileName = strconcat(SubsystemName, "Server.c"); - else if (streql(ServerFileName, "/dev/null")) - ServerFileName = strNULL; - - if (ServerDemux == strNULL) - ServerDemux = strconcat(SubsystemName, "_server"); - if (RoutinePrefix != NULL) - ServerDemux = strconcat (RoutinePrefix, ServerDemux); -} diff --git a/mig/global.h b/mig/global.h deleted file mode 100644 index b841cd5..0000000 --- a/mig/global.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _GLOBAL_H -#define _GLOBAL_H - -#include - -#include "boolean.h" -#include "mig_string.h" - -extern boolean_t BeQuiet; /* no warning messages */ -extern boolean_t BeVerbose; /* summarize types, routines */ -extern boolean_t UseMsgRPC; -extern boolean_t GenSymTab; - -extern boolean_t IsKernelUser; -extern boolean_t IsKernelServer; - -extern const_string_t RCSId; - -extern const_string_t SubsystemName; -extern u_int SubsystemBase; - -extern const_string_t MsgOption; -extern const_string_t WaitTime; -extern const_string_t ErrorProc; -extern const_string_t ServerPrefix; -extern const_string_t UserPrefix; -extern const_string_t ServerDemux; -extern const_string_t SubrPrefix; -extern const_string_t RoutinePrefix; - -extern int yylineno; -extern string_t yyinname; - -extern void init_global(void); - -extern string_t UserFilePrefix; -extern string_t UserHeaderFileName; -extern string_t ServerHeaderFileName; -extern string_t InternalHeaderFileName; -extern string_t UserFileName; -extern string_t ServerFileName; - -extern void more_global(void); - -extern const char LintLib[]; - -#ifndef NULL -#define NULL 0 -#endif - -#endif /* _GLOBAL_H */ diff --git a/mig/header.c b/mig/header.c deleted file mode 100644 index 2635bc0..0000000 --- a/mig/header.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include "write.h" -#include "utils.h" -#include "global.h" -#include "error.h" - -static void -WriteIncludes(FILE *file) -{ - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "\n"); -} - -static void -WriteDefines(FILE *file) -{ -} - -static void -WriteMigExternal(FILE *file) -{ - fprintf(file, "#ifdef\tmig_external\n"); - fprintf(file, "mig_external\n"); - fprintf(file, "#else\n"); - fprintf(file, "extern\n"); - fprintf(file, "#endif\n"); -} - -static void -WriteProlog(FILE *file, const char *protect) -{ - if (protect != strNULL) { - fprintf(file, "#ifndef\t_%s\n", protect); - fprintf(file, "#define\t_%s\n", protect); - fprintf(file, "\n"); - } - - fprintf(file, "/* Module %s */\n", SubsystemName); - fprintf(file, "\n"); - - WriteIncludes(file); - WriteDefines(file); -} - -static void -WriteEpilog(FILE *file, const char *protect) -{ - if (protect != strNULL) { - fprintf(file, "\n"); - fprintf(file, "#endif\t/* not defined(_%s) */\n", protect); - } -} - -static void -WriteUserRoutine(FILE *file, const routine_t *rt) -{ - fprintf(file, "\n"); - fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName); - WriteMigExternal(file); - fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtUserName); - fprintf(file, "#if\t%s\n", LintLib); - fprintf(file, " ("); - WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", " , ""); - fprintf(file, ")\n"); - WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ";\n", ";\n"); - fprintf(file, "{ "); - if (!rt->rtProcedure) - fprintf(file, "return "); - fprintf(file, "%s(", rt->rtUserName); - WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", ", ""); - fprintf(file, "); }\n"); - fprintf(file, "#else\n"); - fprintf(file, "(\n"); - WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ",\n", "\n"); - fprintf(file, ");\n"); - fprintf(file, "#endif\n"); -} - -void -WriteUserHeader(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - const char *protect = strconcat(SubsystemName, "_user_"); - - WriteProlog(file, protect); - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - WriteUserRoutine(file, stat->stRoutine); - break; - case skImport: - case skUImport: - WriteImport(file, stat->stFileName); - break; - case skSImport: - break; - default: - fatal("WriteHeader(): bad statement_kind_t (%d)", - (int) stat->stKind); - } - WriteEpilog(file, protect); -} - -static void -WriteServerRoutine(FILE *file, const routine_t *rt) -{ - fprintf(file, "\n"); - fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName); - WriteMigExternal(file); - fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtServerName); - fprintf(file, "#if\t%s\n", LintLib); - fprintf(file, " ("); - WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", " , ""); - fprintf(file, ")\n"); - WriteList(file, rt->rtArgs, WriteServerVarDecl, - akbServerArg, ";\n", ";\n"); - fprintf(file, "{ "); - if (!rt->rtProcedure) - fprintf(file, "return "); - fprintf(file, "%s(", rt->rtServerName); - WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", ", ""); - fprintf(file, "); }\n"); - fprintf(file, "#else\n"); - fprintf(file, "(\n"); - WriteList(file, rt->rtArgs, WriteServerVarDecl, - akbServerArg, ",\n", "\n"); - fprintf(file, ");\n"); - fprintf(file, "#endif\n"); -} - -void -WriteServerHeader(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - const char *protect = strconcat(SubsystemName, "_server_"); - - WriteProlog(file, protect); - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - WriteServerRoutine(file, stat->stRoutine); - break; - case skImport: - case skSImport: - WriteImport(file, stat->stFileName); - break; - case skUImport: - break; - default: - fatal("WriteServerHeader(): bad statement_kind_t (%d)", - (int) stat->stKind); - } - WriteEpilog(file, protect); -} - -static void -WriteInternalRedefine(FILE *file, register const routine_t *rt) -{ - fprintf(file, "#define %s %s_external\n", rt->rtUserName, rt->rtUserName); -} - -void -WriteInternalHeader(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - WriteInternalRedefine(file, stat->stRoutine); - break; - case skImport: - case skUImport: - case skSImport: - break; - default: - fatal("WriteInternalHeader(): bad statement_kind_t (%d)", - (int) stat->stKind); - } -} diff --git a/mig/lexxer.c b/mig/lexxer.c deleted file mode 100644 index 4119cdf..0000000 --- a/mig/lexxer.c +++ /dev/null @@ -1,2518 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header: cvs/gnumach/mig/Attic/lexxer.c,v 1.1 1997/04/14 20:28:00 thomas Exp $ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - -#define unput(c) yyunput( c, yytext_ptr ) - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 100 -#define YY_END_OF_BUFFER 101 -static yyconst short int yy_accept[515] = - { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 101, 99, 97, 98, 94, 77, 78, 75, - 73, 72, 74, 76, 88, 70, 71, 82, 79, 83, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 84, 85, 80, - 87, 86, 81, 89, 99, 99, 99, 96, 96, 95, - 94, 0, 0, 93, 88, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 11, 87, 87, 87, - 87, 87, 19, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - - 89, 0, 90, 0, 0, 91, 0, 0, 0, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 12, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 0, 92, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 31, - 87, 87, 87, 28, 87, 87, 87, 87, 18, 87, - 87, 36, 87, 87, 87, 87, 20, 87, 87, 13, - - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 24, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 25, 33, 40, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 32, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 42, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 34, 87, 87, 87, 87, 1, - 87, 87, 87, 87, 87, 27, 87, 87, 26, 87, - 87, 87, 87, 87, 87, 39, 87, 2, 87, 87, - - 87, 87, 87, 8, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 9, - 87, 87, 37, 87, 41, 87, 87, 87, 7, 87, - 87, 87, 3, 15, 87, 87, 87, 87, 87, 87, - 87, 6, 87, 87, 45, 87, 35, 87, 30, 87, - 43, 10, 87, 87, 44, 87, 87, 87, 87, 17, - 16, 22, 38, 87, 87, 46, 14, 23, 87, 87, - 87, 29, 87, 21, 87, 87, 87, 87, 5, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 4, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - - 87, 87, 48, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 54, 53, 87, 87, - 87, 87, 87, 87, 56, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 57, 87, 49, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 58, - 87, 60, 87, 87, 87, 55, 61, 87, 62, 87, - 65, 87, 67, 87, 50, 51, 52, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 69, 87, 87, - - 87, 87, 59, 87, 66, 87, 47, 87, 87, 87, - 63, 64, 68, 0 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 5, 6, 7, 1, 1, 1, 8, - 9, 10, 11, 12, 13, 7, 14, 15, 16, 17, - 18, 19, 15, 20, 15, 21, 15, 22, 23, 24, - 25, 26, 1, 1, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 36, - 52, 1, 53, 54, 55, 1, 56, 57, 58, 59, - - 60, 32, 61, 62, 63, 36, 64, 65, 66, 67, - 68, 69, 43, 70, 71, 72, 73, 74, 49, 50, - 75, 36, 1, 76, 1, 77, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[78] = - { 0, - 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 3, 3, 4, 4, 4, 4, 4, 4, - 4, 1, 1, 1, 1, 1, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 1, 1, 1, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 1, 1 - } ; - -static yyconst short int yy_base[524] = - { 0, - 0, 3, 9, 979, 86, 163, 97, 101, 111, 124, - 115, 129, 984, 986, 986, 986, 132, 986, 986, 986, - 986, 986, 986, 986, 139, 986, 986, 986, 986, 986, - 76, 0, 135, 62, 100, 131, 152, 152, 134, 143, - 162, 152, 169, 210, 126, 189, 172, 986, 986, 986, - 150, 986, 986, 0, 978, 956, 976, 986, 986, 986, - 246, 273, 282, 302, 293, 0, 181, 185, 171, 163, - 197, 198, 260, 202, 186, 202, 283, 287, 211, 951, - 282, 284, 0, 286, 211, 285, 289, 293, 290, 294, - 300, 305, 297, 297, 314, 303, 307, 316, 317, 315, - - 0, 974, 986, 952, 972, 986, 377, 381, 971, 332, - 334, 300, 333, 330, 319, 342, 338, 346, 360, 358, - 356, 360, 359, 364, 366, 941, 367, 381, 386, 369, - 368, 387, 374, 379, 373, 375, 374, 381, 382, 383, - 381, 386, 403, 397, 407, 392, 407, 969, 986, 405, - 409, 410, 428, 416, 417, 426, 423, 424, 423, 426, - 425, 445, 425, 427, 443, 918, 433, 446, 447, 447, - 439, 446, 458, 460, 447, 469, 469, 474, 470, 0, - 475, 485, 464, 0, 476, 482, 479, 470, 0, 488, - 493, 0, 480, 492, 489, 481, 0, 496, 490, 0, - - 493, 504, 503, 507, 933, 503, 928, 523, 510, 531, - 505, 531, 0, 522, 518, 526, 525, 536, 527, 519, - 528, 531, 533, 529, 537, 543, 543, 541, 533, 546, - 559, 563, 557, 0, 0, 0, 558, 567, 925, 566, - 565, 571, 569, 576, 574, 572, 579, 576, 592, 604, - 586, 578, 585, 0, 585, 589, 595, 608, 603, 608, - 605, 611, 625, 0, 613, 620, 625, 635, 622, 936, - 629, 630, 634, 639, 0, 636, 631, 637, 637, 0, - 641, 652, 640, 644, 648, 0, 649, 660, 0, 653, - 936, 665, 653, 652, 673, 0, 667, 0, 678, 671, - - 682, 912, 678, 0, 678, 683, 689, 693, 682, 688, - 688, 692, 701, 695, 687, 694, 701, 699, 702, 0, - 698, 705, 0, 706, 0, 704, 711, 920, 0, 719, - 728, 727, 0, 0, 722, 720, 721, 933, 743, 727, - 733, 0, 734, 914, 0, 744, 0, 751, 0, 912, - 0, 0, 754, 738, 0, 912, 750, 755, 754, 0, - 0, 0, 0, 749, 919, 0, 0, 0, 910, 757, - 751, 0, 928, 0, 749, 766, 903, 754, 0, 792, - 769, 244, 768, 917, 96, 915, 924, 908, 913, 0, - 906, 910, 904, 922, 906, 901, 909, 897, 192, 917, - - 899, 897, 0, 903, 909, 895, 887, 906, 905, 904, - 883, 887, 894, 896, 884, 898, 0, 0, 873, 894, - 871, 870, 885, 868, 0, 882, 877, 893, 874, 887, - 872, 97, 875, 763, 882, 867, 873, 881, 867, 879, - 878, 877, 863, 879, 874, 873, 848, 873, 0, 861, - 845, 859, 869, 857, 854, 856, 865, 853, 863, 845, - 860, 812, 859, 857, 857, 852, 854, 853, 853, 0, - 835, 0, 861, 863, 860, 0, 823, 842, 821, 840, - 0, 839, 818, 828, 0, 0, 0, 830, 822, 822, - 830, 807, 797, 804, 785, 792, 774, 0, 494, 329, - - 319, 267, 0, 249, 0, 184, 0, 114, 112, 93, - 0, 0, 0, 986, 839, 843, 847, 4, 849, 853, - 857, 861, 865 - } ; - -static yyconst short int yy_def[524] = - { 0, - 515, 515, 514, 3, 516, 516, 515, 515, 515, 515, - 517, 517, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 514, 514, 514, - 518, 514, 514, 519, 520, 521, 522, 514, 514, 514, - 514, 514, 514, 514, 514, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - - 519, 520, 514, 521, 522, 514, 514, 514, 523, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 523, 514, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - - 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, - 518, 518, 518, 0, 514, 514, 514, 514, 514, 514, - 514, 514, 514 - } ; - -static yyconst short int yy_nxt[1064] = - { 0, - 514, 15, 16, 15, 15, 16, 15, 66, 17, 14, - 15, 16, 15, 14, 14, 14, 18, 19, 20, 21, - 22, 23, 24, 25, 25, 25, 25, 25, 25, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 32, 32, 37, 32, 38, 32, 39, 40, 41, - 42, 32, 43, 44, 45, 46, 32, 47, 32, 32, - 48, 49, 50, 32, 31, 32, 33, 34, 35, 32, - 32, 37, 38, 32, 51, 40, 41, 42, 43, 44, - 45, 46, 32, 32, 52, 53, 14, 15, 16, 15, - 14, 14, 73, 14, 14, 14, 14, 14, 15, 16, - - 15, 55, 15, 16, 15, 55, 17, 14, 14, 14, - 14, 14, 15, 16, 15, 57, 59, 60, 59, 67, - 56, 73, 397, 513, 56, 15, 16, 15, 57, 17, - 59, 60, 59, 62, 61, 63, 398, 14, 14, 14, - 441, 442, 512, 74, 511, 67, 64, 64, 64, 64, - 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, - 80, 14, 14, 14, 15, 16, 15, 14, 17, 74, - 14, 14, 14, 14, 14, 68, 96, 75, 81, 69, - 70, 71, 79, 82, 14, 14, 14, 14, 14, 72, - 76, 77, 85, 83, 81, 86, 78, 87, 100, 88, - - 96, 112, 68, 75, 81, 69, 70, 71, 84, 89, - 82, 79, 510, 113, 14, 14, 14, 76, 77, 85, - 81, 86, 78, 97, 110, 119, 87, 100, 88, 411, - 112, 111, 98, 99, 84, 412, 89, 113, 14, 14, - 90, 114, 115, 120, 91, 118, 92, 62, 131, 63, - 110, 97, 119, 93, 125, 94, 95, 111, 98, 99, - 64, 64, 64, 64, 64, 64, 64, 114, 115, 90, - 120, 118, 91, 92, 62, 131, 62, 509, 391, 93, - 125, 94, 95, 62, 392, 63, 116, 107, 107, 107, - 107, 107, 107, 107, 393, 508, 64, 64, 64, 64, - - 64, 64, 64, 108, 117, 108, 109, 65, 65, 65, - 65, 65, 65, 65, 127, 116, 64, 64, 64, 64, - 64, 64, 64, 121, 123, 132, 124, 140, 122, 128, - 117, 130, 129, 133, 134, 135, 136, 137, 138, 139, - 141, 142, 127, 152, 143, 144, 145, 146, 507, 147, - 121, 123, 132, 124, 122, 128, 140, 130, 150, 133, - 154, 134, 136, 137, 155, 138, 141, 139, 506, 152, - 142, 143, 144, 151, 153, 145, 146, 147, 108, 156, - 108, 109, 108, 157, 108, 109, 158, 150, 159, 154, - 155, 107, 107, 107, 107, 107, 107, 107, 160, 163, - - 151, 153, 161, 162, 164, 165, 156, 167, 174, 157, - 169, 168, 170, 158, 171, 173, 175, 159, 172, 176, - 177, 178, 179, 180, 181, 160, 163, 182, 161, 162, - 183, 164, 165, 184, 167, 187, 174, 168, 185, 169, - 171, 170, 172, 175, 173, 176, 177, 178, 186, 179, - 180, 181, 188, 182, 190, 189, 183, 191, 192, 193, - 194, 187, 184, 195, 202, 185, 196, 197, 198, 199, - 200, 201, 203, 204, 206, 186, 207, 208, 188, 189, - 190, 209, 210, 191, 211, 193, 194, 192, 212, 213, - 195, 202, 196, 197, 198, 199, 200, 214, 203, 215, - - 201, 206, 204, 216, 217, 207, 208, 218, 210, 209, - 219, 211, 220, 221, 222, 226, 223, 212, 213, 224, - 225, 214, 227, 228, 505, 229, 230, 232, 215, 231, - 233, 216, 235, 217, 218, 234, 236, 219, 222, 220, - 237, 226, 221, 223, 238, 245, 224, 225, 240, 242, - 227, 229, 228, 232, 230, 243, 231, 244, 233, 235, - 246, 234, 248, 247, 236, 249, 251, 237, 250, 253, - 252, 238, 245, 254, 240, 255, 256, 259, 242, 257, - 258, 243, 260, 262, 261, 263, 244, 264, 248, 246, - 247, 265, 249, 253, 250, 251, 252, 266, 267, 254, - - 271, 255, 256, 257, 272, 259, 258, 262, 273, 260, - 261, 268, 263, 269, 274, 275, 264, 276, 277, 278, - 265, 279, 280, 286, 266, 267, 287, 284, 271, 285, - 288, 272, 281, 282, 289, 273, 290, 268, 291, 269, - 274, 292, 275, 276, 277, 283, 278, 279, 293, 286, - 294, 280, 295, 287, 284, 285, 288, 296, 297, 298, - 289, 281, 282, 290, 299, 300, 301, 291, 292, 303, - 304, 305, 283, 306, 308, 293, 294, 307, 310, 295, - 309, 311, 312, 313, 297, 296, 298, 314, 315, 316, - 317, 299, 301, 318, 300, 320, 303, 304, 305, 321, - - 308, 306, 322, 323, 307, 310, 309, 324, 311, 313, - 325, 312, 327, 314, 326, 315, 316, 329, 330, 317, - 318, 331, 332, 333, 320, 321, 322, 334, 335, 336, - 337, 338, 323, 340, 324, 339, 344, 341, 325, 342, - 326, 327, 343, 345, 329, 330, 346, 351, 331, 347, - 332, 348, 333, 334, 349, 335, 336, 337, 352, 340, - 338, 353, 339, 341, 344, 354, 342, 356, 343, 345, - 355, 358, 359, 346, 363, 347, 351, 348, 360, 361, - 349, 364, 366, 367, 369, 370, 375, 352, 371, 353, - 376, 354, 372, 356, 355, 378, 379, 381, 359, 390, - - 358, 394, 444, 363, 360, 361, 445, 446, 395, 367, - 364, 366, 369, 504, 370, 375, 371, 376, 372, 382, - 383, 378, 503, 381, 502, 379, 384, 473, 390, 474, - 385, 475, 476, 386, 501, 387, 388, 500, 389, 14, - 14, 14, 14, 54, 54, 54, 54, 58, 58, 58, - 58, 101, 101, 102, 499, 102, 102, 104, 498, 104, - 104, 105, 497, 105, 105, 148, 148, 148, 148, 496, - 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, - 485, 484, 483, 482, 481, 480, 479, 478, 477, 472, - 471, 470, 469, 468, 467, 466, 465, 464, 463, 462, - - 461, 460, 459, 458, 457, 456, 455, 454, 453, 452, - 451, 450, 449, 448, 447, 443, 440, 439, 438, 437, - 436, 435, 434, 433, 432, 431, 430, 429, 428, 427, - 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, - 416, 415, 414, 413, 410, 409, 408, 407, 406, 405, - 404, 403, 402, 401, 400, 399, 396, 380, 377, 374, - 373, 368, 365, 362, 357, 350, 328, 319, 302, 270, - 241, 239, 205, 149, 166, 149, 106, 103, 103, 126, - 106, 103, 103, 514, 17, 13, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514 - } ; - -static yyconst short int yy_chk[1064] = - { 0, - 0, 1, 1, 1, 2, 2, 2, 518, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, - 5, 5, 34, 5, 5, 5, 5, 5, 7, 7, - - 7, 7, 8, 8, 8, 8, 8, 5, 5, 5, - 5, 5, 9, 9, 9, 9, 11, 11, 11, 31, - 7, 34, 385, 510, 8, 10, 10, 10, 10, 10, - 12, 12, 12, 17, 12, 17, 385, 5, 5, 5, - 432, 432, 509, 35, 508, 31, 17, 17, 17, 17, - 17, 17, 17, 25, 25, 25, 25, 25, 25, 25, - 39, 5, 5, 6, 6, 6, 6, 6, 6, 35, - 6, 6, 6, 6, 6, 33, 45, 36, 39, 33, - 33, 33, 38, 40, 6, 6, 6, 6, 6, 33, - 37, 37, 42, 41, 51, 42, 37, 43, 47, 43, - - 45, 69, 33, 36, 39, 33, 33, 33, 41, 43, - 40, 38, 506, 70, 6, 6, 6, 37, 37, 42, - 51, 42, 37, 46, 67, 75, 43, 47, 43, 399, - 69, 68, 46, 46, 41, 399, 43, 70, 6, 6, - 44, 71, 72, 76, 44, 74, 44, 61, 85, 61, - 67, 46, 75, 44, 79, 44, 44, 68, 46, 46, - 61, 61, 61, 61, 61, 61, 61, 71, 72, 44, - 76, 74, 44, 44, 62, 85, 62, 504, 382, 44, - 79, 44, 44, 63, 382, 63, 73, 62, 62, 62, - 62, 62, 62, 62, 382, 502, 63, 63, 63, 63, - - 63, 63, 63, 64, 73, 64, 64, 65, 65, 65, - 65, 65, 65, 65, 81, 73, 64, 64, 64, 64, - 64, 64, 64, 77, 78, 86, 78, 93, 77, 82, - 73, 84, 82, 87, 88, 88, 89, 90, 91, 92, - 94, 95, 81, 112, 96, 97, 98, 99, 501, 100, - 77, 78, 86, 78, 77, 82, 93, 84, 110, 87, - 114, 88, 89, 90, 115, 91, 94, 92, 500, 112, - 95, 96, 97, 111, 113, 98, 99, 100, 107, 116, - 107, 107, 108, 117, 108, 108, 118, 110, 119, 114, - 115, 107, 107, 107, 107, 107, 107, 107, 120, 123, - - 111, 113, 121, 122, 124, 125, 116, 127, 133, 117, - 128, 127, 129, 118, 130, 132, 134, 119, 131, 135, - 136, 137, 138, 139, 140, 120, 123, 141, 121, 122, - 142, 124, 125, 143, 127, 146, 133, 127, 144, 128, - 130, 129, 131, 134, 132, 135, 136, 137, 145, 138, - 139, 140, 147, 141, 151, 150, 142, 152, 153, 154, - 155, 146, 143, 156, 163, 144, 157, 158, 159, 160, - 161, 162, 164, 165, 167, 145, 168, 169, 147, 150, - 151, 170, 171, 152, 172, 154, 155, 153, 173, 174, - 156, 163, 157, 158, 159, 160, 161, 175, 164, 176, - - 162, 167, 165, 177, 178, 168, 169, 179, 171, 170, - 179, 172, 181, 182, 183, 188, 185, 173, 174, 186, - 187, 175, 190, 191, 499, 193, 194, 196, 176, 195, - 198, 177, 201, 178, 179, 199, 202, 179, 183, 181, - 203, 188, 182, 185, 204, 211, 186, 187, 206, 208, - 190, 193, 191, 196, 194, 209, 195, 210, 198, 201, - 212, 199, 215, 214, 202, 216, 218, 203, 217, 220, - 219, 204, 211, 221, 206, 222, 223, 226, 208, 224, - 225, 209, 227, 229, 228, 230, 210, 231, 215, 212, - 214, 232, 216, 220, 217, 218, 219, 233, 237, 221, - - 240, 222, 223, 224, 241, 226, 225, 229, 242, 227, - 228, 238, 230, 238, 243, 244, 231, 245, 246, 247, - 232, 248, 249, 252, 233, 237, 253, 251, 240, 251, - 255, 241, 250, 250, 256, 242, 257, 238, 258, 238, - 243, 259, 244, 245, 246, 250, 247, 248, 260, 252, - 261, 249, 262, 253, 251, 251, 255, 263, 265, 266, - 256, 250, 250, 257, 267, 268, 269, 258, 259, 271, - 272, 273, 250, 274, 277, 260, 261, 276, 279, 262, - 278, 281, 282, 283, 265, 263, 266, 284, 285, 287, - 288, 267, 269, 290, 268, 292, 271, 272, 273, 293, - - 277, 274, 294, 295, 276, 279, 278, 297, 281, 283, - 299, 282, 301, 284, 300, 285, 287, 303, 305, 288, - 290, 306, 307, 308, 292, 293, 294, 309, 310, 311, - 312, 313, 295, 315, 297, 314, 319, 316, 299, 317, - 300, 301, 318, 321, 303, 305, 322, 330, 306, 324, - 307, 326, 308, 309, 327, 310, 311, 312, 331, 315, - 313, 332, 314, 316, 319, 335, 317, 337, 318, 321, - 336, 339, 340, 322, 346, 324, 330, 326, 341, 343, - 327, 348, 353, 354, 357, 358, 370, 331, 359, 332, - 371, 335, 364, 337, 336, 375, 376, 378, 340, 381, - - 339, 383, 434, 346, 341, 343, 434, 434, 383, 354, - 348, 353, 357, 497, 358, 370, 359, 371, 364, 380, - 380, 375, 496, 378, 495, 376, 380, 462, 381, 462, - 380, 462, 462, 380, 494, 380, 380, 493, 380, 515, - 515, 515, 515, 516, 516, 516, 516, 517, 517, 517, - 517, 519, 519, 520, 492, 520, 520, 521, 491, 521, - 521, 522, 490, 522, 522, 523, 523, 523, 523, 489, - 488, 484, 483, 482, 480, 479, 478, 477, 475, 474, - 473, 471, 469, 468, 467, 466, 465, 464, 463, 461, - 460, 459, 458, 457, 456, 455, 454, 453, 452, 451, - - 450, 448, 447, 446, 445, 444, 443, 442, 441, 440, - 439, 438, 437, 436, 435, 433, 431, 430, 429, 428, - 427, 426, 424, 423, 422, 421, 420, 419, 416, 415, - 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, - 404, 402, 401, 400, 398, 397, 396, 395, 394, 393, - 392, 391, 389, 388, 387, 386, 384, 377, 373, 369, - 365, 356, 350, 344, 338, 328, 302, 291, 270, 239, - 207, 205, 166, 148, 126, 109, 105, 104, 102, 80, - 57, 56, 55, 13, 4, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 514 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -char *yytext; -#line 1 "../gnumach/mig/lexxer.l" -#define INITIAL 0 -#line 15 "../gnumach/mig/lexxer.l" -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#include - -#include "mig_string.h" -#include "type.h" -#include "statement.h" -#include "global.h" -#include "parser.h" -#include "lexxer.h" -#include "cpu.h" - -#define stringize(x) #x - -#ifdef LDEBUG -#define RETURN(sym) \ -{ \ - printf("yylex: returning '%s' (%d)\n", #sym, (sym)); \ - return (sym); \ -} -#else LDEBUG -#define RETURN(sym) return (sym) -#endif LDEBUG - -#define TPRETURN(intype, outtype, tsize) \ -{ \ - yylval.symtype.innumber = (intype); \ - yylval.symtype.instr = stringize(intype); \ - yylval.symtype.outnumber = (outtype); \ - yylval.symtype.outstr = stringize(outtype); \ - yylval.symtype.size = (tsize); \ - RETURN(sySymbolicType); \ -} - -#define TRETURN(type, tsize) TPRETURN(type,type,tsize) - -#define FRETURN(val) \ -{ \ - yylval.flag = (val); \ - RETURN(syIPCFlag); \ -} - -extern YYSTYPE yylval; /* added by rm */ - -int lineno; -char *inname; - -#ifdef YY_START -static int oldYYBegin; -#define SAVE_BEGIN oldYYBegin = YY_START -#define RSTR_BEGIN BEGIN oldYYBegin -#else -static struct yysvf *oldYYBegin; -#define SAVE_BEGIN oldYYBegin = yybgin -#define RSTR_BEGIN yybgin = oldYYBegin; -#endif - -static void doSharp(const char *body); /* process body of # directives */ -#define Normal 1 -#define String 2 -#define FileName 3 -#define QString 4 -#define SkipToEOL 5 - -#line 859 "lex.yy.c" - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -static void yyunput YY_PROTO(( int c, char *buf_ptr )); -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - if ( yyleng > 0 ) \ - yy_current_buffer->yy_at_bol = \ - (yytext[yyleng - 1] == '\n'); \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 101 "../gnumach/mig/lexxer.l" - - -#line 1012 "lex.yy.c" - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; - yy_current_state += YY_AT_BOL(); -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 515 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 986 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 103 "../gnumach/mig/lexxer.l" -RETURN(syRoutine); - YY_BREAK -case 2: -YY_RULE_SETUP -#line 104 "../gnumach/mig/lexxer.l" -RETURN(syFunction); - YY_BREAK -case 3: -YY_RULE_SETUP -#line 105 "../gnumach/mig/lexxer.l" -RETURN(syProcedure); - YY_BREAK -case 4: -YY_RULE_SETUP -#line 106 "../gnumach/mig/lexxer.l" -RETURN(sySimpleProcedure); - YY_BREAK -case 5: -YY_RULE_SETUP -#line 107 "../gnumach/mig/lexxer.l" -RETURN(sySimpleRoutine); - YY_BREAK -case 6: -YY_RULE_SETUP -#line 108 "../gnumach/mig/lexxer.l" -RETURN(sySubsystem); - YY_BREAK -case 7: -YY_RULE_SETUP -#line 109 "../gnumach/mig/lexxer.l" -RETURN(syMsgOption); - YY_BREAK -case 8: -YY_RULE_SETUP -#line 110 "../gnumach/mig/lexxer.l" -RETURN(syMsgSeqno); - YY_BREAK -case 9: -YY_RULE_SETUP -#line 111 "../gnumach/mig/lexxer.l" -RETURN(syWaitTime); - YY_BREAK -case 10: -YY_RULE_SETUP -#line 112 "../gnumach/mig/lexxer.l" -RETURN(syNoWaitTime); - YY_BREAK -case 11: -YY_RULE_SETUP -#line 113 "../gnumach/mig/lexxer.l" -RETURN(syIn); - YY_BREAK -case 12: -YY_RULE_SETUP -#line 114 "../gnumach/mig/lexxer.l" -RETURN(syOut); - YY_BREAK -case 13: -YY_RULE_SETUP -#line 115 "../gnumach/mig/lexxer.l" -RETURN(syInOut); - YY_BREAK -case 14: -YY_RULE_SETUP -#line 116 "../gnumach/mig/lexxer.l" -RETURN(syRequestPort); - YY_BREAK -case 15: -YY_RULE_SETUP -#line 117 "../gnumach/mig/lexxer.l" -RETURN(syReplyPort); - YY_BREAK -case 16: -YY_RULE_SETUP -#line 118 "../gnumach/mig/lexxer.l" -RETURN(syUReplyPort); - YY_BREAK -case 17: -YY_RULE_SETUP -#line 119 "../gnumach/mig/lexxer.l" -RETURN(sySReplyPort); - YY_BREAK -case 18: -YY_RULE_SETUP -#line 120 "../gnumach/mig/lexxer.l" -RETURN(syArray); - YY_BREAK -case 19: -YY_RULE_SETUP -#line 121 "../gnumach/mig/lexxer.l" -RETURN(syOf); - YY_BREAK -case 20: -YY_RULE_SETUP -#line 122 "../gnumach/mig/lexxer.l" -RETURN(syErrorProc); - YY_BREAK -case 21: -YY_RULE_SETUP -#line 123 "../gnumach/mig/lexxer.l" -RETURN(syServerPrefix); - YY_BREAK -case 22: -YY_RULE_SETUP -#line 124 "../gnumach/mig/lexxer.l" -RETURN(syUserPrefix); - YY_BREAK -case 23: -YY_RULE_SETUP -#line 125 "../gnumach/mig/lexxer.l" -RETURN(syServerDemux); - YY_BREAK -case 24: -YY_RULE_SETUP -#line 126 "../gnumach/mig/lexxer.l" -RETURN(syRCSId); - YY_BREAK -case 25: -YY_RULE_SETUP -#line 127 "../gnumach/mig/lexxer.l" -RETURN(syImport); - YY_BREAK -case 26: -YY_RULE_SETUP -#line 128 "../gnumach/mig/lexxer.l" -RETURN(syUImport); - YY_BREAK -case 27: -YY_RULE_SETUP -#line 129 "../gnumach/mig/lexxer.l" -RETURN(sySImport); - YY_BREAK -case 28: -YY_RULE_SETUP -#line 130 "../gnumach/mig/lexxer.l" -RETURN(syType); - YY_BREAK -case 29: -YY_RULE_SETUP -#line 131 "../gnumach/mig/lexxer.l" -RETURN(syKernelServer); - YY_BREAK -case 30: -YY_RULE_SETUP -#line 132 "../gnumach/mig/lexxer.l" -RETURN(syKernelUser); - YY_BREAK -case 31: -YY_RULE_SETUP -#line 133 "../gnumach/mig/lexxer.l" -RETURN(sySkip); - YY_BREAK -case 32: -YY_RULE_SETUP -#line 134 "../gnumach/mig/lexxer.l" -RETURN(syStruct); - YY_BREAK -case 33: -YY_RULE_SETUP -#line 135 "../gnumach/mig/lexxer.l" -RETURN(syInTran); - YY_BREAK -case 34: -YY_RULE_SETUP -#line 136 "../gnumach/mig/lexxer.l" -RETURN(syOutTran); - YY_BREAK -case 35: -YY_RULE_SETUP -#line 137 "../gnumach/mig/lexxer.l" -RETURN(syDestructor); - YY_BREAK -case 36: -YY_RULE_SETUP -#line 138 "../gnumach/mig/lexxer.l" -RETURN(syCType); - YY_BREAK -case 37: -YY_RULE_SETUP -#line 139 "../gnumach/mig/lexxer.l" -RETURN(syCUserType); - YY_BREAK -case 38: -YY_RULE_SETUP -#line 140 "../gnumach/mig/lexxer.l" -RETURN(syCServerType); - YY_BREAK -case 39: -YY_RULE_SETUP -#line 141 "../gnumach/mig/lexxer.l" -RETURN(syCString); - YY_BREAK -case 40: -YY_RULE_SETUP -#line 143 "../gnumach/mig/lexxer.l" -FRETURN(flLong); - YY_BREAK -case 41: -YY_RULE_SETUP -#line 144 "../gnumach/mig/lexxer.l" -FRETURN(flNotLong); - YY_BREAK -case 42: -YY_RULE_SETUP -#line 145 "../gnumach/mig/lexxer.l" -FRETURN(flDealloc); - YY_BREAK -case 43: -YY_RULE_SETUP -#line 146 "../gnumach/mig/lexxer.l" -FRETURN(flNotDealloc); - YY_BREAK -case 44: -YY_RULE_SETUP -#line 147 "../gnumach/mig/lexxer.l" -FRETURN(flServerCopy); - YY_BREAK -case 45: -YY_RULE_SETUP -#line 148 "../gnumach/mig/lexxer.l" -FRETURN(flCountInOut); - YY_BREAK -case 46: -YY_RULE_SETUP -#line 150 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_POLYMORPHIC,word_size_in_bits); - YY_BREAK -case 47: -YY_RULE_SETUP -#line 152 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_UNSTRUCTURED,0); - YY_BREAK -case 48: -YY_RULE_SETUP -#line 153 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_BIT,1); - YY_BREAK -case 49: -YY_RULE_SETUP -#line 154 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_BOOLEAN,32); - YY_BREAK -case 50: -YY_RULE_SETUP -#line 155 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_INTEGER_16,16); - YY_BREAK -case 51: -YY_RULE_SETUP -#line 156 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_INTEGER_32,32); - YY_BREAK -case 52: -YY_RULE_SETUP -#line 157 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_INTEGER_64,64); - YY_BREAK -case 53: -YY_RULE_SETUP -#line 158 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_CHAR,8); - YY_BREAK -case 54: -YY_RULE_SETUP -#line 159 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_BYTE,8); - YY_BREAK -case 55: -YY_RULE_SETUP -#line 160 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_INTEGER_8,8); - YY_BREAK -case 56: -YY_RULE_SETUP -#line 161 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_REAL,0); - YY_BREAK -case 57: -YY_RULE_SETUP -#line 162 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_STRING,0); - YY_BREAK -case 58: -YY_RULE_SETUP -#line 163 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_STRING_C,0); - YY_BREAK -case 59: -YY_RULE_SETUP -#line 165 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_MOVE_RECEIVE,MACH_MSG_TYPE_PORT_RECEIVE,word_size_in_bits); - YY_BREAK -case 60: -YY_RULE_SETUP -#line 166 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_COPY_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); - YY_BREAK -case 61: -YY_RULE_SETUP -#line 167 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_MAKE_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); - YY_BREAK -case 62: -YY_RULE_SETUP -#line 168 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_MOVE_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); - YY_BREAK -case 63: -YY_RULE_SETUP -#line 169 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_MAKE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); - YY_BREAK -case 64: -YY_RULE_SETUP -#line 170 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_MOVE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); - YY_BREAK -case 65: -YY_RULE_SETUP -#line 172 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_PORT_NAME,word_size_in_bits); - YY_BREAK -case 66: -YY_RULE_SETUP -#line 173 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_RECEIVE,word_size_in_bits); - YY_BREAK -case 67: -YY_RULE_SETUP -#line 174 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); - YY_BREAK -case 68: -YY_RULE_SETUP -#line 175 "../gnumach/mig/lexxer.l" -TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); - YY_BREAK -case 69: -YY_RULE_SETUP -#line 176 "../gnumach/mig/lexxer.l" -TRETURN(MACH_MSG_TYPE_POLYMORPHIC,0); - YY_BREAK -case 70: -YY_RULE_SETUP -#line 178 "../gnumach/mig/lexxer.l" -RETURN(syColon); - YY_BREAK -case 71: -YY_RULE_SETUP -#line 179 "../gnumach/mig/lexxer.l" -RETURN(sySemi); - YY_BREAK -case 72: -YY_RULE_SETUP -#line 180 "../gnumach/mig/lexxer.l" -RETURN(syComma); - YY_BREAK -case 73: -YY_RULE_SETUP -#line 181 "../gnumach/mig/lexxer.l" -RETURN(syPlus); - YY_BREAK -case 74: -YY_RULE_SETUP -#line 182 "../gnumach/mig/lexxer.l" -RETURN(syMinus); - YY_BREAK -case 75: -YY_RULE_SETUP -#line 183 "../gnumach/mig/lexxer.l" -RETURN(syStar); - YY_BREAK -case 76: -YY_RULE_SETUP -#line 184 "../gnumach/mig/lexxer.l" -RETURN(syDiv); - YY_BREAK -case 77: -YY_RULE_SETUP -#line 185 "../gnumach/mig/lexxer.l" -RETURN(syLParen); - YY_BREAK -case 78: -YY_RULE_SETUP -#line 186 "../gnumach/mig/lexxer.l" -RETURN(syRParen); - YY_BREAK -case 79: -YY_RULE_SETUP -#line 187 "../gnumach/mig/lexxer.l" -RETURN(syEqual); - YY_BREAK -case 80: -YY_RULE_SETUP -#line 188 "../gnumach/mig/lexxer.l" -RETURN(syCaret); - YY_BREAK -case 81: -YY_RULE_SETUP -#line 189 "../gnumach/mig/lexxer.l" -RETURN(syTilde); - YY_BREAK -case 82: -YY_RULE_SETUP -#line 190 "../gnumach/mig/lexxer.l" -RETURN(syLAngle); - YY_BREAK -case 83: -YY_RULE_SETUP -#line 191 "../gnumach/mig/lexxer.l" -RETURN(syRAngle); - YY_BREAK -case 84: -YY_RULE_SETUP -#line 192 "../gnumach/mig/lexxer.l" -RETURN(syLBrack); - YY_BREAK -case 85: -YY_RULE_SETUP -#line 193 "../gnumach/mig/lexxer.l" -RETURN(syRBrack); - YY_BREAK -case 86: -YY_RULE_SETUP -#line 194 "../gnumach/mig/lexxer.l" -RETURN(syBar); - YY_BREAK -case 87: -YY_RULE_SETUP -#line 196 "../gnumach/mig/lexxer.l" -{ yylval.identifier = strmake(yytext); - RETURN(syIdentifier); } - YY_BREAK -case 88: -YY_RULE_SETUP -#line 198 "../gnumach/mig/lexxer.l" -{ yylval.number = atoi(yytext); RETURN(syNumber); } - YY_BREAK -case 89: -YY_RULE_SETUP -#line 200 "../gnumach/mig/lexxer.l" -{ yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syString); } - YY_BREAK -case 90: -YY_RULE_SETUP -#line 202 "../gnumach/mig/lexxer.l" -{ yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syFileName); } - YY_BREAK -case 91: -YY_RULE_SETUP -#line 204 "../gnumach/mig/lexxer.l" -{ yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syQString); } - YY_BREAK -case 92: -YY_RULE_SETUP -#line 207 "../gnumach/mig/lexxer.l" -{ doSharp(yytext+1); - SAVE_BEGIN; - BEGIN SkipToEOL; } - YY_BREAK -case 93: -YY_RULE_SETUP -#line 210 "../gnumach/mig/lexxer.l" -{ doSharp(yytext+1); - SAVE_BEGIN; - BEGIN SkipToEOL; } - YY_BREAK -case 94: -YY_RULE_SETUP -#line 213 "../gnumach/mig/lexxer.l" -{ yyerror("illegal # directive"); - SAVE_BEGIN; - BEGIN SkipToEOL; } - YY_BREAK -case 95: -YY_RULE_SETUP -#line 217 "../gnumach/mig/lexxer.l" -RSTR_BEGIN; - YY_BREAK -case 96: -YY_RULE_SETUP -#line 218 "../gnumach/mig/lexxer.l" -; - YY_BREAK -case 97: -YY_RULE_SETUP -#line 220 "../gnumach/mig/lexxer.l" -; - YY_BREAK -case 98: -YY_RULE_SETUP -#line 221 "../gnumach/mig/lexxer.l" -{ lineno++; } - YY_BREAK -case 99: -YY_RULE_SETUP -#line 222 "../gnumach/mig/lexxer.l" -{ BEGIN Normal; RETURN(syError); } - YY_BREAK -case 100: -YY_RULE_SETUP -#line 224 "../gnumach/mig/lexxer.l" -ECHO; - YY_BREAK -#line 1606 "lex.yy.c" -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(Normal): -case YY_STATE_EOF(String): -case YY_STATE_EOF(FileName): -case YY_STATE_EOF(QString): -case YY_STATE_EOF(SkipToEOL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a singled characater, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - yy_current_state += YY_AT_BOL(); - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 515 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - register char *yy_cp = yy_c_buf_p; - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 515 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 514); - - return yy_is_jam ? 0 : yy_current_state; - } - - -#ifndef YY_NO_UNPUT -#ifdef YY_USE_PROTOS -static void yyunput( int c, register char *yy_bp ) -#else -static void yyunput( c, yy_bp ) -int c; -register char *yy_bp; -#endif - { - register char *yy_cp = yy_c_buf_p; - - /* undo effects of setting up yytext */ - *yy_cp = yy_hold_char; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - { /* need to shift things up to make room */ - /* +2 for EOB chars. */ - register int number_to_move = yy_n_chars + 2; - register char *dest = &yy_current_buffer->yy_ch_buf[ - yy_current_buffer->yy_buf_size + 2]; - register char *source = - &yy_current_buffer->yy_ch_buf[number_to_move]; - - while ( source > yy_current_buffer->yy_ch_buf ) - *--dest = *--source; - - yy_cp += (int) (dest - source); - yy_bp += (int) (dest - source); - yy_n_chars = yy_current_buffer->yy_buf_size; - - if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) - YY_FATAL_ERROR( "flex scanner push-back overflow" ); - } - - *--yy_cp = (char) c; - - - yytext_ptr = yy_bp; - yy_hold_char = *yy_cp; - yy_c_buf_p = yy_cp; - } -#endif /* ifndef YY_NO_UNPUT */ - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - yytext_ptr = yy_c_buf_p; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - { - yy_c_buf_p = - yytext_ptr + YY_MORE_ADJ; - return EOF; - } - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - break; - - case EOB_ACT_LAST_MATCH: -#ifdef __cplusplus - YY_FATAL_ERROR( - "unexpected last match in yyinput()" ); -#else - YY_FATAL_ERROR( - "unexpected last match in input()" ); -#endif - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - yy_current_buffer->yy_at_bol = (c == '\n'); - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *str ) -#else -YY_BUFFER_STATE yy_scan_string( str ) -yyconst char *str; -#endif - { - int len; - for ( len = 0; str[len]; ++len ) - ; - - return yy_scan_bytes( str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n - YY_MORE_ADJ; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 224 "../gnumach/mig/lexxer.l" - - -extern void -LookNormal(void) -{ - if (inname == 0) - { - inname = strmake("(unknown)"); - lineno = 0; - } - - BEGIN Normal; -} - -extern void -LookString(void) -{ - BEGIN String; -} - -extern void -LookQString(void) -{ - BEGIN QString; -} - -extern void -LookFileName(void) -{ - BEGIN FileName; -} - -static void -doSharp(const char *body) -{ - register const char *startName; - - lineno = atoi(body); - startName = strchr(body, '"'); - if (startName != NULL) - { - *strrchr(body, '"') = '\0'; - strfree(inname); - inname = strmake(startName+1); - } -} diff --git a/mig/lexxer.h b/mig/lexxer.h deleted file mode 100644 index 822df89..0000000 --- a/mig/lexxer.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -extern int lineno; -extern char *inname; - -extern void LookFileName(void); -extern void LookString(void); -extern void LookQString(void); -extern void LookNormal(void); diff --git a/mig/lexxer.l b/mig/lexxer.l deleted file mode 100644 index 179e770..0000000 --- a/mig/lexxer.l +++ /dev/null @@ -1,269 +0,0 @@ -%k 10000 -%n 5000 -%a 20000 -%e 10000 -%p 25000 - -Ident ([A-Za-z_][A-Za-z_0-9]*) -Number ([0-9]+) -String ([-/._$A-Za-z0-9]+) -QString (\"[^"\n]*\") -AString (\<[^>\n]*\>) -FileName ({QString}|{AString}) - -%{ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#include - -#include "mig_string.h" -#include "type.h" -#include "statement.h" -#include "global.h" -#include "parser.h" -#include "lexxer.h" -#include "cpu.h" - -#define stringize(x) #x - -#ifdef LDEBUG -#define RETURN(sym) \ -{ \ - printf("yylex: returning '%s' (%d)\n", #sym, (sym)); \ - return (sym); \ -} -#else LDEBUG -#define RETURN(sym) return (sym) -#endif LDEBUG - -#define TPRETURN(intype, outtype, tsize) \ -{ \ - yylval.symtype.innumber = (intype); \ - yylval.symtype.instr = stringize(intype); \ - yylval.symtype.outnumber = (outtype); \ - yylval.symtype.outstr = stringize(outtype); \ - yylval.symtype.size = (tsize); \ - RETURN(sySymbolicType); \ -} - -#define TRETURN(type, tsize) TPRETURN(type,type,tsize) - -#define FRETURN(val) \ -{ \ - yylval.flag = (val); \ - RETURN(syIPCFlag); \ -} - -extern YYSTYPE yylval; /* added by rm */ - -int lineno; -char *inname; - -#ifdef YY_START -static int oldYYBegin; -#define SAVE_BEGIN oldYYBegin = YY_START -#define RSTR_BEGIN BEGIN oldYYBegin -#else -static struct yysvf *oldYYBegin; -#define SAVE_BEGIN oldYYBegin = yybgin -#define RSTR_BEGIN yybgin = oldYYBegin; -#endif - -static void doSharp(const char *body); /* process body of # directives */ -%} - -%Start Normal String FileName QString SkipToEOL - -%% - -[Rr][Oo][Uu][Tt][Ii][Nn][Ee] RETURN(syRoutine); -[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn] RETURN(syFunction); -[Pp][Rr][Oo][Cc][Ee][Dd][Uu][Rr][Ee] RETURN(syProcedure); -[Ss][Ii][Mm][Pp][Ll][Ee][Pp][Rr][Oo][Cc][Ee][Dd][Uu][Rr][Ee] RETURN(sySimpleProcedure); -[Ss][Ii][Mm][Pp][Ll][Ee][Rr][Oo][Uu][Tt][Ii][Nn][Ee] RETURN(sySimpleRoutine); -[Ss][Uu][Bb][Ss][Yy][Ss][Tt][Ee][Mm] RETURN(sySubsystem); -[Mm][Ss][Gg][Oo][Pp][Tt][Ii][Oo][Nn] RETURN(syMsgOption); -[Mm][Ss][Gg][Ss][Ee][Qq][Nn][Oo] RETURN(syMsgSeqno); -[Ww][Aa][Ii][Tt][Tt][Ii][Mm][Ee] RETURN(syWaitTime); -[Nn][Oo][Ww][Aa][Ii][Tt][Tt][Ii][Mm][Ee] RETURN(syNoWaitTime); -[Ii][Nn] RETURN(syIn); -[Oo][Uu][Tt] RETURN(syOut); -[Ii][Nn][Oo][Uu][Tt] RETURN(syInOut); -[Rr][Ee][Qq][Uu][Ee][Ss][Tt][Pp][Oo][Rr][Tt] RETURN(syRequestPort); -[Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt] RETURN(syReplyPort); -[Uu][Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt] RETURN(syUReplyPort); -[Ss][Rr][Ee][Pp][Ll][Yy][Pp][Oo][Rr][Tt] RETURN(sySReplyPort); -[Aa][Rr][Rr][Aa][Yy] RETURN(syArray); -[Oo][Ff] RETURN(syOf); -[Ee][Rr][Rr][Oo][Rr] RETURN(syErrorProc); -[Ss][Ee][Rr][Vv][Ee][Rr][Pp][Rr][Ee][Ff][Ii][Xx] RETURN(syServerPrefix); -[Uu][Ss][Ee][Rr][Pp][Rr][Ee][Ff][Ii][Xx] RETURN(syUserPrefix); -[Ss][Ee][Rr][Vv][Ee][Rr][Dd][Ee][Mm][Uu][Xx] RETURN(syServerDemux); -[Rr][Cc][Ss][Ii][Dd] RETURN(syRCSId); -[Ii][Mm][Pp][Oo][Rr][Tt] RETURN(syImport); -[Uu][Ii][Mm][Pp][Oo][Rr][Tt] RETURN(syUImport); -[Ss][Ii][Mm][Pp][Oo][Rr][Tt] RETURN(sySImport); -[Tt][Yy][Pp][Ee] RETURN(syType); -[Kk][Ee][Rr][Nn][Ee][Ll][Ss][Ee][Rr][Vv][Ee][Rr] RETURN(syKernelServer); -[Kk][Ee][Rr][Nn][Ee][Ll][Uu][Ss][Ee][Rr] RETURN(syKernelUser); -[Ss][Kk][Ii][Pp] RETURN(sySkip); -[Ss][Tt][Rr][Uu][Cc][Tt] RETURN(syStruct); -[Ii][Nn][Tt][Rr][Aa][Nn] RETURN(syInTran); -[Oo][Uu][Tt][Tt][Rr][Aa][Nn] RETURN(syOutTran); -[Dd][Ee][Ss][Tt][Rr][Uu][Cc][Tt][Oo][Rr] RETURN(syDestructor); -[Cc][Tt][Yy][Pp][Ee] RETURN(syCType); -[Cc][Uu][Ss][Ee][Rr][Tt][Yy][Pp][Ee] RETURN(syCUserType); -[Cc][Ss][Ee][Rr][Vv][Ee][Rr][Tt][Yy][Pp][Ee] RETURN(syCServerType); -[Cc]_[Ss][Tt][Rr][Ii][Nn][Gg] RETURN(syCString); - -[Ii][Ss][Ll][Oo][Nn][Gg] FRETURN(flLong); -[Ii][Ss][Nn][Oo][Tt][Ll][Oo][Nn][Gg] FRETURN(flNotLong); -[Dd][Ee][Aa][Ll][Ll][Oo][Cc] FRETURN(flDealloc); -[Nn][Oo][Tt][Dd][Ee][Aa][Ll][Ll][Oo][Cc] FRETURN(flNotDealloc); -[Ss][Ee][Rr][Vv][Ee][Rr][Cc][Oo][Pp][Yy] FRETURN(flServerCopy); -[Cc][Oo][Uu][Nn][Tt][Ii][Nn][Oo][Uu][Tt] FRETURN(flCountInOut); - -[Pp][Oo][Ll][Yy][Mm][Oo][Rr][Pp][Hh][Ii][Cc] TRETURN(MACH_MSG_TYPE_POLYMORPHIC,word_size_in_bits); - -"MACH_MSG_TYPE_UNSTRUCTURED" TRETURN(MACH_MSG_TYPE_UNSTRUCTURED,0); -"MACH_MSG_TYPE_BIT" TRETURN(MACH_MSG_TYPE_BIT,1); -"MACH_MSG_TYPE_BOOLEAN" TRETURN(MACH_MSG_TYPE_BOOLEAN,32); -"MACH_MSG_TYPE_INTEGER_16" TRETURN(MACH_MSG_TYPE_INTEGER_16,16); -"MACH_MSG_TYPE_INTEGER_32" TRETURN(MACH_MSG_TYPE_INTEGER_32,32); -"MACH_MSG_TYPE_INTEGER_64" TRETURN(MACH_MSG_TYPE_INTEGER_64,64); -"MACH_MSG_TYPE_CHAR" TRETURN(MACH_MSG_TYPE_CHAR,8); -"MACH_MSG_TYPE_BYTE" TRETURN(MACH_MSG_TYPE_BYTE,8); -"MACH_MSG_TYPE_INTEGER_8" TRETURN(MACH_MSG_TYPE_INTEGER_8,8); -"MACH_MSG_TYPE_REAL" TRETURN(MACH_MSG_TYPE_REAL,0); -"MACH_MSG_TYPE_STRING" TRETURN(MACH_MSG_TYPE_STRING,0); -"MACH_MSG_TYPE_STRING_C" TRETURN(MACH_MSG_TYPE_STRING_C,0); - -"MACH_MSG_TYPE_MOVE_RECEIVE" TPRETURN(MACH_MSG_TYPE_MOVE_RECEIVE,MACH_MSG_TYPE_PORT_RECEIVE,word_size_in_bits); -"MACH_MSG_TYPE_COPY_SEND" TPRETURN(MACH_MSG_TYPE_COPY_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); -"MACH_MSG_TYPE_MAKE_SEND" TPRETURN(MACH_MSG_TYPE_MAKE_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); -"MACH_MSG_TYPE_MOVE_SEND" TPRETURN(MACH_MSG_TYPE_MOVE_SEND,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); -"MACH_MSG_TYPE_MAKE_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_MAKE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); -"MACH_MSG_TYPE_MOVE_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_MOVE_SEND_ONCE,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); - -"MACH_MSG_TYPE_PORT_NAME" TRETURN(MACH_MSG_TYPE_PORT_NAME,word_size_in_bits); -"MACH_MSG_TYPE_PORT_RECEIVE" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_RECEIVE,word_size_in_bits); -"MACH_MSG_TYPE_PORT_SEND" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND,word_size_in_bits); -"MACH_MSG_TYPE_PORT_SEND_ONCE" TPRETURN(MACH_MSG_TYPE_POLYMORPHIC,MACH_MSG_TYPE_PORT_SEND_ONCE,word_size_in_bits); -"MACH_MSG_TYPE_POLYMORPHIC" TRETURN(MACH_MSG_TYPE_POLYMORPHIC,0); - -":" RETURN(syColon); -";" RETURN(sySemi); -"," RETURN(syComma); -"+" RETURN(syPlus); -"-" RETURN(syMinus); -"*" RETURN(syStar); -"/" RETURN(syDiv); -"(" RETURN(syLParen); -")" RETURN(syRParen); -"=" RETURN(syEqual); -"^" RETURN(syCaret); -"~" RETURN(syTilde); -"<" RETURN(syLAngle); -">" RETURN(syRAngle); -"[" RETURN(syLBrack); -"]" RETURN(syRBrack); -"|" RETURN(syBar); - -{Ident} { yylval.identifier = strmake(yytext); - RETURN(syIdentifier); } -{Number} { yylval.number = atoi(yytext); RETURN(syNumber); } - -{String} { yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syString); } -{FileName} { yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syFileName); } -{QString} { yylval.string = strmake(yytext); - BEGIN Normal; RETURN(syQString); } - -^\#[ \t]*{Number}[ \t]*\"[^"]*\" { doSharp(yytext+1); - SAVE_BEGIN; - BEGIN SkipToEOL; } -^\#\ *{Number} { doSharp(yytext+1); - SAVE_BEGIN; - BEGIN SkipToEOL; } -^\# { yyerror("illegal # directive"); - SAVE_BEGIN; - BEGIN SkipToEOL; } - -\n RSTR_BEGIN; -. ; - -[ \t] ; -\n { lineno++; } -. { BEGIN Normal; RETURN(syError); } - -%% - -extern void -LookNormal(void) -{ - if (inname == 0) - { - inname = strmake("(unknown)"); - lineno = 0; - } - - BEGIN Normal; -} - -extern void -LookString(void) -{ - BEGIN String; -} - -extern void -LookQString(void) -{ - BEGIN QString; -} - -extern void -LookFileName(void) -{ - BEGIN FileName; -} - -static void -doSharp(const char *body) -{ - register const char *startName; - - lineno = atoi(body); - startName = strchr(body, '"'); - if (startName != NULL) - { - *strrchr(body, '"') = '\0'; - strfree(inname); - inname = strmake(startName+1); - } -} diff --git a/mig/message.h b/mig/message.h deleted file mode 100644 index bd98086..0000000 --- a/mig/message.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 1994 The University of Utah and - * the Computer Systems Laboratory at the University of Utah (CSL). - * All rights reserved. - * - * Permission to use, copy, modify and distribute this software is hereby - * granted provided that (1) source code retains these copyright, permission, - * and disclaimer notices, and (2) redistributions including binaries - * reproduce the notices in supporting documentation, and (3) all advertising - * materials mentioning features or use of this software display the following - * acknowledgement: ``This product includes software developed by the - * Computer Systems Laboratory at the University of Utah.'' - * - * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS - * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF - * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * CSL requests users of this software to return to csl-dist@cs.utah.edu any - * improvements that they make and grant CSL redistribution rights. - * - * Author: Bryan Ford, University of Utah CSL - */ -#ifndef _MIG_MESSAGE_H -#define _MIG_MESSAGE_H - -/* This file is a substitute for mach/message.h, - to be used within MIG sources compiled for the build machine. - This way we avoid pulling in all the bogus typedefs and stuff - that would normally come with mach/message.h. */ - -#include "cpu.h" - -#define MACH_MSG_TYPE_PORT_ANY(x) \ - (((x) >= MACH_MSG_TYPE_MOVE_RECEIVE) && \ - ((x) <= MACH_MSG_TYPE_MAKE_SEND_ONCE)) - -#endif /* _MIG_MESSAGE_H */ diff --git a/mig/mig.sh b/mig/mig.sh deleted file mode 100644 index 31afb7e..0000000 --- a/mig/mig.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -# -# Mach Operating System -# Copyright (c) 1991,1990 Carnegie Mellon University -# All Rights Reserved. -# -# Permission to use, copy, modify and distribute this software and its -# documentation is hereby granted, provided that both the copyright -# notice and this permission notice appear in all copies of the -# software, derivative works or modified versions, and any portions -# thereof, and that both notices appear in supporting documentation. -# -# CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" -# CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR -# ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. -# -# Carnegie Mellon requests users of this software to return to -# -# Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU -# School of Computer Science -# Carnegie Mellon University -# Pittsburgh PA 15213-3890 -# -# any improvements or extensions that they make and grant Carnegie Mellon -# the rights to redistribute these changes. -# - -migcom=${MIGDIR-@MIGDIR@}/migcom -cpp="${CPP-@CPP@}" - -cppflags= -migflags= -files= - -# If an argument to this shell script contains whitespace, -# then we will screw up. migcom will see it as multiple arguments. -# -# As a special hack, if -i is specified first we don't pass -user to migcom. -# We do use the -user argument for the dependencies. -# In this case, the -user argument can have whitespace. - -until [ $# -eq 0 ] -do - case "$1" in - -[qQvVtTrRsS] ) migflags="$migflags $1"; shift;; - -i ) sawI=1; migflags="$migflags $1 $2"; shift; shift;; - -user ) user="$2"; if [ ! "${sawI-}" ]; then migflags="$migflags $1 $2"; fi; shift; shift;; - -server ) server="$2"; migflags="$migflags $1 $2"; shift; shift;; - -header ) header="$2"; migflags="$migflags $1 $2"; shift; shift;; - -sheader ) sheader="$2"; migflags="$migflags $1 $2"; shift; shift;; - -iheader ) iheader="$2"; migflags="$migflags $1 $2"; shift; shift;; - -prefix | -subrprefix ) migflags="$migflags $1 $2"; shift; shift;; - - -MD ) sawMD=1; cppflags="$cppflags $1"; shift;; - -imacros ) cppflags="$cppflags $1 $2"; shift; shift;; - -cc) cpp="$2"; shift; shift;; - -migcom) migcom="$2"; shift; shift;; - -* ) cppflags="$cppflags $1"; shift;; - * ) files="$files $1"; shift;; - esac -done - -for file in $files -do - $cpp $cppflags "$file" | $migcom $migflags || exit - - if [ $sawMD ] - then - base="`basename "$file"|sed 's%[.][^.]*$%%'`" - deps= - rheader="${header-${base}.h}" - if [ "$rheader" != /dev/null ]; then deps="$deps $rheader"; fi - ruser="${user-${base}User.c}" - if [ "$ruser" != /dev/null ]; then - if [ $sawI ]; then - for un in $ruser - do - deps="$deps $un" - done - else - deps="$deps $ruser" - fi - fi - rserver="${server-${base}Server.c}" - if [ "$rserver" != /dev/null ]; then deps="$deps $rserver"; fi - rsheader="${sheader-/dev/null}" - if [ "$rsheader" != /dev/null ]; then deps="$deps $rsheader"; fi - riheader="${iheader-/dev/null}" - if [ "$riheader" != /dev/null ]; then deps="$deps $riheader"; fi - sed 's%^[^:]*:%'"${deps}"':%' <"${base}.d" >"${base}-mig.d" - rm -f ${base}.d - fi -done - -exit 0 diff --git a/mig/mig_string.h b/mig/mig_string.h deleted file mode 100644 index d6cef95..0000000 --- a/mig/mig_string.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _MIG_STRING_H -#define _MIG_STRING_H - -#include - -#include "boolean.h" - -typedef char *string_t; -typedef const char *const_string_t; -typedef const_string_t identifier_t; - -#define strNULL ((string_t) 0) - -extern string_t strmake(const char *string); -extern string_t strconcat(const_string_t left, const_string_t right); -extern void strfree(string_t string); - -#define streql(a, b) (strcmp((a), (b)) == 0) - -extern const char *strbool(boolean_t bool); -extern const char *strstring(const_string_t string); - -#endif /* _MIG_STRING_H */ diff --git a/mig/migcom.c b/mig/migcom.c deleted file mode 100644 index bfd6724..0000000 --- a/mig/migcom.c +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1993,1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -/* - * Switches are; - * -[v,Q] verbose or not quiet: prints out type - * and routine information as mig runs. - * -[V,q] not verbose or quiet : don't print - * information during compilation - * (this is the default) - * -[r,R] do or don't use rpc calls instead of - * send/receive pairs. Default is -r. - * -[s,S] generate symbol table or not: generate a - * table of rpc-name, number, routine triplets - * as an external data structure -- main use is - * for protection system's specification of rights - * and for protection dispatch code. Default is -s. - * -i - * Put each user routine in its own file. The - * file is named .c. - * -user - * Name the user-side file - * -server - * Name the server-side file - * -header - * Name the user-side header file - * -iheader - * Name the user-side internal header file - * -sheader - * NAme the server-side header file - * - * DESIGN: - * Mig uses a lexxer module created by lex from lexxer.l and - * a parser module created by yacc from parser.y to parse an - * interface definitions module for a mach server. - * The parser module calls routines in statement.c - * and routines.c to build a list of statement structures. - * The most interesting statements are the routine definitions - * which contain information about the name, type, characteristics - * of the routine, an argument list containing information for - * each argument type, and a list of special arguments. The - * argument type structures are build by routines in type.c - * Once parsing is completed, the three code generation modules: - * header.c user.c and server.c are called sequentially. These - * do some code generation directly and also call the routines - * in utils.c for common (parameterized) code generation. - * - */ - -#include - -#include "error.h" -#include "lexxer.h" -#include "global.h" -#include "write.h" - -extern int yyparse(); -static FILE *myfopen(const char *name, const char *mode); - -static void -parseArgs(int argc, char **argv) -{ - while (--argc > 0) - if ((++argv)[0][0] == '-') - { - switch (argv[0][1]) - { - case 'q': - BeQuiet = TRUE; - break; - case 'Q': - BeQuiet = FALSE; - break; - case 'v': - BeVerbose = TRUE; - break; - case 'V': - BeVerbose = FALSE; - break; - case 'r': - UseMsgRPC = TRUE; - break; - case 'R': - UseMsgRPC = FALSE; - break; - case 's': - if (streql(argv[0], "-server")) - { - --argc; ++argv; - if (argc == 0) - fatal("missing name for -server option"); - ServerFileName = strmake(argv[0]); - } - else if (streql(argv[0], "-sheader")) - { - --argc; ++argv; - if (argc == 0) - fatal ("missing name for -sheader option"); - ServerHeaderFileName = strmake(argv[0]); - } - else if (streql(argv[0], "-subrprefix")) - { - --argc; ++argv; - if (argc == 0) - fatal ("missing string for -subrprefix option"); - SubrPrefix = strmake(argv[0]); - } - else - GenSymTab = TRUE; - break; - case 'S': - GenSymTab = FALSE; - break; - case 'i': - if (streql(argv[0], "-iheader")) - { - --argc; ++argv; - if (argc == 0) - fatal("missing name for -iheader option"); - InternalHeaderFileName = strmake(argv[0]); - } - else - { - --argc; ++argv; - if (argc == 0) - fatal("missing prefix for -i option"); - UserFilePrefix = strmake(argv[0]); - } - break; - case 'u': - if (streql(argv[0], "-user")) - { - --argc; ++argv; - if (argc == 0) - fatal("missing name for -user option"); - UserFileName = strmake(argv[0]); - } - else - fatal("unknown flag: '%s'", argv[0]); - break; - case 'h': - if (streql(argv[0], "-header")) - { - --argc; ++argv; - if (argc == 0) - fatal("missing name for -header option"); - UserHeaderFileName = strmake(argv[0]); - } - else - fatal("unknown flag: '%s'", argv[0]); - break; - case 'p': - if (streql(argv[0], "-prefix")) - { - if (--argc == 0) - fatal ("missing string for -prefix option"); - RoutinePrefix = strmake(*++argv); - } - break; - default: - fatal("unknown flag: '%s'", argv[0]); - /*NOTREACHED*/ - } - } - else - fatal("bad argument: '%s'", *argv); -} - -void -main(int argc, char **argv) -{ - FILE *uheader, *server, *user; - FILE *iheader, *sheader; - - set_program_name("mig"); - parseArgs(argc, argv); - init_global(); - init_type(); - - LookNormal(); - (void) yyparse(); - - if (errors > 0) - exit(1); - - more_global(); - - uheader = myfopen(UserHeaderFileName, "w"); - if (!UserFilePrefix) - user = myfopen(UserFileName, "w"); - server = myfopen(ServerFileName, "w"); - if (ServerHeaderFileName) - sheader = myfopen(ServerHeaderFileName, "w"); - if (IsKernelServer) - { - iheader = myfopen(InternalHeaderFileName, "w"); - } - - if (BeVerbose) - { - printf("Writing %s ... ", UserHeaderFileName); - fflush(stdout); - } - WriteUserHeader(uheader, StatementList); - fclose(uheader); - if (ServerHeaderFileName) - { - if (BeVerbose) - { - printf ("done.\nWriting %s ...", ServerHeaderFileName); - fflush (stdout); - } - WriteServerHeader(sheader, StatementList); - fclose(sheader); - } - if (IsKernelServer) - { - if (BeVerbose) - { - printf("done.\nWriting %s ... ", InternalHeaderFileName); - fflush(stdout); - } - WriteInternalHeader(iheader, StatementList); - fclose(iheader); - } - if (UserFilePrefix) - { - if (BeVerbose) - { - printf("done.\nWriting individual user files ... "); - fflush(stdout); - } - WriteUserIndividual(StatementList); - } - else - { - if (BeVerbose) - { - printf("done.\nWriting %s ... ", UserFileName); - fflush(stdout); - } - WriteUser(user, StatementList); - fclose(user); - } - if (BeVerbose) - { - printf("done.\nWriting %s ... ", ServerFileName); - fflush(stdout); - } - WriteServer(server, StatementList); - fclose(server); - if (BeVerbose) - printf("done.\n"); - - exit(0); -} - -static FILE * -myfopen(const char *name, const char *mode) -{ - const char *realname; - FILE *file; - extern int errno; - - if (name == strNULL) - realname = "/dev/null"; - else - realname = name; - - file = fopen(realname, mode); - if (file == NULL) - fatal("fopen(%s): %s", realname, unix_error_string(errno)); - - return file; -} diff --git a/mig/parser.c b/mig/parser.c deleted file mode 100644 index c2ba442..0000000 --- a/mig/parser.c +++ /dev/null @@ -1,1700 +0,0 @@ - -/* A Bison parser, made from ../gnumach/mig/parser.y - by Bison version A2.5 (Andrew Consortium) - */ - -#define YYBISON 1 /* Identify Bison output. */ - -#define sySkip 258 -#define syRoutine 259 -#define sySimpleRoutine 260 -#define sySimpleProcedure 261 -#define syProcedure 262 -#define syFunction 263 -#define sySubsystem 264 -#define syKernelUser 265 -#define syKernelServer 266 -#define syMsgOption 267 -#define syMsgSeqno 268 -#define syWaitTime 269 -#define syNoWaitTime 270 -#define syErrorProc 271 -#define syServerPrefix 272 -#define syUserPrefix 273 -#define syServerDemux 274 -#define syRCSId 275 -#define syImport 276 -#define syUImport 277 -#define sySImport 278 -#define syIn 279 -#define syOut 280 -#define syInOut 281 -#define syRequestPort 282 -#define syReplyPort 283 -#define sySReplyPort 284 -#define syUReplyPort 285 -#define syType 286 -#define syArray 287 -#define syStruct 288 -#define syOf 289 -#define syInTran 290 -#define syOutTran 291 -#define syDestructor 292 -#define syCType 293 -#define syCUserType 294 -#define syCServerType 295 -#define syCString 296 -#define syColon 297 -#define sySemi 298 -#define syComma 299 -#define syPlus 300 -#define syMinus 301 -#define syStar 302 -#define syDiv 303 -#define syLParen 304 -#define syRParen 305 -#define syEqual 306 -#define syCaret 307 -#define syTilde 308 -#define syLAngle 309 -#define syRAngle 310 -#define syLBrack 311 -#define syRBrack 312 -#define syBar 313 -#define syError 314 -#define syNumber 315 -#define sySymbolicType 316 -#define syIdentifier 317 -#define syString 318 -#define syQString 319 -#define syFileName 320 -#define syIPCFlag 321 - -#line 117 "../gnumach/mig/parser.y" - - -#include - -#include "error.h" -#include "lexxer.h" -#include "global.h" -#include "mig_string.h" -#include "type.h" -#include "routine.h" -#include "statement.h" - -static const char *import_name(statement_kind_t sk); - -void -yyerror(const char *s) -{ - error(s); -} - -#line 138 "../gnumach/mig/parser.y" -typedef union -{ - u_int number; - identifier_t identifier; - const_string_t string; - statement_kind_t statement_kind; - ipc_type_t *type; - struct - { - u_int innumber; /* msgt_name value, when sending */ - const_string_t instr; - u_int outnumber; /* msgt_name value, when receiving */ - const_string_t outstr; - u_int size; /* 0 means there is no default size */ - } symtype; - routine_t *routine; - arg_kind_t direction; - argument_t *argument; - ipc_flags_t flag; -} YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif -#endif - - - -#define YYFINAL 213 -#define YYFLAG -32768 -#define YYNTBASE 67 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 321 ? yytranslate[x] : 112) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 66 -}; - -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 1, 4, 7, 10, 13, 16, 19, 22, 25, - 28, 31, 34, 38, 41, 44, 46, 49, 54, 56, - 57, 60, 62, 64, 66, 68, 72, 76, 78, 81, - 84, 87, 90, 94, 96, 98, 100, 104, 107, 111, - 113, 122, 131, 139, 144, 149, 154, 156, 158, 161, - 164, 167, 170, 172, 174, 181, 182, 186, 192, 194, - 196, 198, 202, 204, 209, 215, 223, 229, 235, 240, - 247, 251, 255, 259, 263, 265, 269, 271, 273, 275, - 277, 279, 283, 287, 291, 295, 300, 303, 307, 309, - 313, 318, 319, 321, 323, 325, 327, 329, 331, 333, - 335, 337, 339, 342, 345, 346, 347 -}; - -static const short yyrhs[] = { -1, - 67, 68, 0, 69, 43, 0, 76, 43, 0, 75, - 43, 0, 77, 43, 0, 78, 43, 0, 79, 43, - 0, 80, 43, 0, 84, 43, 0, 98, 43, 0, - 3, 43, 0, 3, 60, 43, 0, 81, 43, 0, - 83, 43, 0, 43, 0, 1, 43, 0, 70, 71, - 73, 74, 0, 9, 0, 0, 71, 72, 0, 10, - 0, 11, 0, 62, 0, 60, 0, 109, 12, 63, - 0, 109, 14, 63, 0, 15, 0, 16, 62, 0, - 17, 62, 0, 18, 62, 0, 19, 62, 0, 110, - 82, 65, 0, 21, 0, 22, 0, 23, 0, 111, - 20, 64, 0, 31, 85, 0, 62, 51, 86, 0, - 87, 0, 86, 35, 42, 62, 62, 49, 62, 50, - 0, 86, 36, 42, 62, 62, 49, 62, 50, 0, - 86, 37, 42, 62, 49, 62, 50, 0, 86, 38, - 42, 62, 0, 86, 39, 42, 62, 0, 86, 40, - 42, 62, 0, 88, 0, 92, 0, 93, 87, 0, - 94, 87, 0, 52, 87, 0, 95, 87, 0, 96, - 0, 91, 0, 49, 91, 44, 97, 89, 50, 0, - 0, 89, 44, 66, 0, 89, 44, 66, 56, 57, - 0, 60, 0, 61, 0, 90, 0, 90, 58, 90, - 0, 62, 0, 32, 56, 57, 34, 0, 32, 56, - 47, 57, 34, 0, 32, 56, 47, 42, 97, 57, - 34, 0, 32, 56, 97, 57, 34, 0, 33, 56, - 97, 57, 34, 0, 41, 56, 97, 57, 0, 41, - 56, 47, 42, 97, 57, 0, 97, 45, 97, 0, - 97, 46, 97, 0, 97, 47, 97, 0, 97, 48, - 97, 0, 60, 0, 49, 97, 50, 0, 99, 0, - 100, 0, 101, 0, 102, 0, 103, 0, 4, 62, - 104, 0, 5, 62, 104, 0, 7, 62, 104, 0, - 6, 62, 104, 0, 8, 62, 104, 108, 0, 49, - 50, 0, 49, 105, 50, 0, 106, 0, 106, 43, - 105, 0, 107, 62, 108, 89, 0, 0, 24, 0, - 25, 0, 26, 0, 27, 0, 28, 0, 29, 0, - 30, 0, 14, 0, 12, 0, 13, 0, 42, 62, - 0, 42, 85, 0, 0, 0, 0 -}; - -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 161, 162, 165, 166, 167, 168, 169, 170, 171, 172, - 173, 183, 185, 187, 188, 189, 190, 194, 207, 219, - 220, 223, 229, 237, 240, 243, 260, 266, 274, 282, - 290, 298, 306, 317, 318, 319, 322, 332, 342, 346, - 348, 368, 388, 403, 417, 426, 438, 440, 442, 444, - 446, 448, 450, 454, 460, 469, 471, 478, 487, 493, - 497, 499, 523, 527, 529, 531, 536, 540, 544, 546, - 551, 553, 555, 557, 559, 561, 566, 567, 568, 569, - 570, 573, 577, 581, 585, 589, 593, 595, 600, 602, - 609, 619, 620, 621, 622, 623, 624, 625, 626, 627, - 628, 629, 632, 638, 642, 646, 650 -}; -#endif - - -#if YYDEBUG != 0 - -static const char * const yytname[] = { "$","error","$undefined.","sySkip", -"syRoutine","sySimpleRoutine","sySimpleProcedure","syProcedure","syFunction", -"sySubsystem","syKernelUser","syKernelServer","syMsgOption","syMsgSeqno","syWaitTime", -"syNoWaitTime","syErrorProc","syServerPrefix","syUserPrefix","syServerDemux", -"syRCSId","syImport","syUImport","sySImport","syIn","syOut","syInOut","syRequestPort", -"syReplyPort","sySReplyPort","syUReplyPort","syType","syArray","syStruct","syOf", -"syInTran","syOutTran","syDestructor","syCType","syCUserType","syCServerType", -"syCString","syColon","sySemi","syComma","syPlus","syMinus","syStar","syDiv", -"syLParen","syRParen","syEqual","syCaret","syTilde","syLAngle","syRAngle","syLBrack", -"syRBrack","syBar","syError","syNumber","sySymbolicType","syIdentifier","syString", -"syQString","syFileName","syIPCFlag","Statements","Statement","Subsystem","SubsystemStart", -"SubsystemMods","SubsystemMod","SubsystemName","SubsystemBase","MsgOption","WaitTime", -"Error","ServerPrefix","UserPrefix","ServerDemux","Import","ImportIndicant", -"RCSDecl","TypeDecl","NamedTypeSpec","TransTypeSpec","TypeSpec","BasicTypeSpec", -"IPCFlags","PrimIPCType","IPCType","PrevTypeSpec","VarArrayHead","ArrayHead", -"StructHead","CStringSpec","IntExp","RoutineDecl","Routine","SimpleRoutine", -"Procedure","SimpleProcedure","Function","Arguments","ArgumentList","Argument", -"Direction","ArgumentType","LookString","LookFileName","LookQString", NULL -}; -#endif - -static const short yyr1[] = { 0, - 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 69, 70, 71, - 71, 72, 72, 73, 74, 75, 76, 76, 77, 78, - 79, 80, 81, 82, 82, 82, 83, 84, 85, 86, - 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, - 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, - 91, 91, 92, 93, 93, 93, 94, 95, 96, 96, - 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, - 98, 99, 100, 101, 102, 103, 104, 104, 105, 105, - 106, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 108, 108, 109, 110, 111 -}; - -static const short yyr2[] = { 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 2, 1, 2, 4, 1, 0, - 2, 1, 1, 1, 1, 3, 3, 1, 2, 2, - 2, 2, 3, 1, 1, 1, 3, 2, 3, 1, - 8, 8, 7, 4, 4, 4, 1, 1, 2, 2, - 2, 2, 1, 1, 6, 0, 3, 5, 1, 1, - 1, 3, 1, 4, 5, 7, 5, 5, 4, 6, - 3, 3, 3, 3, 1, 3, 1, 1, 1, 1, - 1, 3, 3, 3, 3, 4, 2, 3, 1, 3, - 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 0, 0, 0 -}; - -static const short yydefact[] = { 1, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 28, - 0, 0, 0, 0, 0, 16, 2, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, - 78, 79, 80, 81, 0, 0, 0, 17, 12, 0, - 0, 0, 0, 0, 0, 29, 30, 31, 32, 0, - 38, 3, 0, 5, 4, 6, 7, 8, 9, 14, - 15, 10, 11, 0, 0, 34, 35, 36, 0, 0, - 13, 92, 82, 83, 85, 84, 0, 0, 22, 23, - 24, 21, 0, 26, 27, 33, 37, 101, 102, 100, - 93, 94, 95, 96, 97, 98, 99, 87, 0, 89, - 0, 0, 86, 0, 0, 0, 0, 0, 59, 60, - 63, 39, 40, 47, 61, 54, 48, 0, 0, 0, - 53, 25, 18, 88, 92, 0, 103, 104, 0, 0, - 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, - 49, 50, 52, 90, 56, 0, 0, 0, 75, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 91, 0, 0, 0, 64, 0, 0, 0, 0, - 0, 0, 0, 69, 56, 0, 0, 0, 44, 45, - 46, 0, 0, 65, 76, 71, 72, 73, 74, 67, - 68, 0, 0, 0, 0, 0, 57, 0, 70, 55, - 0, 0, 0, 0, 66, 0, 0, 43, 58, 41, - 42, 0, 0 -}; - -static const short yydefgoto[] = { 1, - 17, 18, 19, 53, 82, 83, 123, 20, 21, 22, - 23, 24, 25, 26, 69, 27, 28, 51, 112, 113, - 114, 162, 115, 116, 117, 118, 119, 120, 121, 150, - 29, 30, 31, 32, 33, 34, 73, 99, 100, 101, - 103, 35, 36, 37 -}; - -static const short yypact[] = {-32768, - 2, -5, -31, -16, 27, 28, 30, 33,-32768,-32768, - 35, 49, 71, 72, 89,-32768,-32768, 6,-32768, 60, - 67, 107, 109, 110, 111, 112, 113, 114, 115,-32768, --32768,-32768,-32768,-32768, 56, 9, 51,-32768,-32768, 116, - 117, 117, 117, 117, 117,-32768,-32768,-32768,-32768, 118, --32768,-32768, -10,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 98, 99,-32768,-32768,-32768, 95, 100, --32768, 48,-32768,-32768,-32768,-32768, 121, 47,-32768,-32768, --32768,-32768, 105,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 120, 124, - 106, 119,-32768, 122, 123, 126, -7, 47,-32768,-32768, --32768, 101,-32768,-32768, 125,-32768,-32768, 47, 47, 47, --32768,-32768,-32768,-32768, 88, 121, 118,-32768, -13, -45, - -12, 127,-32768, 130, 131, 132, 133, 134, 135, -7, --32768,-32768,-32768,-32768,-32768, -29, -45, 146,-32768, -6, - 10, 142, 36, -45, 128, 129, 136, 137, 138, 139, --32768, 141, -45, 152, 82,-32768, -45, -45, -45, -45, - 153, 154, -45,-32768, 97, 140, 143, 144,-32768,-32768, --32768, 145, 74,-32768,-32768, 39, 39,-32768,-32768,-32768, --32768, 78, 41, 147, 148, 150, 151, 155,-32768,-32768, - 156, 157, 158, 149,-32768, 159, 160,-32768,-32768,-32768, --32768, 192,-32768 -}; - -static const short yypgoto[] = {-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768, 92,-32768, -14, --32768, 20, 63, 108,-32768,-32768,-32768,-32768,-32768, -104, --32768,-32768,-32768,-32768,-32768,-32768, 104, 79,-32768,-32768, - 87,-32768,-32768,-32768 -}; - - -#define YYLAST 219 - - -static const short yytable[] = { 79, - 80, 212, 2, 147, 3, 4, 5, 6, 7, 8, - 9, 39, 163, -105, 149, -105, 10, 11, 12, 13, - 14, -107, -106, -106, -106, 151, 153, 164, 40, 66, - 67, 68, 15, 146, 152, 147, 147, 38, 167, 168, - 169, 170, 165, 148, 16, 41, 149, 149, 52, 175, - 171, 81, 109, 110, 167, 168, 169, 170, 183, 88, - 89, 90, 186, 187, 188, 189, 172, 64, 192, 65, - 70, 91, 92, 93, 94, 95, 96, 97, 104, 105, - 167, 168, 169, 170, 182, 169, 170, 106, 42, 43, - 200, 44, 174, 133, 45, 107, 46, 98, 108, 88, - 89, 90, 54, 141, 142, 143, 109, 110, 111, 55, - 47, 91, 92, 93, 94, 95, 96, 97, 167, 168, - 169, 170, 167, 168, 169, 170, 167, 168, 169, 170, - 198, 185, 48, 49, 199, 134, 135, 136, 137, 138, - 139, 167, 168, 169, 170, 74, 75, 76, 77, 56, - 50, 57, 58, 59, 60, 61, 62, 63, 71, 86, - 84, 85, 102, 87, 122, 72, 125, 126, 78, 124, - 154, 155, 156, 157, 158, 159, 160, 129, 130, 166, - 127, 131, 140, 173, 182, 184, 190, 191, 205, 176, - 177, 213, 196, 128, 193, 201, 202, 178, 179, 180, - 181, 194, 161, 144, 195, 209, 204, 208, 210, 211, - 197, 203, 145, 0, 132, 0, 0, 206, 207 -}; - -static const short yycheck[] = { 10, - 11, 0, 1, 49, 3, 4, 5, 6, 7, 8, - 9, 43, 42, 12, 60, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 130, 131, 57, 60, 21, - 22, 23, 31, 47, 47, 49, 49, 43, 45, 46, - 47, 48, 147, 57, 43, 62, 60, 60, 43, 154, - 57, 62, 60, 61, 45, 46, 47, 48, 163, 12, - 13, 14, 167, 168, 169, 170, 57, 12, 173, 14, - 20, 24, 25, 26, 27, 28, 29, 30, 32, 33, - 45, 46, 47, 48, 44, 47, 48, 41, 62, 62, - 50, 62, 57, 108, 62, 49, 62, 50, 52, 12, - 13, 14, 43, 118, 119, 120, 60, 61, 62, 43, - 62, 24, 25, 26, 27, 28, 29, 30, 45, 46, - 47, 48, 45, 46, 47, 48, 45, 46, 47, 48, - 57, 50, 62, 62, 57, 35, 36, 37, 38, 39, - 40, 45, 46, 47, 48, 42, 43, 44, 45, 43, - 62, 43, 43, 43, 43, 43, 43, 43, 43, 65, - 63, 63, 42, 64, 60, 49, 43, 62, 51, 50, - 44, 42, 42, 42, 42, 42, 42, 56, 56, 34, - 62, 56, 58, 42, 44, 34, 34, 34, 34, 62, - 62, 0, 49, 102, 175, 49, 49, 62, 62, 62, - 62, 62, 140, 125, 62, 57, 56, 50, 50, 50, - 66, 62, 126, -1, 107, -1, -1, 62, 62 -}; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" - -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ - -#ifndef alloca -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) -#include -#else /* not sparc */ -#if defined (MSDOS) && !defined (__TURBOC__) -#include -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -#include - #pragma alloca -#else /* not MSDOS, __TURBOC__, or _AIX */ -#ifdef __hpux -#ifdef __cplusplus -extern "C" { -void *alloca (unsigned int); -}; -#else /* not __cplusplus */ -void *alloca (); -#endif /* not __cplusplus */ -#endif /* __hpux */ -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc. */ -#endif /* not GNU C. */ -#endif /* alloca not defined. */ - -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 -#define YYEOF 0 -#define YYACCEPT return(0) -#define YYABORT return(1) -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ -#define YYFAIL goto yyerrlab -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ - YYPOPSTACK; \ - goto yybackup; \ - } \ - else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ -while (0) - -#define YYTERROR 1 -#define YYERRCODE 256 - -#ifndef YYPURE -#define YYLEX yylex() -#endif - -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif - -/* If nonreentrant, generate the variables here */ - -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ -#endif - -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ - -#ifndef YYINITDEPTH -#define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ - -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH -#endif - -#ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 -#endif - -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ -int yyparse (void); -#endif - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (from, to, count) - char *from; - char *to; - int count; -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#else /* __cplusplus */ - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *from, char *to, int count) -{ - register char *f = from; - register char *t = to; - register int i = count; - - while (i-- > 0) - *t++ = *f++; -} - -#endif -#endif - -#line 192 "/usr/share/bison.simple" - -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ - -#ifdef YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#else -#define YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#endif - -int -yyparse(YYPARSE_PARAM) - YYPARSE_PARAM_DECL -{ - register int yystate; - register int yyn; - register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ - -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else -#define YYPOPSTACK (yyvsp--, yyssp--) -#endif - - int yystacksize = YYINITDEPTH; - -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ - - int yylen; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss - 1; - yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif - -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; - -#ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif -#else /* no yyoverflow */ - /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - return 2; - } - yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) - yystacksize = YYMAXDEPTH; - yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp)); - yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp)); -#endif -#endif /* no yyoverflow */ - - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - - if (yyssp >= yyss + yystacksize - 1) - YYABORT; - } - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif - - goto yybackup; - yybackup: - -/* Do appropriate processing given the current state. */ -/* Read a lookahead token if we need one and don't already have one. */ -/* yyresume: */ - - /* First try to decide what to do without reference to lookahead token. */ - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - - if (yychar == YYEMPTY) - { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif - yychar = YYLEX; - } - - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ - { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif - } - else - { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif - } - - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) - goto yydefault; - - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrlab; - - if (yyn == YYFINAL) - YYACCEPT; - - /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif - - /* Discard the token being shifted unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; - - yystate = yyn; - goto yynewstate; - -/* Do the default action for the current state. */ -yydefault: - - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - -/* Do a reduction. yyn is the number of a rule to reduce with. */ -yyreduce: - yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif - - - switch (yyn) { - -case 11: -#line 174 "../gnumach/mig/parser.y" -{ - register statement_t *st = stAlloc(); - - st->stKind = skRoutine; - st->stRoutine = yyvsp[-1].routine; - rtCheckRoutine(yyvsp[-1].routine); - if (BeVerbose) - rtPrintRoutine(yyvsp[-1].routine); -; - break;} -case 12: -#line 184 "../gnumach/mig/parser.y" -{ rtSkip(1); ; - break;} -case 13: -#line 186 "../gnumach/mig/parser.y" -{ rtSkip(yyvsp[-1].number); ; - break;} -case 17: -#line 191 "../gnumach/mig/parser.y" -{ yyerrok; ; - break;} -case 18: -#line 196 "../gnumach/mig/parser.y" -{ - if (BeVerbose) - { - printf("Subsystem %s: base = %u%s%s\n\n", - SubsystemName, SubsystemBase, - IsKernelUser ? ", KernelUser" : "", - IsKernelServer ? ", KernelServer" : ""); - } -; - break;} -case 19: -#line 208 "../gnumach/mig/parser.y" -{ - if (SubsystemName != strNULL) - { - warn("previous Subsystem decl (of %s) will be ignored", SubsystemName); - IsKernelUser = FALSE; - IsKernelServer = FALSE; - strfree((string_t) SubsystemName); - } -; - break;} -case 22: -#line 224 "../gnumach/mig/parser.y" -{ - if (IsKernelUser) - warn("duplicate KernelUser keyword"); - IsKernelUser = TRUE; -; - break;} -case 23: -#line 230 "../gnumach/mig/parser.y" -{ - if (IsKernelServer) - warn("duplicate KernelServer keyword"); - IsKernelServer = TRUE; -; - break;} -case 24: -#line 237 "../gnumach/mig/parser.y" -{ SubsystemName = yyvsp[0].identifier; ; - break;} -case 25: -#line 240 "../gnumach/mig/parser.y" -{ SubsystemBase = yyvsp[0].number; ; - break;} -case 26: -#line 244 "../gnumach/mig/parser.y" -{ - if (streql(yyvsp[0].string, "MACH_MSG_OPTION_NONE")) - { - MsgOption = strNULL; - if (BeVerbose) - printf("MsgOption: canceled\n\n"); - } - else - { - MsgOption = yyvsp[0].string; - if (BeVerbose) - printf("MsgOption %s\n\n",yyvsp[0].string); - } -; - break;} -case 27: -#line 261 "../gnumach/mig/parser.y" -{ - WaitTime = yyvsp[0].string; - if (BeVerbose) - printf("WaitTime %s\n\n", WaitTime); -; - break;} -case 28: -#line 267 "../gnumach/mig/parser.y" -{ - WaitTime = strNULL; - if (BeVerbose) - printf("NoWaitTime\n\n"); -; - break;} -case 29: -#line 275 "../gnumach/mig/parser.y" -{ - ErrorProc = yyvsp[0].identifier; - if (BeVerbose) - printf("ErrorProc %s\n\n", ErrorProc); -; - break;} -case 30: -#line 283 "../gnumach/mig/parser.y" -{ - ServerPrefix = yyvsp[0].identifier; - if (BeVerbose) - printf("ServerPrefix %s\n\n", ServerPrefix); -; - break;} -case 31: -#line 291 "../gnumach/mig/parser.y" -{ - UserPrefix = yyvsp[0].identifier; - if (BeVerbose) - printf("UserPrefix %s\n\n", UserPrefix); -; - break;} -case 32: -#line 299 "../gnumach/mig/parser.y" -{ - ServerDemux = yyvsp[0].identifier; - if (BeVerbose) - printf("ServerDemux %s\n\n", ServerDemux); -; - break;} -case 33: -#line 307 "../gnumach/mig/parser.y" -{ - register statement_t *st = stAlloc(); - st->stKind = yyvsp[-1].statement_kind; - st->stFileName = yyvsp[0].string; - - if (BeVerbose) - printf("%s %s\n\n", import_name(yyvsp[-1].statement_kind), yyvsp[0].string); -; - break;} -case 34: -#line 317 "../gnumach/mig/parser.y" -{ yyval.statement_kind = skImport; ; - break;} -case 35: -#line 318 "../gnumach/mig/parser.y" -{ yyval.statement_kind = skUImport; ; - break;} -case 36: -#line 319 "../gnumach/mig/parser.y" -{ yyval.statement_kind = skSImport; ; - break;} -case 37: -#line 323 "../gnumach/mig/parser.y" -{ - if (RCSId != strNULL) - warn("previous RCS decl will be ignored"); - if (BeVerbose) - printf("RCSId %s\n\n", yyvsp[0].string); - RCSId = yyvsp[0].string; -; - break;} -case 38: -#line 333 "../gnumach/mig/parser.y" -{ - register identifier_t name = yyvsp[0].type->itName; - - if (itLookUp(name) != itNULL) - warn("overriding previous definition of %s", name); - itInsert(name, yyvsp[0].type); -; - break;} -case 39: -#line 343 "../gnumach/mig/parser.y" -{ itTypeDecl(yyvsp[-2].identifier, yyval.type = yyvsp[0].type); ; - break;} -case 40: -#line 347 "../gnumach/mig/parser.y" -{ yyval.type = itResetType(yyvsp[0].type); ; - break;} -case 41: -#line 350 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-7].type; - - if ((yyval.type->itTransType != strNULL) && !streql(yyval.type->itTransType, yyvsp[-4].identifier)) - warn("conflicting translation types (%s, %s)", - yyval.type->itTransType, yyvsp[-4].identifier); - yyval.type->itTransType = yyvsp[-4].identifier; - - if ((yyval.type->itInTrans != strNULL) && !streql(yyval.type->itInTrans, yyvsp[-3].identifier)) - warn("conflicting in-translation functions (%s, %s)", - yyval.type->itInTrans, yyvsp[-3].identifier); - yyval.type->itInTrans = yyvsp[-3].identifier; - - if ((yyval.type->itServerType != strNULL) && !streql(yyval.type->itServerType, yyvsp[-1].identifier)) - warn("conflicting server types (%s, %s)", - yyval.type->itServerType, yyvsp[-1].identifier); - yyval.type->itServerType = yyvsp[-1].identifier; -; - break;} -case 42: -#line 370 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-7].type; - - if ((yyval.type->itServerType != strNULL) && !streql(yyval.type->itServerType, yyvsp[-4].identifier)) - warn("conflicting server types (%s, %s)", - yyval.type->itServerType, yyvsp[-4].identifier); - yyval.type->itServerType = yyvsp[-4].identifier; - - if ((yyval.type->itOutTrans != strNULL) && !streql(yyval.type->itOutTrans, yyvsp[-3].identifier)) - warn("conflicting out-translation functions (%s, %s)", - yyval.type->itOutTrans, yyvsp[-3].identifier); - yyval.type->itOutTrans = yyvsp[-3].identifier; - - if ((yyval.type->itTransType != strNULL) && !streql(yyval.type->itTransType, yyvsp[-1].identifier)) - warn("conflicting translation types (%s, %s)", - yyval.type->itTransType, yyvsp[-1].identifier); - yyval.type->itTransType = yyvsp[-1].identifier; -; - break;} -case 43: -#line 390 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-6].type; - - if ((yyval.type->itDestructor != strNULL) && !streql(yyval.type->itDestructor, yyvsp[-3].identifier)) - warn("conflicting destructor functions (%s, %s)", - yyval.type->itDestructor, yyvsp[-3].identifier); - yyval.type->itDestructor = yyvsp[-3].identifier; - - if ((yyval.type->itTransType != strNULL) && !streql(yyval.type->itTransType, yyvsp[-1].identifier)) - warn("conflicting translation types (%s, %s)", - yyval.type->itTransType, yyvsp[-1].identifier); - yyval.type->itTransType = yyvsp[-1].identifier; -; - break;} -case 44: -#line 404 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-3].type; - - if ((yyval.type->itUserType != strNULL) && !streql(yyval.type->itUserType, yyvsp[0].identifier)) - warn("conflicting user types (%s, %s)", - yyval.type->itUserType, yyvsp[0].identifier); - yyval.type->itUserType = yyvsp[0].identifier; - - if ((yyval.type->itServerType != strNULL) && !streql(yyval.type->itServerType, yyvsp[0].identifier)) - warn("conflicting server types (%s, %s)", - yyval.type->itServerType, yyvsp[0].identifier); - yyval.type->itServerType = yyvsp[0].identifier; -; - break;} -case 45: -#line 418 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-3].type; - - if ((yyval.type->itUserType != strNULL) && !streql(yyval.type->itUserType, yyvsp[0].identifier)) - warn("conflicting user types (%s, %s)", - yyval.type->itUserType, yyvsp[0].identifier); - yyval.type->itUserType = yyvsp[0].identifier; -; - break;} -case 46: -#line 428 "../gnumach/mig/parser.y" -{ - yyval.type = yyvsp[-3].type; - - if ((yyval.type->itServerType != strNULL) && !streql(yyval.type->itServerType, yyvsp[0].identifier)) - warn("conflicting server types (%s, %s)", - yyval.type->itServerType, yyvsp[0].identifier); - yyval.type->itServerType = yyvsp[0].identifier; -; - break;} -case 47: -#line 439 "../gnumach/mig/parser.y" -{ yyval.type = yyvsp[0].type; ; - break;} -case 48: -#line 441 "../gnumach/mig/parser.y" -{ yyval.type = yyvsp[0].type; ; - break;} -case 49: -#line 443 "../gnumach/mig/parser.y" -{ yyval.type = itVarArrayDecl(yyvsp[-1].number, yyvsp[0].type); ; - break;} -case 50: -#line 445 "../gnumach/mig/parser.y" -{ yyval.type = itArrayDecl(yyvsp[-1].number, yyvsp[0].type); ; - break;} -case 51: -#line 447 "../gnumach/mig/parser.y" -{ yyval.type = itPtrDecl(yyvsp[0].type); ; - break;} -case 52: -#line 449 "../gnumach/mig/parser.y" -{ yyval.type = itStructDecl(yyvsp[-1].number, yyvsp[0].type); ; - break;} -case 53: -#line 451 "../gnumach/mig/parser.y" -{ yyval.type = yyvsp[0].type; ; - break;} -case 54: -#line 455 "../gnumach/mig/parser.y" -{ - yyval.type = itShortDecl(yyvsp[0].symtype.innumber, yyvsp[0].symtype.instr, - yyvsp[0].symtype.outnumber, yyvsp[0].symtype.outstr, - yyvsp[0].symtype.size); -; - break;} -case 55: -#line 462 "../gnumach/mig/parser.y" -{ - yyval.type = itLongDecl(yyvsp[-4].symtype.innumber, yyvsp[-4].symtype.instr, - yyvsp[-4].symtype.outnumber, yyvsp[-4].symtype.outstr, - yyvsp[-4].symtype.size, yyvsp[-2].number, yyvsp[-1].flag); -; - break;} -case 56: -#line 470 "../gnumach/mig/parser.y" -{ yyval.flag = flNone; ; - break;} -case 57: -#line 472 "../gnumach/mig/parser.y" -{ - if (yyvsp[-2].flag & yyvsp[0].flag) - warn("redundant IPC flag ignored"); - else - yyval.flag = yyvsp[-2].flag | yyvsp[0].flag; -; - break;} -case 58: -#line 479 "../gnumach/mig/parser.y" -{ - if (yyvsp[-2].flag != flDealloc) - warn("only Dealloc is variable"); - else - yyval.flag = yyvsp[-4].flag | flMaybeDealloc; -; - break;} -case 59: -#line 488 "../gnumach/mig/parser.y" -{ - yyval.symtype.innumber = yyval.symtype.outnumber = yyvsp[0].number; - yyval.symtype.instr = yyval.symtype.outstr = strNULL; - yyval.symtype.size = 0; -; - break;} -case 60: -#line 494 "../gnumach/mig/parser.y" -{ yyval.symtype = yyvsp[0].symtype; ; - break;} -case 61: -#line 498 "../gnumach/mig/parser.y" -{ yyval.symtype = yyvsp[0].symtype; ; - break;} -case 62: -#line 500 "../gnumach/mig/parser.y" -{ - if (yyvsp[-2].symtype.size != yyvsp[0].symtype.size) - { - if (yyvsp[-2].symtype.size == 0) - yyval.symtype.size = yyvsp[0].symtype.size; - else if (yyvsp[0].symtype.size == 0) - yyval.symtype.size = yyvsp[-2].symtype.size; - else - { - error("sizes in IPCTypes (%d, %d) aren't equal", - yyvsp[-2].symtype.size, yyvsp[0].symtype.size); - yyval.symtype.size = 0; - } - } - else - yyval.symtype.size = yyvsp[-2].symtype.size; - yyval.symtype.innumber = yyvsp[-2].symtype.innumber; - yyval.symtype.instr = yyvsp[-2].symtype.instr; - yyval.symtype.outnumber = yyvsp[0].symtype.outnumber; - yyval.symtype.outstr = yyvsp[0].symtype.outstr; -; - break;} -case 63: -#line 524 "../gnumach/mig/parser.y" -{ yyval.type = itPrevDecl(yyvsp[0].identifier); ; - break;} -case 64: -#line 528 "../gnumach/mig/parser.y" -{ yyval.number = 0; ; - break;} -case 65: -#line 530 "../gnumach/mig/parser.y" -{ yyval.number = 0; ; - break;} -case 66: -#line 533 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number; ; - break;} -case 67: -#line 537 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number; ; - break;} -case 68: -#line 541 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number; ; - break;} -case 69: -#line 545 "../gnumach/mig/parser.y" -{ yyval.type = itCStringDecl(yyvsp[-1].number, FALSE); ; - break;} -case 70: -#line 548 "../gnumach/mig/parser.y" -{ yyval.type = itCStringDecl(yyvsp[-1].number, TRUE); ; - break;} -case 71: -#line 552 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number + yyvsp[0].number; ; - break;} -case 72: -#line 554 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number - yyvsp[0].number; ; - break;} -case 73: -#line 556 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number * yyvsp[0].number; ; - break;} -case 74: -#line 558 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-2].number / yyvsp[0].number; ; - break;} -case 75: -#line 560 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[0].number; ; - break;} -case 76: -#line 562 "../gnumach/mig/parser.y" -{ yyval.number = yyvsp[-1].number; ; - break;} -case 77: -#line 566 "../gnumach/mig/parser.y" -{ yyval.routine = yyvsp[0].routine; ; - break;} -case 78: -#line 567 "../gnumach/mig/parser.y" -{ yyval.routine = yyvsp[0].routine; ; - break;} -case 79: -#line 568 "../gnumach/mig/parser.y" -{ yyval.routine = yyvsp[0].routine; ; - break;} -case 80: -#line 569 "../gnumach/mig/parser.y" -{ yyval.routine = yyvsp[0].routine; ; - break;} -case 81: -#line 570 "../gnumach/mig/parser.y" -{ yyval.routine = yyvsp[0].routine; ; - break;} -case 82: -#line 574 "../gnumach/mig/parser.y" -{ yyval.routine = rtMakeRoutine(yyvsp[-1].identifier, yyvsp[0].argument); ; - break;} -case 83: -#line 578 "../gnumach/mig/parser.y" -{ yyval.routine = rtMakeSimpleRoutine(yyvsp[-1].identifier, yyvsp[0].argument); ; - break;} -case 84: -#line 582 "../gnumach/mig/parser.y" -{ yyval.routine = rtMakeProcedure(yyvsp[-1].identifier, yyvsp[0].argument); ; - break;} -case 85: -#line 586 "../gnumach/mig/parser.y" -{ yyval.routine = rtMakeSimpleProcedure(yyvsp[-1].identifier, yyvsp[0].argument); ; - break;} -case 86: -#line 590 "../gnumach/mig/parser.y" -{ yyval.routine = rtMakeFunction(yyvsp[-2].identifier, yyvsp[-1].argument, yyvsp[0].type); ; - break;} -case 87: -#line 594 "../gnumach/mig/parser.y" -{ yyval.argument = argNULL; ; - break;} -case 88: -#line 596 "../gnumach/mig/parser.y" -{ yyval.argument = yyvsp[-1].argument; ; - break;} -case 89: -#line 601 "../gnumach/mig/parser.y" -{ yyval.argument = yyvsp[0].argument; ; - break;} -case 90: -#line 603 "../gnumach/mig/parser.y" -{ - yyval.argument = yyvsp[-2].argument; - yyval.argument->argNext = yyvsp[0].argument; -; - break;} -case 91: -#line 610 "../gnumach/mig/parser.y" -{ - yyval.argument = argAlloc(); - yyval.argument->argKind = yyvsp[-3].direction; - yyval.argument->argName = yyvsp[-2].identifier; - yyval.argument->argType = yyvsp[-1].type; - yyval.argument->argFlags = yyvsp[0].flag; -; - break;} -case 92: -#line 619 "../gnumach/mig/parser.y" -{ yyval.direction = akNone; ; - break;} -case 93: -#line 620 "../gnumach/mig/parser.y" -{ yyval.direction = akIn; ; - break;} -case 94: -#line 621 "../gnumach/mig/parser.y" -{ yyval.direction = akOut; ; - break;} -case 95: -#line 622 "../gnumach/mig/parser.y" -{ yyval.direction = akInOut; ; - break;} -case 96: -#line 623 "../gnumach/mig/parser.y" -{ yyval.direction = akRequestPort; ; - break;} -case 97: -#line 624 "../gnumach/mig/parser.y" -{ yyval.direction = akReplyPort; ; - break;} -case 98: -#line 625 "../gnumach/mig/parser.y" -{ yyval.direction = akSReplyPort; ; - break;} -case 99: -#line 626 "../gnumach/mig/parser.y" -{ yyval.direction = akUReplyPort; ; - break;} -case 100: -#line 627 "../gnumach/mig/parser.y" -{ yyval.direction = akWaitTime; ; - break;} -case 101: -#line 628 "../gnumach/mig/parser.y" -{ yyval.direction = akMsgOption; ; - break;} -case 102: -#line 629 "../gnumach/mig/parser.y" -{ yyval.direction = akMsgSeqno; ; - break;} -case 103: -#line 633 "../gnumach/mig/parser.y" -{ - yyval.type = itLookUp(yyvsp[0].identifier); - if (yyval.type == itNULL) - error("type '%s' not defined", yyvsp[0].identifier); -; - break;} -case 104: -#line 639 "../gnumach/mig/parser.y" -{ yyval.type = yyvsp[0].type; ; - break;} -case 105: -#line 643 "../gnumach/mig/parser.y" -{ LookString(); ; - break;} -case 106: -#line 647 "../gnumach/mig/parser.y" -{ LookFileName(); ; - break;} -case 107: -#line 651 "../gnumach/mig/parser.y" -{ LookQString(); ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 487 "/usr/share/bison.simple" - - yyvsp -= yylen; - yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - - *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTBASE]; - - goto yynewstate; - -yyerrlab: /* here on detecting error */ - - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ - { - ++yynerrs; - -#ifdef YYERROR_VERBOSE - yyn = yypact[yystate]; - - if (yyn > YYFLAG && yyn < YYLAST) - { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) - { - strcpy(msg, "parse error"); - - if (count < 5) - { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; - } - } - yyerror(msg); - free(msg); - } - else - yyerror ("parse error; also virtual memory exceeded"); - } - else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); - } - - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ - - if (yyerrstatus == 3) - { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ - - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - - yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ - -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif - -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif - -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: - - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; - - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; - - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; - } - else if (yyn == 0) - goto yyerrpop; - - if (yyn == YYFINAL) - YYACCEPT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif - - *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - - yystate = yyn; - goto yynewstate; -} -#line 654 "../gnumach/mig/parser.y" - - -static const char * -import_name(statement_kind_t sk) -{ - switch (sk) - { - case skImport: - return "Import"; - case skSImport: - return "SImport"; - case skUImport: - return "UImport"; - default: - fatal("import_name(%d): not import statement", (int) sk); - /*NOTREACHED*/ - } -} diff --git a/mig/parser.h b/mig/parser.h deleted file mode 100644 index 5dd38ac..0000000 --- a/mig/parser.h +++ /dev/null @@ -1,87 +0,0 @@ -typedef union -{ - u_int number; - identifier_t identifier; - const_string_t string; - statement_kind_t statement_kind; - ipc_type_t *type; - struct - { - u_int innumber; /* msgt_name value, when sending */ - const_string_t instr; - u_int outnumber; /* msgt_name value, when receiving */ - const_string_t outstr; - u_int size; /* 0 means there is no default size */ - } symtype; - routine_t *routine; - arg_kind_t direction; - argument_t *argument; - ipc_flags_t flag; -} YYSTYPE; -#define sySkip 258 -#define syRoutine 259 -#define sySimpleRoutine 260 -#define sySimpleProcedure 261 -#define syProcedure 262 -#define syFunction 263 -#define sySubsystem 264 -#define syKernelUser 265 -#define syKernelServer 266 -#define syMsgOption 267 -#define syMsgSeqno 268 -#define syWaitTime 269 -#define syNoWaitTime 270 -#define syErrorProc 271 -#define syServerPrefix 272 -#define syUserPrefix 273 -#define syServerDemux 274 -#define syRCSId 275 -#define syImport 276 -#define syUImport 277 -#define sySImport 278 -#define syIn 279 -#define syOut 280 -#define syInOut 281 -#define syRequestPort 282 -#define syReplyPort 283 -#define sySReplyPort 284 -#define syUReplyPort 285 -#define syType 286 -#define syArray 287 -#define syStruct 288 -#define syOf 289 -#define syInTran 290 -#define syOutTran 291 -#define syDestructor 292 -#define syCType 293 -#define syCUserType 294 -#define syCServerType 295 -#define syCString 296 -#define syColon 297 -#define sySemi 298 -#define syComma 299 -#define syPlus 300 -#define syMinus 301 -#define syStar 302 -#define syDiv 303 -#define syLParen 304 -#define syRParen 305 -#define syEqual 306 -#define syCaret 307 -#define syTilde 308 -#define syLAngle 309 -#define syRAngle 310 -#define syLBrack 311 -#define syRBrack 312 -#define syBar 313 -#define syError 314 -#define syNumber 315 -#define sySymbolicType 316 -#define syIdentifier 317 -#define syString 318 -#define syQString 319 -#define syFileName 320 -#define syIPCFlag 321 - - -extern YYSTYPE yylval; diff --git a/mig/parser.y b/mig/parser.y deleted file mode 100644 index 5ff1aae..0000000 --- a/mig/parser.y +++ /dev/null @@ -1,671 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -%token sySkip -%token syRoutine -%token sySimpleRoutine -%token sySimpleProcedure -%token syProcedure -%token syFunction - -%token sySubsystem -%token syKernelUser -%token syKernelServer - -%token syMsgOption -%token syMsgSeqno -%token syWaitTime -%token syNoWaitTime -%token syErrorProc -%token syServerPrefix -%token syUserPrefix -%token syServerDemux -%token syRCSId - -%token syImport -%token syUImport -%token sySImport - -%token syIn -%token syOut -%token syInOut -%token syRequestPort -%token syReplyPort -%token sySReplyPort -%token syUReplyPort - -%token syType -%token syArray -%token syStruct -%token syOf - -%token syInTran -%token syOutTran -%token syDestructor -%token syCType -%token syCUserType -%token syCServerType - -%token syCString - -%token syColon -%token sySemi -%token syComma -%token syPlus -%token syMinus -%token syStar -%token syDiv -%token syLParen -%token syRParen -%token syEqual -%token syCaret -%token syTilde -%token syLAngle -%token syRAngle -%token syLBrack -%token syRBrack -%token syBar - -%token syError /* lex error */ - -%token syNumber -%token sySymbolicType -%token syIdentifier -%token syString syQString -%token syFileName -%token syIPCFlag - -%left syPlus,syMinus -%left syStar,syDiv - - -%type ImportIndicant -%type VarArrayHead ArrayHead StructHead IntExp -%type NamedTypeSpec TransTypeSpec TypeSpec -%type CStringSpec -%type BasicTypeSpec PrevTypeSpec ArgumentType -%type PrimIPCType IPCType -%type RoutineDecl Routine SimpleRoutine -%type Procedure SimpleProcedure Function -%type Direction -%type Argument Arguments ArgumentList -%type IPCFlags - -%{ - -#include - -#include "error.h" -#include "lexxer.h" -#include "global.h" -#include "mig_string.h" -#include "type.h" -#include "routine.h" -#include "statement.h" - -static const char *import_name(statement_kind_t sk); - -void -yyerror(const char *s) -{ - error(s); -} -%} - -%union -{ - u_int number; - identifier_t identifier; - const_string_t string; - statement_kind_t statement_kind; - ipc_type_t *type; - struct - { - u_int innumber; /* msgt_name value, when sending */ - const_string_t instr; - u_int outnumber; /* msgt_name value, when receiving */ - const_string_t outstr; - u_int size; /* 0 means there is no default size */ - } symtype; - routine_t *routine; - arg_kind_t direction; - argument_t *argument; - ipc_flags_t flag; -} - -%% - -Statements : /* empty */ - | Statements Statement - ; - -Statement : Subsystem sySemi - | WaitTime sySemi - | MsgOption sySemi - | Error sySemi - | ServerPrefix sySemi - | UserPrefix sySemi - | ServerDemux sySemi - | TypeDecl sySemi - | RoutineDecl sySemi -{ - register statement_t *st = stAlloc(); - - st->stKind = skRoutine; - st->stRoutine = $1; - rtCheckRoutine($1); - if (BeVerbose) - rtPrintRoutine($1); -} - | sySkip sySemi - { rtSkip(1); } - | sySkip syNumber sySemi - { rtSkip($2); } - | Import sySemi - | RCSDecl sySemi - | sySemi - | error sySemi - { yyerrok; } - ; - -Subsystem : SubsystemStart SubsystemMods - SubsystemName SubsystemBase -{ - if (BeVerbose) - { - printf("Subsystem %s: base = %u%s%s\n\n", - SubsystemName, SubsystemBase, - IsKernelUser ? ", KernelUser" : "", - IsKernelServer ? ", KernelServer" : ""); - } -} - ; - -SubsystemStart : sySubsystem -{ - if (SubsystemName != strNULL) - { - warn("previous Subsystem decl (of %s) will be ignored", SubsystemName); - IsKernelUser = FALSE; - IsKernelServer = FALSE; - strfree((string_t) SubsystemName); - } -} - ; - -SubsystemMods : /* empty */ - | SubsystemMods SubsystemMod - ; - -SubsystemMod : syKernelUser -{ - if (IsKernelUser) - warn("duplicate KernelUser keyword"); - IsKernelUser = TRUE; -} - | syKernelServer -{ - if (IsKernelServer) - warn("duplicate KernelServer keyword"); - IsKernelServer = TRUE; -} - ; - -SubsystemName : syIdentifier { SubsystemName = $1; } - ; - -SubsystemBase : syNumber { SubsystemBase = $1; } - ; - -MsgOption : LookString syMsgOption syString -{ - if (streql($3, "MACH_MSG_OPTION_NONE")) - { - MsgOption = strNULL; - if (BeVerbose) - printf("MsgOption: canceled\n\n"); - } - else - { - MsgOption = $3; - if (BeVerbose) - printf("MsgOption %s\n\n",$3); - } -} - ; - -WaitTime : LookString syWaitTime syString -{ - WaitTime = $3; - if (BeVerbose) - printf("WaitTime %s\n\n", WaitTime); -} - | syNoWaitTime -{ - WaitTime = strNULL; - if (BeVerbose) - printf("NoWaitTime\n\n"); -} - ; - -Error : syErrorProc syIdentifier -{ - ErrorProc = $2; - if (BeVerbose) - printf("ErrorProc %s\n\n", ErrorProc); -} - ; - -ServerPrefix : syServerPrefix syIdentifier -{ - ServerPrefix = $2; - if (BeVerbose) - printf("ServerPrefix %s\n\n", ServerPrefix); -} - ; - -UserPrefix : syUserPrefix syIdentifier -{ - UserPrefix = $2; - if (BeVerbose) - printf("UserPrefix %s\n\n", UserPrefix); -} - ; - -ServerDemux : syServerDemux syIdentifier -{ - ServerDemux = $2; - if (BeVerbose) - printf("ServerDemux %s\n\n", ServerDemux); -} - ; - -Import : LookFileName ImportIndicant syFileName -{ - register statement_t *st = stAlloc(); - st->stKind = $2; - st->stFileName = $3; - - if (BeVerbose) - printf("%s %s\n\n", import_name($2), $3); -} - ; - -ImportIndicant : syImport { $$ = skImport; } - | syUImport { $$ = skUImport; } - | sySImport { $$ = skSImport; } - ; - -RCSDecl : LookQString syRCSId syQString -{ - if (RCSId != strNULL) - warn("previous RCS decl will be ignored"); - if (BeVerbose) - printf("RCSId %s\n\n", $3); - RCSId = $3; -} - ; - -TypeDecl : syType NamedTypeSpec -{ - register identifier_t name = $2->itName; - - if (itLookUp(name) != itNULL) - warn("overriding previous definition of %s", name); - itInsert(name, $2); -} - ; - -NamedTypeSpec : syIdentifier syEqual TransTypeSpec - { itTypeDecl($1, $$ = $3); } - ; - -TransTypeSpec : TypeSpec - { $$ = itResetType($1); } - | TransTypeSpec syInTran syColon syIdentifier - syIdentifier syLParen syIdentifier syRParen -{ - $$ = $1; - - if (($$->itTransType != strNULL) && !streql($$->itTransType, $4)) - warn("conflicting translation types (%s, %s)", - $$->itTransType, $4); - $$->itTransType = $4; - - if (($$->itInTrans != strNULL) && !streql($$->itInTrans, $5)) - warn("conflicting in-translation functions (%s, %s)", - $$->itInTrans, $5); - $$->itInTrans = $5; - - if (($$->itServerType != strNULL) && !streql($$->itServerType, $7)) - warn("conflicting server types (%s, %s)", - $$->itServerType, $7); - $$->itServerType = $7; -} - | TransTypeSpec syOutTran syColon syIdentifier - syIdentifier syLParen syIdentifier syRParen -{ - $$ = $1; - - if (($$->itServerType != strNULL) && !streql($$->itServerType, $4)) - warn("conflicting server types (%s, %s)", - $$->itServerType, $4); - $$->itServerType = $4; - - if (($$->itOutTrans != strNULL) && !streql($$->itOutTrans, $5)) - warn("conflicting out-translation functions (%s, %s)", - $$->itOutTrans, $5); - $$->itOutTrans = $5; - - if (($$->itTransType != strNULL) && !streql($$->itTransType, $7)) - warn("conflicting translation types (%s, %s)", - $$->itTransType, $7); - $$->itTransType = $7; -} - | TransTypeSpec syDestructor syColon syIdentifier - syLParen syIdentifier syRParen -{ - $$ = $1; - - if (($$->itDestructor != strNULL) && !streql($$->itDestructor, $4)) - warn("conflicting destructor functions (%s, %s)", - $$->itDestructor, $4); - $$->itDestructor = $4; - - if (($$->itTransType != strNULL) && !streql($$->itTransType, $6)) - warn("conflicting translation types (%s, %s)", - $$->itTransType, $6); - $$->itTransType = $6; -} - | TransTypeSpec syCType syColon syIdentifier -{ - $$ = $1; - - if (($$->itUserType != strNULL) && !streql($$->itUserType, $4)) - warn("conflicting user types (%s, %s)", - $$->itUserType, $4); - $$->itUserType = $4; - - if (($$->itServerType != strNULL) && !streql($$->itServerType, $4)) - warn("conflicting server types (%s, %s)", - $$->itServerType, $4); - $$->itServerType = $4; -} - | TransTypeSpec syCUserType syColon syIdentifier -{ - $$ = $1; - - if (($$->itUserType != strNULL) && !streql($$->itUserType, $4)) - warn("conflicting user types (%s, %s)", - $$->itUserType, $4); - $$->itUserType = $4; -} - | TransTypeSpec syCServerType - syColon syIdentifier -{ - $$ = $1; - - if (($$->itServerType != strNULL) && !streql($$->itServerType, $4)) - warn("conflicting server types (%s, %s)", - $$->itServerType, $4); - $$->itServerType = $4; -} - ; - -TypeSpec : BasicTypeSpec - { $$ = $1; } - | PrevTypeSpec - { $$ = $1; } - | VarArrayHead TypeSpec - { $$ = itVarArrayDecl($1, $2); } - | ArrayHead TypeSpec - { $$ = itArrayDecl($1, $2); } - | syCaret TypeSpec - { $$ = itPtrDecl($2); } - | StructHead TypeSpec - { $$ = itStructDecl($1, $2); } - | CStringSpec - { $$ = $1; } - ; - -BasicTypeSpec : IPCType -{ - $$ = itShortDecl($1.innumber, $1.instr, - $1.outnumber, $1.outstr, - $1.size); -} - | syLParen IPCType syComma IntExp - IPCFlags syRParen -{ - $$ = itLongDecl($2.innumber, $2.instr, - $2.outnumber, $2.outstr, - $2.size, $4, $5); -} - ; - -IPCFlags : /* empty */ - { $$ = flNone; } - | IPCFlags syComma syIPCFlag -{ - if ($1 & $3) - warn("redundant IPC flag ignored"); - else - $$ = $1 | $3; -} - | IPCFlags syComma syIPCFlag syLBrack syRBrack -{ - if ($3 != flDealloc) - warn("only Dealloc is variable"); - else - $$ = $1 | flMaybeDealloc; -} - ; - -PrimIPCType : syNumber -{ - $$.innumber = $$.outnumber = $1; - $$.instr = $$.outstr = strNULL; - $$.size = 0; -} - | sySymbolicType - { $$ = $1; } - ; - -IPCType : PrimIPCType - { $$ = $1; } - | PrimIPCType syBar PrimIPCType -{ - if ($1.size != $3.size) - { - if ($1.size == 0) - $$.size = $3.size; - else if ($3.size == 0) - $$.size = $1.size; - else - { - error("sizes in IPCTypes (%d, %d) aren't equal", - $1.size, $3.size); - $$.size = 0; - } - } - else - $$.size = $1.size; - $$.innumber = $1.innumber; - $$.instr = $1.instr; - $$.outnumber = $3.outnumber; - $$.outstr = $3.outstr; -} - ; - -PrevTypeSpec : syIdentifier - { $$ = itPrevDecl($1); } - ; - -VarArrayHead : syArray syLBrack syRBrack syOf - { $$ = 0; } - | syArray syLBrack syStar syRBrack syOf - { $$ = 0; } - | syArray syLBrack syStar syColon IntExp - syRBrack syOf - { $$ = $5; } - ; - -ArrayHead : syArray syLBrack IntExp syRBrack syOf - { $$ = $3; } - ; - -StructHead : syStruct syLBrack IntExp syRBrack syOf - { $$ = $3; } - ; - -CStringSpec : syCString syLBrack IntExp syRBrack - { $$ = itCStringDecl($3, FALSE); } - | syCString syLBrack syStar syColon - IntExp syRBrack - { $$ = itCStringDecl($5, TRUE); } - ; - -IntExp : IntExp syPlus IntExp - { $$ = $1 + $3; } - | IntExp syMinus IntExp - { $$ = $1 - $3; } - | IntExp syStar IntExp - { $$ = $1 * $3; } - | IntExp syDiv IntExp - { $$ = $1 / $3; } - | syNumber - { $$ = $1; } - | syLParen IntExp syRParen - { $$ = $2; } - ; - - -RoutineDecl : Routine { $$ = $1; } - | SimpleRoutine { $$ = $1; } - | Procedure { $$ = $1; } - | SimpleProcedure { $$ = $1; } - | Function { $$ = $1; } - ; - -Routine : syRoutine syIdentifier Arguments - { $$ = rtMakeRoutine($2, $3); } - ; - -SimpleRoutine : sySimpleRoutine syIdentifier Arguments - { $$ = rtMakeSimpleRoutine($2, $3); } - ; - -Procedure : syProcedure syIdentifier Arguments - { $$ = rtMakeProcedure($2, $3); } - ; - -SimpleProcedure : sySimpleProcedure syIdentifier Arguments - { $$ = rtMakeSimpleProcedure($2, $3); } - ; - -Function : syFunction syIdentifier Arguments ArgumentType - { $$ = rtMakeFunction($2, $3, $4); } - ; - -Arguments : syLParen syRParen - { $$ = argNULL; } - | syLParen ArgumentList syRParen - { $$ = $2; } - - ; - -ArgumentList : Argument - { $$ = $1; } - | Argument sySemi ArgumentList -{ - $$ = $1; - $$->argNext = $3; -} - ; - -Argument : Direction syIdentifier ArgumentType IPCFlags -{ - $$ = argAlloc(); - $$->argKind = $1; - $$->argName = $2; - $$->argType = $3; - $$->argFlags = $4; -} - ; - -Direction : /* empty */ { $$ = akNone; } - | syIn { $$ = akIn; } - | syOut { $$ = akOut; } - | syInOut { $$ = akInOut; } - | syRequestPort { $$ = akRequestPort; } - | syReplyPort { $$ = akReplyPort; } - | sySReplyPort { $$ = akSReplyPort; } - | syUReplyPort { $$ = akUReplyPort; } - | syWaitTime { $$ = akWaitTime; } - | syMsgOption { $$ = akMsgOption; } - | syMsgSeqno { $$ = akMsgSeqno; } - ; - -ArgumentType : syColon syIdentifier -{ - $$ = itLookUp($2); - if ($$ == itNULL) - error("type '%s' not defined", $2); -} - | syColon NamedTypeSpec - { $$ = $2; } - ; - -LookString : /* empty */ - { LookString(); } - ; - -LookFileName : /* empty */ - { LookFileName(); } - ; - -LookQString : /* empty */ - { LookQString(); } - ; - -%% - -static const char * -import_name(statement_kind_t sk) -{ - switch (sk) - { - case skImport: - return "Import"; - case skSImport: - return "SImport"; - case skUImport: - return "UImport"; - default: - fatal("import_name(%d): not import statement", (int) sk); - /*NOTREACHED*/ - } -} diff --git a/mig/routine.c b/mig/routine.c deleted file mode 100644 index 70707bd..0000000 --- a/mig/routine.c +++ /dev/null @@ -1,1334 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992,1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -/* - * ABSTRACT: - * Provides the routine used by parser.c to generate - * routine structures for each routine statement. - * The parser generates a threaded list of statements - * of which the most interesting are the various kinds - * routine statments. The routine structure is defined - * in routine.h which includes it name, kind of routine - * and other information, - * a pointer to an argument list which contains the name - * and type information for each argument, and a list - * of distinguished arguments, eg. Request and Reply - * ports, waittime, retcode etc. - */ - -#include -#include - -#include "error.h" -#include "global.h" -#include "routine.h" -#include "message.h" - -u_int rtNumber = 0; - -routine_t * -rtAlloc(void) -{ - register routine_t *new; - - new = (routine_t *) calloc(1, sizeof *new); - if (new == rtNULL) - fatal("rtAlloc(): %s", unix_error_string(errno)); - new->rtNumber = rtNumber++; - new->rtName = strNULL; - new->rtErrorName = strNULL; - new->rtUserName = strNULL; - new->rtServerName = strNULL; - - return new; -} - -void -rtSkip(int n) -{ - rtNumber += n; -} - -argument_t * -argAlloc(void) -{ - static const argument_t prototype = - { - strNULL, /* identifier_t argName */ - argNULL, /* argument_t *argNext */ - akNone, /* arg_kind_t argKind */ - itNULL, /* ipc_type_t *argType */ - strNULL, /* string_t argVarName */ - strNULL, /* string_t argMsgField */ - strNULL, /* string_t argTTName */ - strNULL, /* string_t argPadName */ - flNone, /* ipc_flags_t argFlags */ - d_NO, /* dealloc_t argDeallocate */ - FALSE, /* boolean_t argLongForm */ - FALSE, /* boolean_t argServerCopy */ - FALSE, /* boolean_t argCountInOut */ - rtNULL, /* routine_t *argRoutine */ - argNULL, /* argument_t *argCount */ - argNULL, /* argument_t *argCInOut */ - argNULL, /* argument_t *argPoly */ - argNULL, /* argument_t *argDealloc */ - argNULL, /* argument_t *argSCopy */ - argNULL, /* argument_t *argParent */ - 1, /* int argMultiplier */ - 0, /* int argRequestPos */ - 0, /* int argReplyPos */ - FALSE, /* boolean_t argByReferenceUser */ - FALSE /* boolean_t argByReferenceServer */ - }; - register argument_t *new; - - new = malloc(sizeof *new); - if (new == argNULL) - fatal("argAlloc(): %s", unix_error_string(errno)); - *new = prototype; - return new; -} - -routine_t * -rtMakeRoutine(identifier_t name, argument_t *args) -{ - register routine_t *rt = rtAlloc(); - - rt->rtName = name; - rt->rtKind = rkRoutine; - rt->rtArgs = args; - - return rt; -} - -routine_t * -rtMakeSimpleRoutine(identifier_t name, argument_t *args) -{ - register routine_t *rt = rtAlloc(); - - rt->rtName = name; - rt->rtKind = rkSimpleRoutine; - rt->rtArgs = args; - - return rt; -} - -routine_t * -rtMakeProcedure(identifier_t name, argument_t *args) -{ - register routine_t *rt = rtAlloc(); - - rt->rtName = name; - rt->rtKind = rkProcedure; - rt->rtArgs = args; - - warn("Procedure %s: obsolete routine kind", name); - - return rt; -} - -routine_t * -rtMakeSimpleProcedure(identifier_t name, argument_t *args) -{ - register routine_t *rt = rtAlloc(); - - rt->rtName = name; - rt->rtKind = rkSimpleProcedure; - rt->rtArgs = args; - - warn("SimpleProcedure %s: obsolete routine kind", name); - - return rt; -} - -routine_t * -rtMakeFunction(identifier_t name, argument_t *args, ipc_type_t *type) -{ - register routine_t *rt = rtAlloc(); - register argument_t *ret = argAlloc(); - - ret->argName = name; - ret->argKind = akReturn; - ret->argType = type; - ret->argNext = args; - - rt->rtName = name; - rt->rtKind = rkFunction; - rt->rtArgs = ret; - - warn("Function %s: obsolete routine kind", name); - - return rt; -} - -const char * -rtRoutineKindToStr(routine_kind_t rk) -{ - switch (rk) - { - case rkRoutine: - return "Routine"; - case rkSimpleRoutine: - return "SimpleRoutine"; - case rkProcedure: - return "Procedure"; - case rkSimpleProcedure: - return "SimpleProcedure"; - case rkFunction: - return "Function"; - default: - fatal("rtRoutineKindToStr(%d): not a routine_kind_t", rk); - /*NOTREACHED*/ - } -} - -static void -rtPrintArg(register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - if (!akCheck(arg->argKind, akbUserArg|akbServerArg) || - (akIdent(arg->argKind) == akeCount) || - (akIdent(arg->argKind) == akePoly)) - return; - - printf("\n\t"); - - switch (akIdent(arg->argKind)) - { - case akeRequestPort: - printf("RequestPort"); - break; - case akeReplyPort: - printf("ReplyPort"); - break; - case akeWaitTime: - printf("WaitTime"); - break; - case akeMsgOption: - printf("MsgOption"); - break; - case akeMsgSeqno: - printf("MsgSeqno\t"); - break; - default: - if (akCheck(arg->argKind, akbRequest)) - if (akCheck(arg->argKind, akbSend)) - printf("In"); - else - printf("(In)"); - if (akCheck(arg->argKind, akbReply)) - if (akCheck(arg->argKind, akbReturn)) - printf("Out"); - else - printf("(Out)"); - printf("\t"); - } - - printf("\t%s: %s", arg->argName, it->itName); - - if (arg->argDeallocate != it->itDeallocate) - if (arg->argDeallocate == d_YES) - printf(", Dealloc"); - else if (arg->argDeallocate == d_MAYBE) - printf(", Dealloc[]"); - else - printf(", NotDealloc"); - - if (arg->argLongForm != it->itLongForm) - if (arg->argLongForm) - printf(", IsLong"); - else - printf(", IsNotLong"); - - if (arg->argServerCopy) - printf(", ServerCopy"); - - if (arg->argCountInOut) - printf(", CountInOut"); -} - -void -rtPrintRoutine(register const routine_t *rt) -{ - register const argument_t *arg; - - printf("%s (%d) %s(", rtRoutineKindToStr(rt->rtKind), - rt->rtNumber, rt->rtName); - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) - rtPrintArg(arg); - - if (rt->rtKind == rkFunction) - printf("): %s\n", rt->rtReturn->argType->itName); - else - printf(")\n"); - - printf("\n"); -} - -/* - * Determines appropriate value of msg-simple for the message, - * and whether this value can vary at runtime. (If it can vary, - * then the simple value is optimistically returned as TRUE.) - * Uses itInName values, so useful when sending messages. - */ - -static void -rtCheckSimpleIn(const argument_t *args, u_int mask, boolean_t *fixed, - boolean_t *simple) -{ - register const argument_t *arg; - boolean_t MayBeComplex = FALSE; - boolean_t MustBeComplex = FALSE; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheck(arg->argKind, mask)) - { - register const ipc_type_t *it = arg->argType; - - if (it->itInName == MACH_MSG_TYPE_POLYMORPHIC) - MayBeComplex = TRUE; - - if (it->itIndefinite) - MayBeComplex = TRUE; - - if (MACH_MSG_TYPE_PORT_ANY(it->itInName) || - !it->itInLine) - MustBeComplex = TRUE; - } - - *fixed = MustBeComplex || !MayBeComplex; - *simple = !MustBeComplex; -} - -/* - * Determines appropriate value of msg-simple for the message, - * and whether this value can vary at runtime. (If it can vary, - * then the simple value is optimistically returned as TRUE.) - * Uses itOutName values, so useful when receiving messages - * (and sending reply messages in KernelServer interfaces). - */ - -static void -rtCheckSimpleOut(const argument_t *args, u_int mask, boolean_t *fixed, - boolean_t *simple) -{ - register const argument_t *arg; - boolean_t MayBeComplex = FALSE; - boolean_t MustBeComplex = FALSE; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheck(arg->argKind, mask)) - { - register const ipc_type_t *it = arg->argType; - - if (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC) - MayBeComplex = TRUE; - - if (it->itIndefinite) - MayBeComplex = TRUE; - - if (MACH_MSG_TYPE_PORT_ANY(it->itOutName) || - !it->itInLine) - MustBeComplex = TRUE; - } - - *fixed = MustBeComplex || !MayBeComplex; - *simple = !MustBeComplex; -} - -static u_int -rtFindSize(const argument_t *args, u_int mask) -{ - register const argument_t *arg; - u_int size = sizeof_mach_msg_header_t; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheck(arg->argKind, mask)) - { - register ipc_type_t *it = arg->argType; - - if (arg->argLongForm) { - /* might need proper alignment on 64bit archies */ - size = (size + word_size-1) & ~(word_size-1); - size += sizeof_mach_msg_type_long_t; - } else { - register bs = (it->itSize / 8); /* in bytes */ - size += (bs > sizeof_mach_msg_type_t) ? bs : sizeof_mach_msg_type_t; - } - - size += it->itMinTypeSize; - } - - return size; -} - -boolean_t -rtCheckMask(const argument_t *args, u_int mask) -{ - register const argument_t *arg; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheckAll(arg->argKind, mask)) - return TRUE; - return FALSE; -} - -boolean_t -rtCheckMaskFunction(const argument_t *args, u_int mask, - boolean_t (*func)(const argument_t *)) -{ - register const argument_t *arg; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheckAll(arg->argKind, mask)) - if ((*func)(arg)) - return TRUE; - return FALSE; -} - -/* arg->argType may be NULL in this function */ - -static void -rtDefaultArgKind(const routine_t *rt, argument_t *arg) -{ - if ((arg->argKind == akNone) && - (rt->rtRequestPort == argNULL)) - arg->argKind = akRequestPort; - - if (arg->argKind == akNone) - arg->argKind = akIn; -} - -/* - * Initializes arg->argDeallocate, arg->argLongForm, - * arg->argServerCopy, arg->argCountInOut from arg->argFlags. - */ - -static void -rtProcessArgFlags(register argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - arg->argFlags = itCheckFlags(arg->argFlags, arg->argName); - - if (((IsKernelServer && akCheck(arg->argKind, akbReturn)) || - (IsKernelUser && akCheck(arg->argKind, akbSend))) && - (arg->argFlags & flDealloc) && - (it->itDeallocate == d_NO)) { - /* - * For a KernelServer interface and an Out argument, - * or a KernelUser interface and an In argument, - * we avoid a possible spurious warning about the deallocate bit. - * For compatibility with Mach 2.5, the deallocate bit - * may need to be enabled on some inline arguments. - */ - - arg->argDeallocate = d_YES; - } else - arg->argDeallocate = itCheckDeallocate(it, arg->argFlags, - it->itDeallocate, arg->argName); - - arg->argLongForm = itCheckIsLong(it, arg->argFlags, - it->itLongForm, arg->argName); - - if (arg->argFlags & flServerCopy) { - if (it->itIndefinite && akCheck(arg->argKind, akbSend)) - arg->argServerCopy = TRUE; - else - warn("%s: ServerCopy on argument is meaningless", arg->argName); - } - - if (arg->argFlags & flCountInOut) { - if (it->itVarArray && it->itInLine && - akCheck(arg->argKind, akbReply)) - arg->argCountInOut = TRUE; - else - warn("%s: CountInOut on argument is meaningless", arg->argName); - } -} - -static void -rtAugmentArgKind(argument_t *arg) -{ - register ipc_type_t *it = arg->argType; - - /* akbVariable means variable-sized inline. */ - - if (it->itVarArray && it->itInLine) - { - if (akCheckAll(arg->argKind, akbRequest|akbReply)) - error("%s: Inline variable-sized arguments can't be InOut", - arg->argName); - arg->argKind = akAddFeature(arg->argKind, akbVariable); - - /* akbIndefinite means inline or out-of-line */ - - if (it->itIndefinite) - arg->argKind = akAddFeature(arg->argKind, akbIndefinite); - } - - /* - * Kernel servers can't do quick-checking of request arguments - * which are out-of-line or ports, because the deallocate bit isn't - * predictable. This is because the deallocate bit is preserved - * at message copyin time and normalized during message copyout. - * This accomodates old IPC programs which expect the deallocate - * bit to be preserved. - */ - - if (akCheck(arg->argKind, akbRequest) && - !arg->argLongForm && - (it->itOutName != MACH_MSG_TYPE_POLYMORPHIC) && - !it->itVarArray && - !(IsKernelServer && (!it->itInLine || - MACH_MSG_TYPE_PORT_ANY(it->itOutName)))) - arg->argKind = akAddFeature(arg->argKind, akbRequestQC); - - if (akCheck(arg->argKind, akbReply) && - !arg->argLongForm && - (it->itOutName != MACH_MSG_TYPE_POLYMORPHIC) && - !it->itVarArray) - arg->argKind = akAddFeature(arg->argKind, akbReplyQC); - - /* - * Need to use a local variable in the following cases: - * 1) There is a translate-out function & the argument is being - * returned. We need to translate it before it hits the message. - * 2) There is a translate-in function & the argument is - * sent and returned. We need a local variable for its address. - * 3) There is a destructor function, which will be used - * (SendRcv and not ReturnSnd), and there is a translate-in - * function whose value must be saved for the destructor. - * 4) This is a count arg, getting returned. The count can't get - * stored directly into the msg-type, because the msg-type won't - * get initialized until later, and that would trash the count. - * 5) This is a poly arg, getting returned. The name can't get - * stored directly into the msg-type, because the msg-type won't - * get initialized until later, and that would trash the name. - * 6) This is a dealloc arg, being returned. The name can't be - * stored directly into the msg_type, because the msg-type - * field is a bit-field. - */ - - if (((it->itOutTrans != strNULL) && - akCheck(arg->argKind, akbReturnSnd)) || - ((it->itInTrans != strNULL) && - akCheckAll(arg->argKind, akbSendRcv|akbReturnSnd)) || - ((it->itDestructor != strNULL) && - akCheck(arg->argKind, akbSendRcv) && - !akCheck(arg->argKind, akbReturnSnd) && - (it->itInTrans != strNULL)) || - ((akIdent(arg->argKind) == akeCount) && - akCheck(arg->argKind, akbReturnSnd)) || - ((akIdent(arg->argKind) == akePoly) && - akCheck(arg->argKind, akbReturnSnd)) || - ((akIdent(arg->argKind) == akeDealloc) && - akCheck(arg->argKind, akbReturnSnd))) - { - arg->argKind = akRemFeature(arg->argKind, akbReplyCopy); - arg->argKind = akAddFeature(arg->argKind, akbVarNeeded); - } - - /* - * If the argument is a variable-length array that can be passed in-line - * or out-of-line, and is being returned, the server procedure - * is passed a pointer to the buffer, which it can change. - */ - if (it->itIndefinite && - akCheck(arg->argKind, akbReturnSnd)) - { - arg->argKind = akAddFeature(arg->argKind, akbPointer); - } -} - -/* arg->argType may be NULL in this function */ - -static void -rtCheckRoutineArg(routine_t *rt, argument_t *arg) -{ - switch (akIdent(arg->argKind)) - { - case akeRequestPort: - if (rt->rtRequestPort != argNULL) - warn("multiple RequestPort args in %s; %s won't be used", - rt->rtName, rt->rtRequestPort->argName); - rt->rtRequestPort = arg; - break; - - case akeReplyPort: - if (akCheck (arg->argKind, akbUserArg)) - { - if (rt->rtUReplyPort != argNULL) - warn("multiple UserReplyPort args in %s; %s won't be used", - rt->rtName, rt->rtUReplyPort->argName); - rt->rtUReplyPort = arg; - } - if (akCheck (arg->argKind, akbServerArg)) - { - if (rt->rtSReplyPort != argNULL) - warn("multiple ServerReplyPort args in %s; %s won't be used", - rt->rtName, rt->rtSReplyPort->argName); - rt->rtSReplyPort = arg; - } - break; - - case akeWaitTime: - if (rt->rtWaitTime != argNULL) - warn("multiple WaitTime args in %s; %s won't be used", - rt->rtName, rt->rtWaitTime->argName); - rt->rtWaitTime = arg; - break; - - case akeMsgOption: - if (rt->rtMsgOption != argNULL) - warn("multiple MsgOption args in %s; %s won't be used", - rt->rtName, rt->rtMsgOption->argName); - rt->rtMsgOption = arg; - break; - - case akeMsgSeqno: - if (rt->rtMsgSeqno != argNULL) - warn("multiple MsgSeqno args in %s; %s won't be used", - rt->rtName, rt->rtMsgSeqno->argName); - rt->rtMsgSeqno = arg; - break; - - case akeReturn: - if (rt->rtReturn != argNULL) - warn("multiple Return args in %s; %s won't be used", - rt->rtName, rt->rtReturn->argName); - rt->rtReturn = arg; - break; - - default: - break; - } -} - -/* arg->argType may be NULL in this function */ - -static void -rtSetArgDefaults(routine_t *rt, register argument_t *arg) -{ - arg->argRoutine = rt; - if (arg->argVarName == strNULL) - arg->argVarName = arg->argName; - if (arg->argMsgField == strNULL) - switch(akIdent(arg->argKind)) - { - case akeRequestPort: - arg->argMsgField = "Head.msgh_request_port"; - break; - case akeReplyPort: - arg->argMsgField = "Head.msgh_reply_port"; - break; - case akeMsgSeqno: - arg->argMsgField = "Head.msgh_seqno"; - break; - default: - arg->argMsgField = arg->argName; - break; - } - if (arg->argTTName == strNULL) - arg->argTTName = strconcat(arg->argName, "Type"); - if (arg->argPadName == strNULL) - arg->argPadName = strconcat(arg->argName, "Pad"); - - /* - * The poly args for the request and reply ports have special defaults, - * because their msg-type-name values aren't stored in normal fields. - */ - - if ((rt->rtRequestPort != argNULL) && - (rt->rtRequestPort->argPoly == arg) && - (arg->argType != itNULL)) { - arg->argMsgField = "Head.msgh_bits"; - arg->argType->itInTrans = "MACH_MSGH_BITS_REQUEST"; - } - - if ((rt->rtUReplyPort != argNULL) && - (rt->rtUReplyPort->argPoly == arg) && - (arg->argType != itNULL)) { - arg->argMsgField = "Head.msgh_bits"; - arg->argType->itInTrans = "MACH_MSGH_BITS_REPLY"; - } - if ((rt->rtSReplyPort != argNULL) && - (rt->rtSReplyPort->argPoly == arg) && - (arg->argType != itNULL)) { - arg->argMsgField = "Head.msgh_bits"; - arg->argType->itInTrans = "MACH_MSGH_BITS_REPLY"; - } -} - -static void -rtAddCountArg(register argument_t *arg) -{ - register argument_t *count; - - count = argAlloc(); - count->argName = strconcat(arg->argName, "Cnt"); - count->argType = itMakeCountType(); - count->argParent = arg; - count->argMultiplier = arg->argType->itElement->itNumber; - count->argNext = arg->argNext; - arg->argNext = count; - arg->argCount = count; - - if (arg->argType->itString) { - /* C String gets no Count argument on either side. - There is no explicit field in the message - - the count is passed as part of the descriptor. */ - count->argKind = akeCount; - count->argVarName = (char *)0; - } else - count->argKind = akAddFeature(akCount, - akCheck(arg->argKind, akbSendReturnBits)); - - if (arg->argLongForm) - count->argMsgField = strconcat(arg->argTTName, - ".msgtl_number"); - else - count->argMsgField = strconcat(arg->argTTName, ".msgt_number"); -} - -static void -rtAddCountInOutArg(register argument_t *arg) -{ - register argument_t *count; - - /* - * The user sees a single count variable. However, to get the - * count passed from user to server for variable-sized inline OUT - * arrays, we need two count arguments internally. This is - * because the count value lives in different message fields (and - * is scaled differently) in the request and reply messages. - * - * The two variables have the same name to simplify code generation. - * - * This variable has a null argParent field because it has akbRequest. - * For example, see rtCheckVariable. - */ - - count = argAlloc(); - count->argName = strconcat(arg->argName, "Cnt"); - count->argType = itMakeCountType(); - count->argParent = argNULL; - count->argNext = arg->argNext; - arg->argNext = count; - (count->argCInOut = arg->argCount)->argCInOut = count; - count->argKind = akCountInOut; -} - -static void -rtAddPolyArg(register argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - register argument_t *poly; - arg_kind_t akbsend, akbreturn; - - poly = argAlloc(); - poly->argName = strconcat(arg->argName, "Poly"); - poly->argType = itMakePolyType(); - poly->argParent = arg; - poly->argNext = arg->argNext; - arg->argNext = poly; - arg->argPoly = poly; - - /* - * akbsend is bits added if the arg is In; - * akbreturn is bits added if the arg is Out. - * The mysterious business with KernelServer subsystems: - * when packing Out arguments, they use OutNames instead - * of InNames, and the OutName determines if they are poly-in - * as well as poly-out. - */ - - akbsend = akbSend|akbSendBody; - akbreturn = akbReturn|akbReturnBody; - - if (it->itInName == MACH_MSG_TYPE_POLYMORPHIC) - { - akbsend |= akbUserArg|akbSendSnd; - if (!IsKernelServer) - akbreturn |= akbServerArg|akbReturnSnd; - } - if (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC) - { - akbsend |= akbServerArg|akbSendRcv; - akbreturn |= akbUserArg|akbReturnRcv; - if (IsKernelServer) - akbreturn |= akbServerArg|akbReturnSnd; - } - - poly->argKind = akPoly; - if (akCheck(arg->argKind, akbSend)) - poly->argKind = akAddFeature(poly->argKind, - akCheck(arg->argKind, akbsend)); - if (akCheck(arg->argKind, akbReturn)) - poly->argKind = akAddFeature(poly->argKind, - akCheck(arg->argKind, akbreturn)); - - if (arg->argLongForm) - poly->argMsgField = strconcat(arg->argTTName, - ".msgtl_name"); - else - poly->argMsgField = strconcat(arg->argTTName, ".msgt_name"); -} - -static void -rtAddDeallocArg(register argument_t *arg) -{ - register argument_t *dealloc; - - dealloc = argAlloc(); - dealloc->argName = strconcat(arg->argName, "Dealloc"); - dealloc->argType = itMakeDeallocType(); - dealloc->argParent = arg; - dealloc->argNext = arg->argNext; - arg->argNext = dealloc; - arg->argDealloc = dealloc; - - /* - * For Indefinite types, we leave out akbSendSnd and akbReturnSnd - * so that the normal argument-packing is bypassed. The special code - * generated for the Indefinite argument handles the deallocate bit. - * (It can only be enabled if the data is actually out-of-line.) - */ - - dealloc->argKind = akeDealloc; - if (akCheck(arg->argKind, akbSend)) - dealloc->argKind = akAddFeature(dealloc->argKind, - akCheck(arg->argKind, - akbUserArg|akbSend|akbSendBody| - (arg->argType->itIndefinite ? 0 : akbSendSnd))); - if (akCheck(arg->argKind, akbReturn)) { - dealloc->argKind = akAddFeature(dealloc->argKind, - akCheck(arg->argKind, - akbServerArg|akbReturn|akbReturnBody| - (arg->argType->itIndefinite ? 0 : akbReturnSnd))); - - /* - * Without akbReturnSnd, rtAugmentArgKind will not add - * akbVarNeeded and rtAddByReference will not set - * argByReferenceServer. So we do it here. - */ - - if (arg->argType->itIndefinite) { - dealloc->argKind = akAddFeature(dealloc->argKind, akbVarNeeded); - dealloc->argByReferenceServer = TRUE; - } - } - - if (arg->argLongForm) - dealloc->argMsgField = strconcat(arg->argTTName, - ".msgtl_header.msgt_deallocate"); - else - dealloc->argMsgField = strconcat(arg->argTTName, ".msgt_deallocate"); - -} - -static void -rtAddSCopyArg(register argument_t *arg) -{ - register argument_t *scopy; - - scopy = argAlloc(); - scopy->argName = strconcat(arg->argName, "SCopy"); - scopy->argType = itMakeDeallocType(); - scopy->argParent = arg; - scopy->argNext = arg->argNext; - arg->argNext = scopy; - arg->argSCopy = scopy; - - scopy->argKind = akServerCopy; - - if (arg->argLongForm) - scopy->argMsgField = strconcat(arg->argTTName, - ".msgtl_header.msgt_inline"); - else - scopy->argMsgField = strconcat(arg->argTTName, ".msgt_inline"); -} - -static void -rtCheckRoutineArgs(routine_t *rt) -{ - register argument_t *arg; - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) - { - register const ipc_type_t *it = arg->argType; - - rtDefaultArgKind(rt, arg); - rtCheckRoutineArg(rt, arg); - - /* need to set argTTName before adding implicit args */ - rtSetArgDefaults(rt, arg); - - /* the arg may not have a type (if there was some error in parsing it), - in which case we don't want to do these steps. */ - - if (it != itNULL) - { - /* need to set argLongForm before adding implicit args */ - rtProcessArgFlags(arg); - rtAugmentArgKind(arg); - - /* args added here will get processed in later iterations */ - /* order of args is 'arg poly countinout count dealloc scopy' */ - - if (arg->argServerCopy) - rtAddSCopyArg(arg); - if (arg->argDeallocate == d_MAYBE) - rtAddDeallocArg(arg); - if (it->itVarArray) - rtAddCountArg(arg); - if (arg->argCountInOut) - rtAddCountInOutArg(arg); - if ((it->itInName == MACH_MSG_TYPE_POLYMORPHIC) || - (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC)) - rtAddPolyArg(arg); - } - } -} - -static void -rtCheckArgTypes(routine_t *rt) -{ - if (rt->rtRequestPort == argNULL) - error("%s %s doesn't have a server port argument", - rtRoutineKindToStr(rt->rtKind), rt->rtName); - - if ((rt->rtKind == rkFunction) && - (rt->rtReturn == argNULL)) - error("Function %s doesn't have a return arg", rt->rtName); - - if ((rt->rtKind != rkFunction) && - (rt->rtReturn != argNULL)) - error("non-function %s has a return arg", rt->rtName); - - if ((rt->rtReturn == argNULL) && !rt->rtProcedure) - rt->rtReturn = rt->rtRetCode; - - rt->rtServerReturn = rt->rtReturn; - - if ((rt->rtReturn != argNULL) && - (rt->rtReturn->argType != itNULL)) - itCheckReturnType(rt->rtReturn->argName, - rt->rtReturn->argType); - - if ((rt->rtRequestPort != argNULL) && - (rt->rtRequestPort->argType != itNULL)) - itCheckRequestPortType(rt->rtRequestPort->argName, - rt->rtRequestPort->argType); - - if ((rt->rtUReplyPort != argNULL) && - (rt->rtUReplyPort->argType != itNULL)) - itCheckReplyPortType(rt->rtUReplyPort->argName, - rt->rtUReplyPort->argType); - if ((rt->rtSReplyPort != argNULL) && - (rt->rtSReplyPort->argType != itNULL)) - itCheckReplyPortType(rt->rtSReplyPort->argName, - rt->rtSReplyPort->argType); - - if ((rt->rtWaitTime != argNULL) && - (rt->rtWaitTime->argType != itNULL)) - itCheckIntType(rt->rtWaitTime->argName, - rt->rtWaitTime->argType); - - if ((rt->rtMsgOption != argNULL) && - (rt->rtMsgOption->argType != itNULL)) - itCheckIntType(rt->rtMsgOption->argName, - rt->rtMsgOption->argType); - - if ((rt->rtMsgSeqno != argNULL) && - (rt->rtMsgSeqno->argType != itNULL)) - itCheckNaturalType(rt->rtMsgSeqno->argName, - rt->rtMsgSeqno->argType); -} - -/* - * Check for arguments which are missing seemingly needed functions. - * We make this check here instead of in itCheckDecl, because here - * we can take into account what kind of argument the type is - * being used with. - * - * These are warnings, not hard errors, because mig will generate - * reasonable code in any case. The generated code will work fine - * if the ServerType and TransType are really the same, even though - * they have different names. - */ - -static void -rtCheckArgTrans(const routine_t *rt) -{ - register const argument_t *arg; - - /* the arg may not have a type (if there was some error in parsing it) */ - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) - { - register const ipc_type_t *it = arg->argType; - - if ((it != itNULL) && - !streql(it->itServerType, it->itTransType)) - { - if (akCheck(arg->argKind, akbSendRcv) && - (it->itInTrans == strNULL)) - warn("%s: argument has no in-translation function", - arg->argName); - - if (akCheck(arg->argKind, akbReturnSnd) && - (it->itOutTrans == strNULL)) - warn("%s: argument has no out-translation function", - arg->argName); - } - } -} - -/* - * Adds an implicit return-code argument. It exists in the reply message, - * where it is the first piece of data. Even if there is no reply - * message (rtOneWay is true), we generate the argument because - * the server-side stub needs a dummy reply msg to return error codes - * back to the server loop. - */ - -static void -rtAddRetCode(routine_t *rt) -{ - register argument_t *arg = argAlloc(); - - arg->argName = "RetCode"; - arg->argType = itRetCodeType; - arg->argKind = akRetCode; - rt->rtRetCode = arg; - - /* add at beginning, so return-code is first in the reply message */ - arg->argNext = rt->rtArgs; - rt->rtArgs = arg; -} - -/* - * Adds a dummy WaitTime argument to the function. - * This argument doesn't show up in any C argument lists; - * it implements the global WaitTime statement. - */ - -static void -rtAddWaitTime(routine_t *rt, identifier_t name) -{ - register argument_t *arg = argAlloc(); - argument_t **loc; - - arg->argName = "dummy WaitTime arg"; - arg->argVarName = name; - arg->argType = itWaitTimeType; - arg->argKind = akeWaitTime; - rt->rtWaitTime = arg; - - /* add wait-time after msg-option, if possible */ - - if (rt->rtMsgOption != argNULL) - loc = &rt->rtMsgOption->argNext; - else - loc = &rt->rtArgs; - - arg->argNext = *loc; - *loc = arg; - - rtSetArgDefaults(rt, arg); -} - -/* - * Adds a dummy MsgOption argument to the function. - * This argument doesn't show up in any C argument lists; - * it implements the global MsgOption statement. - */ - -static void -rtAddMsgOption(routine_t *rt, identifier_t name) -{ - register argument_t *arg = argAlloc(); - argument_t **loc; - - arg->argName = "dummy MsgOption arg"; - arg->argVarName = name; - arg->argType = itMsgOptionType; - arg->argKind = akeMsgOption; - rt->rtMsgOption = arg; - - /* add msg-option after msg-seqno */ - - if (rt->rtMsgSeqno != argNULL) - loc = &rt->rtMsgSeqno->argNext; - else - loc = &rt->rtArgs; - - arg->argNext = *loc; - *loc = arg; - - rtSetArgDefaults(rt, arg); -} - -/* - * Adds a dummy reply port argument to the function. If USER is true, the - * user reply port is set, otherwise the server. - */ - -static void -rtAddDummyReplyPort(routine_t *rt, ipc_type_t *type, int user) -{ - register argument_t *arg = argAlloc(); - argument_t **loc; - - arg->argName = "dummy ReplyPort arg"; - arg->argVarName = "dummy ReplyPort arg"; - arg->argType = type; - arg->argKind = akeReplyPort; - if (user) - rt->rtUReplyPort = arg; - else - rt->rtSReplyPort = arg; - - /* add the reply port after the request port */ - - if (rt->rtRequestPort != argNULL) - loc = &rt->rtRequestPort->argNext; - else - loc = &rt->rtArgs; - - arg->argNext = *loc; - *loc = arg; - - rtSetArgDefaults(rt, arg); -} - -/* - * Initializes argRequestPos, argReplyPos, rtMaxRequestPos, rtMaxReplyPos, - * rtNumRequestVar, rtNumReplyVar, and adds akbVarNeeded to those arguments - * that need it because of variable-sized inline considerations. - * - * argRequestPos and argReplyPos get -1 if the value shouldn't be used. - */ -static void -rtCheckVariable(register routine_t *rt) -{ - register argument_t *arg; - int NumRequestVar = 0; - int NumReplyVar = 0; - int MaxRequestPos = 0; - int MaxReplyPos = 0; - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - register argument_t *parent = arg->argParent; - - if (parent == argNULL) { - if (akCheck(arg->argKind, akbRequest|akbSend)) { - arg->argRequestPos = NumRequestVar; - MaxRequestPos = NumRequestVar; - if (akCheck(arg->argKind, akbVariable)) - NumRequestVar++; - } else - arg->argRequestPos = -1; - - if (akCheck(arg->argKind, akbReply|akbReturn)) { - arg->argReplyPos = NumReplyVar; - MaxReplyPos = NumReplyVar; - if (akCheck(arg->argKind, akbVariable)) - NumReplyVar++; - } else - arg->argReplyPos = -1; - } else { - arg->argRequestPos = parent->argRequestPos; - arg->argReplyPos = parent->argReplyPos; - } - - /* Out variables that follow a variable-sized field - need VarNeeded or ReplyCopy; they can't be stored - directly into the reply message. */ - - if (akCheck(arg->argKind, akbReturnSnd) && - !akCheck(arg->argKind, akbReplyCopy|akbVarNeeded) && - (arg->argReplyPos > 0)) - arg->argKind = akAddFeature(arg->argKind, akbVarNeeded); - } - - rt->rtNumRequestVar = NumRequestVar; - rt->rtNumReplyVar = NumReplyVar; - rt->rtMaxRequestPos = MaxRequestPos; - rt->rtMaxReplyPos = MaxReplyPos; -} - -/* - * Adds akbDestroy where needed. - */ - -static void -rtCheckDestroy(register routine_t *rt) -{ - register argument_t *arg; - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - register const ipc_type_t *it = arg->argType; - - if(akCheck(arg->argKind, akbSendRcv) && - !akCheck(arg->argKind, akbReturnSnd)) { - if ((it->itDestructor != strNULL) || - (akCheck(arg->argKind, akbIndefinite) && !arg->argServerCopy)) - arg->argKind = akAddFeature(arg->argKind, akbDestroy); - } - } -} - -/* - * Sets ByReferenceUser and ByReferenceServer. - */ - -static void -rtAddByReference(register routine_t *rt) -{ - register argument_t *arg; - - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - register const ipc_type_t *it = arg->argType; - - if (akCheck(arg->argKind, akbReturnRcv) && - (it->itStruct || it->itIndefinite)) { - arg->argByReferenceUser = TRUE; - - /* - * A CountInOut arg itself is not akbReturnRcv, - * so we need to set argByReferenceUser specially. - */ - - if (arg->argCInOut != argNULL) - arg->argCInOut->argByReferenceUser = TRUE; - } - - if (akCheck(arg->argKind, akbReturnSnd) && - (it->itStruct || it->itIndefinite)) - arg->argByReferenceServer = TRUE; - } -} - -void -rtCheckRoutine(register routine_t *rt) -{ - /* Initialize random fields. */ - - rt->rtErrorName = ErrorProc; - rt->rtOneWay = ((rt->rtKind == rkSimpleProcedure) || - (rt->rtKind == rkSimpleRoutine)); - rt->rtProcedure = ((rt->rtKind == rkProcedure) || - (rt->rtKind == rkSimpleProcedure)); - rt->rtUseError = rt->rtProcedure || (rt->rtKind == rkFunction); - rt->rtServerName = strconcat(ServerPrefix, rt->rtName); - rt->rtServerName = strconcat(RoutinePrefix, rt->rtServerName); - rt->rtUserName = strconcat(UserPrefix, rt->rtName); - rt->rtUserName = strconcat(RoutinePrefix, rt->rtUserName); - - /* Add implicit arguments. */ - - rtAddRetCode(rt); - - /* Check out the arguments and their types. Add count, poly - implicit args. Any arguments added after rtCheckRoutineArgs - should have rtSetArgDefaults called on them. */ - - rtCheckRoutineArgs(rt); - - /* Add dummy WaitTime and MsgOption arguments, if the routine - doesn't have its own args and the user specified global values. */ - - if (rt->rtUReplyPort == argNULL) - if (rt->rtOneWay) - rtAddDummyReplyPort(rt, itZeroReplyPortType, 1); - else - rtAddDummyReplyPort(rt, itRealReplyPortType, 1); - if (rt->rtSReplyPort == argNULL) - if (rt->rtOneWay) - rtAddDummyReplyPort(rt, itZeroReplyPortType, 0); - else - rtAddDummyReplyPort(rt, itRealReplyPortType, 0); - - if (rt->rtMsgOption == argNULL) - if (MsgOption == strNULL) - rtAddMsgOption(rt, "MACH_MSG_OPTION_NONE"); - else - rtAddMsgOption(rt, MsgOption); - - if ((rt->rtWaitTime == argNULL) && - (WaitTime != strNULL)) - rtAddWaitTime(rt, WaitTime); - - /* Now that all the arguments are in place, do more checking. */ - - rtCheckArgTypes(rt); - rtCheckArgTrans(rt); - - if (rt->rtOneWay && rtCheckMask(rt->rtArgs, akbReturn)) - error("%s %s has OUT argument", - rtRoutineKindToStr(rt->rtKind), rt->rtName); - - /* If there were any errors, don't bother calculating more info - that is only used in code generation anyway. Therefore, - the following functions don't have to worry about null types. */ - - if (errors > 0) - return; - - rtCheckSimpleIn(rt->rtArgs, akbRequest, - &rt->rtSimpleFixedRequest, - &rt->rtSimpleSendRequest); - rtCheckSimpleOut(rt->rtArgs, akbRequest, - &rt->rtSimpleCheckRequest, - &rt->rtSimpleReceiveRequest); - rt->rtRequestSize = rtFindSize(rt->rtArgs, akbRequest); - - if (IsKernelServer) - rtCheckSimpleOut(rt->rtArgs, akbReply, - &rt->rtSimpleFixedReply, - &rt->rtSimpleSendReply); - else - rtCheckSimpleIn(rt->rtArgs, akbReply, - &rt->rtSimpleFixedReply, - &rt->rtSimpleSendReply); - rtCheckSimpleOut(rt->rtArgs, akbReply, - &rt->rtSimpleCheckReply, - &rt->rtSimpleReceiveReply); - rt->rtReplySize = rtFindSize(rt->rtArgs, akbReply); - - rtCheckVariable(rt); - rtCheckDestroy(rt); - rtAddByReference(rt); - - if (rt->rtKind == rkFunction) - rt->rtNoReplyArgs = FALSE; - else - rt->rtNoReplyArgs = !rtCheckMask(rt->rtArgs, akbReturnSnd); -} diff --git a/mig/routine.h b/mig/routine.h deleted file mode 100644 index f80a174..0000000 --- a/mig/routine.h +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#ifndef _ROUTINE_H -#define _ROUTINE_H - -#include - -#include "boolean.h" -#include "type.h" - -/* base kind arg */ -#define akeNone (0) -#define akeNormal (1) /* a normal, user-defined argument */ -#define akeRequestPort (2) /* pointed at by rtRequestPort */ -#define akeWaitTime (3) /* pointed at by rtWaitTime */ -#define akeReplyPort (4) /* pointed at by rtReplyPort */ -#define akeMsgOption (5) /* pointed at by rtMsgOption */ -#define akeMsgSeqno (6) /* pointed at by rtMsgSeqno */ -#define akeRetCode (7) /* pointed at by rtRetCode/rtReturn */ -#define akeReturn (8) /* pointed at by rtReturn */ -#define akeCount (9) /* a count arg for argParent */ -#define akePoly (10) /* a poly arg for argParent */ -#define akeDealloc (11) /* a deallocate arg for argParent */ -#define akeServerCopy (12) /* a server-copy arg for argParent */ -#define akeCountInOut (13) /* a count-in-out arg */ - -#define akeBITS (0x0000003f) -#define akbRequest (0x00000040) /* has a msg_type in request */ -#define akbReply (0x00000080) /* has a msg_type in reply */ -#define akbUserArg (0x00000100) /* an arg on user-side */ -#define akbServerArg (0x00000200) /* an arg on server-side */ -#define akbSend (0x00000400) /* value carried in request */ -#define akbSendBody (0x00000800) /* value carried in request body */ -#define akbSendSnd (0x00001000) /* value stuffed into request */ -#define akbSendRcv (0x00002000) /* value grabbed from request */ -#define akbReturn (0x00004000) /* value carried in reply */ -#define akbReturnBody (0x00008000) /* value carried in reply body */ -#define akbReturnSnd (0x00010000) /* value stuffed into reply */ -#define akbReturnRcv (0x00020000) /* value grabbed from reply */ -#define akbReplyInit (0x00040000) /* reply msg-type must be init'ed */ -#define akbRequestQC (0x00080000) /* msg_type can be checked quickly */ -#define akbReplyQC (0x00100000) /* msg_type can be checked quickly */ -#define akbReplyCopy (0x00200000) /* copy reply value from request */ -#define akbVarNeeded (0x00400000) /* may need local var in server */ -#define akbDestroy (0x00800000) /* call destructor function */ -#define akbVariable (0x01000000) /* variable size inline data */ -#define akbIndefinite (0x02000000) /* variable size, inline or out */ -#define akbPointer (0x04000000) /* server gets a pointer to the - real buffer */ -/* be careful, there aren't many bits left */ - -typedef u_int arg_kind_t; - -/* - * akbRequest means msg_type/data fields are allocated in the request - * msg. akbReply means msg_type/data fields are allocated in the - * reply msg. These bits (with akbReplyInit, akbRequestQC, akbReplyQC) - * control msg structure declarations packing, and checking of - * mach_msg_type_t fields. - * - * akbUserArg means this argument is an argument to the user-side stub. - * akbServerArg means this argument is an argument to - * the server procedure called by the server-side stub. - * - * The akbSend* and akbReturn* bits control packing/extracting values - * in the request and reply messages. - * - * akbSend means the argument's value is carried in the request msg. - * akbSendBody implies akbSend; the value is carried in the msg body. - * akbSendSnd implies akbSend; the value is stuffed into the request. - * akbSendRcv implies akbSend; the value is pulled out of the request. - * - * akbReturn, akbReturnBody, akbReturnSnd, akbReturnRcv are defined - * similarly but apply to the reply message. - * - * User-side code generation (header.c, user.c) and associated code - * should use akbSendSnd and akbReturnRcv, but not akbSendRcv and - * akbReturnSnd. Server-side code generation (server.c) is reversed. - * Code generation should use the more specific akb{Send,Return}{Snd,Rcv} - * bits when possible, instead of akb{Send,Return}. - * - * Note that akRetCode and akReturn lack any Return bits, although - * there is a value in the msg. These guys are packed/unpacked - * with special code, unlike other arguments. - * - * akbReplyInit implies akbReply. It means the server-side stub - * should initialize the argument's msg_type field in the reply msg. - * Some special arguments (RetCode, Dummy, Tid) have their msg_type - * fields in the reply message initialized by the server demux - * function; these arguments have akbReply but not akbReplyInit. - * - * akbRequestQC implies akbRequest. If it's on, then the - * mach_msg_type_t value in the request message can be checked quickly - * (by casting to an int and checking with a single comparison). - * akbReplyQC has the analogous meaning with respect to akbReply. - * - * akbVariable means the argument has variable-sized inline data. - * It isn't currently used for code generation, but routine.c - * does use it internally. It is added in rtAugmentArgKind. - * - * akbReplyCopy and akbVarNeeded help control code generation in the - * server-side stub. The preferred method of handling data in the - * server-side stub avoids copying into/out-of local variables. In - * arguments get passed directly to the server proc from the request msg. - * Out arguments get stuffed directly into the reply msg by the server proc. - * For InOut arguments, the server proc gets the address of the data in - * the request msg, and the resulting data gets copied to the reply msg. - * Some arguments need a local variable in the server-side stub. The - * code extracts the data from the request msg into the variable, and - * stuff the reply msg from the variable. - * - * akbReplyCopy implies akbReply. It means the data should get copied - * from the request msg to the reply msg after the server proc is called. - * It is only used by akInOut. akTid doesn't need it because the tid - * data in the reply msg is initialized in the server demux function. - * - * akbVarNeeded means the argument needs a local variable in the - * server-side stub. It is added in rtAugmentArgKind and - * rtCheckVariable. An argument shouldn't have all three of - * akbReturnSnd, akbVarNeeded and akbReplyCopy, because this indicates - * the reply msg should be stuffed both ways. - * - * akbDestroy helps control code generation in the server-side stub. - * It means this argument has a destructor function which should be called. - * - * Header file generation (header.c) uses: - * akbUserArg - * - * User stub generation (user.c) uses: - * akbUserArg, akbRequest, akbReply, akbSendSnd, - * akbSendBody, akbReturnRcv, akbReplyQC - * - * Server stub generation (server.c) uses: - * akbServerArg, akbRequest, akbReply, akbSendRcv, akbReturnSnd, - * akbReplyInit, akbReplyCopy, akbVarNeeded, akbSendBody, akbRequestQC - * - * - * During code generation, the routine, argument, and type data structures - * are read-only. The code generation functions' output is their only - * side-effect. - * - * - * Style note: - * Code can use logical operators (|, &, ~) on akb values. - * ak values should be manipulated with the ak functions. - */ - -/* various useful combinations */ - -#define akbNone (0) -#define akbAll (~akbNone) -#define akbAllBits (~akeBITS) - -#define akbSendBits (akbSend|akbSendBody|akbSendSnd|akbSendRcv) -#define akbReturnBits (akbReturn|akbReturnBody|akbReturnSnd|akbReturnRcv) -#define akbSendReturnBits (akbSendBits|akbReturnBits) - -#define akNone akeNone - -#define akIn akAddFeature(akeNormal, \ - akbUserArg|akbServerArg|akbRequest|akbSendBits) - -#define akOut akAddFeature(akeNormal, \ - akbUserArg|akbServerArg|akbReply|akbReturnBits|akbReplyInit) - -#define akInOut akAddFeature(akeNormal, \ - akbUserArg|akbServerArg|akbRequest|akbReply| \ - akbSendBits|akbReturnBits|akbReplyInit|akbReplyCopy) - -#define akRequestPort akAddFeature(akeRequestPort, \ - akbUserArg|akbServerArg|akbSend|akbSendSnd|akbSendRcv) - -#define akWaitTime akAddFeature(akeWaitTime, akbUserArg) - -#define akMsgOption akAddFeature(akeMsgOption, akbUserArg) - -#define akMsgSeqno akAddFeature(akeMsgSeqno, \ - akbServerArg|akbSend|akbSendRcv) - -#define akReplyPort akAddFeature(akeReplyPort, \ - akbUserArg|akbServerArg|akbSend|akbSendSnd|akbSendRcv) - -#define akUReplyPort akAddFeature(akeReplyPort, \ - akbUserArg|akbSend|akbSendSnd|akbSendRcv) - -#define akSReplyPort akAddFeature(akeReplyPort, \ - akbServerArg|akbSend|akbSendSnd|akbSendRcv) - -#define akRetCode akAddFeature(akeRetCode, akbReply) - -#define akReturn akAddFeature(akeReturn, \ - akbReply|akbReplyInit) - -#define akCount akAddFeature(akeCount, \ - akbUserArg|akbServerArg) - -#define akPoly akePoly - -#define akDealloc akAddFeature(akeDealloc, akbUserArg) - -#define akServerCopy akAddFeature(akeServerCopy, akbServerArg|akbSendRcv) - -#define akCountInOut akAddFeature(akeCountInOut, akbRequest|akbSendBits) - -#define akCheck(ak, bits) ((ak) & (bits)) -#define akCheckAll(ak, bits) (akCheck(ak, bits) == (bits)) -#define akAddFeature(ak, bits) ((ak)|(bits)) -#define akRemFeature(ak, bits) ((ak)&~(bits)) -#define akIdent(ak) ((ak) & akeBITS) - -/* - * The arguments to a routine/function are linked in left-to-right order. - * argName is used for error messages and pretty-printing, - * not code generation. Code generation shouldn't make any assumptions - * about the order of arguments, esp. count and poly arguments. - * (Unfortunately, code generation for inline variable-sized arguments - * does make such assumptions.) - * - * argVarName is the name used in generated code for function arguments - * and local variable names. argMsgField is the name used in generated - * code for the field in msgs where the argument's value lives. - * argTTName is the name used in generated code for msg-type fields and - * static variables used to initialize those fields. argPadName is the - * name used in generated code for a padding field in msgs. - * - * argFlags can be used to override the deallocate and longform bits - * in the argument's type. rtProcessArgFlags sets argDeallocate and - * argLongForm from it and the type. Code generation shouldn't use - * argFlags. - * - * argCount, argPoly, and argDealloc get to the implicit count, poly, - * and dealloc arguments associated with the argument; they should be - * used instead of argNext. In these implicit arguments, argParent is - * a pointer to the "real" arg. - * - * In count arguments, argMultiplier is a scaling factor applied to - * the count arg's value to get msg-type-number. It is equal to - * argParent->argType->itElement->itNumber - */ - -typedef struct argument -{ - /* if argKind == akReturn, then argName is name of the function */ - identifier_t argName; - struct argument *argNext; - - arg_kind_t argKind; - ipc_type_t *argType; - - const_string_t argVarName; /* local variable and argument names */ - const_string_t argMsgField; /* message field's name */ - const_string_t argTTName; /* name for msg_type fields, static vars */ - const_string_t argPadName; /* name for pad field in msg */ - - ipc_flags_t argFlags; - dealloc_t argDeallocate; /* overrides argType->itDeallocate */ - boolean_t argLongForm; /* overrides argType->itLongForm */ - boolean_t argServerCopy; - boolean_t argCountInOut; - - struct routine *argRoutine; /* routine we are part of */ - - struct argument *argCount; /* our count arg, if present */ - struct argument *argCInOut; /* our CountInOut arg, if present */ - struct argument *argPoly; /* our poly arg, if present */ - struct argument *argDealloc;/* our dealloc arg, if present */ - struct argument *argSCopy; /* our serverCopy arg, if present */ - struct argument *argParent; /* in a count or poly arg, the base arg */ - int argMultiplier; /* for Count argument: parent is a multiple - of a basic IPC type. Argument must be - multiplied by Multiplier to get IPC - number-of-elements. */ - - /* how variable/inline args precede this one, in request and reply */ - int argRequestPos; - int argReplyPos; - /* whether argument is by reference, on user and server side */ - boolean_t argByReferenceUser; - boolean_t argByReferenceServer; -} argument_t; - -/* - * The various routine kinds' peculiarities are abstracted by rtCheckRoutine - * into attributes like rtOneWay, rtProcedure, etc. These are what - * code generation should use. It is Bad Form for code generation to - * test rtKind. - */ - -typedef enum -{ - rkRoutine, - rkSimpleRoutine, - rkSimpleProcedure, - rkProcedure, - rkFunction, -} routine_kind_t; - -typedef struct routine -{ - identifier_t rtName; - routine_kind_t rtKind; - argument_t *rtArgs; - u_int rtNumber; /* used for making msg ids */ - - identifier_t rtUserName; /* user-visible name (UserPrefix + Name) */ - identifier_t rtServerName; /* server-side name (ServerPrefix + Name) */ - - /* rtErrorName is only used for Procs, SimpleProcs, & Functions */ - identifier_t rtErrorName; /* error-handler name */ - - boolean_t rtOneWay; /* SimpleProcedure or SimpleRoutine */ - boolean_t rtProcedure; /* Procedure or SimpleProcedure */ - boolean_t rtUseError; /* Procedure or Function */ - - boolean_t rtSimpleFixedRequest; /* fixed msg-simple value in request */ - boolean_t rtSimpleSendRequest; /* in any case, initial value */ - boolean_t rtSimpleCheckRequest; /* check msg-simple in request */ - boolean_t rtSimpleReceiveRequest; /* if so, the expected value */ - - boolean_t rtSimpleFixedReply; /* fixed msg-simple value in reply */ - boolean_t rtSimpleSendReply; /* in any case, initial value */ - boolean_t rtSimpleCheckReply; /* check msg-simple in reply */ - boolean_t rtSimpleReceiveReply; /* if so, the expected value */ - - u_int rtRequestSize; /* minimal size of a legal request msg */ - u_int rtReplySize; /* minimal size of a legal reply msg */ - - int rtNumRequestVar; /* number of variable/inline args in request */ - int rtNumReplyVar; /* number of variable/inline args in reply */ - - int rtMaxRequestPos; /* maximum of argRequestPos */ - int rtMaxReplyPos; /* maximum of argReplyPos */ - - boolean_t rtNoReplyArgs; /* if so, no reply message arguments beyond - what the server dispatch routine inserts */ - - /* distinguished arguments */ - argument_t *rtRequestPort; /* always non-NULL, defaults to first arg */ - argument_t *rtUReplyPort; /* always non-NULL, defaults to Mig-supplied */ - argument_t *rtSReplyPort; /* always non-NULL, defaults to Mig-supplied */ - argument_t *rtReturn; /* non-NULL unless rtProcedure */ - argument_t *rtServerReturn; /* NULL or rtReturn */ - argument_t *rtRetCode; /* always non-NULL */ - argument_t *rtWaitTime; /* if non-NULL, will use MACH_RCV_TIMEOUT */ - argument_t *rtMsgOption; /* always non-NULL, defaults to NONE */ - argument_t *rtMsgSeqno; /* if non-NULL, server gets passed seqno */ -} routine_t; - -#define rtNULL ((routine_t *) 0) -#define argNULL ((argument_t *) 0) - -extern u_int rtNumber; -/* rt->rtNumber will be initialized */ -extern routine_t *rtAlloc(void); -/* skip a number */ -extern void rtSkip(int); - -extern argument_t *argAlloc(void); - -extern boolean_t rtCheckMask(const argument_t *args, u_int mask); - -extern boolean_t rtCheckMaskFunction(const argument_t *args, u_int mask, - boolean_t (*func)(const argument_t *arg)); - -extern routine_t *rtMakeRoutine(identifier_t name, argument_t *args); -extern routine_t *rtMakeSimpleRoutine(identifier_t name, argument_t *args); -extern routine_t *rtMakeProcedure(identifier_t name, argument_t *args); -extern routine_t *rtMakeSimpleProcedure(identifier_t name, argument_t *args); -extern routine_t *rtMakeFunction(identifier_t name, argument_t *args, - ipc_type_t *type); - -extern void rtPrintRoutine(const routine_t *rt); -extern void rtCheckRoutine(routine_t *rt); - -extern const char *rtRoutineKindToStr(routine_kind_t rk); - -#endif /* _ROUTINE_H */ diff --git a/mig/server.c b/mig/server.c deleted file mode 100644 index 07e4964..0000000 --- a/mig/server.c +++ /dev/null @@ -1,1322 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#include - -#include "write.h" -#include "utils.h" -#include "global.h" -#include "error.h" -#include "cpu.h" - -static void -WriteIncludes(FILE *file) -{ - fprintf(file, "#define EXPORT_BOOLEAN\n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - if (IsKernelServer) - fprintf(file, "#include \n"); - fprintf(file, "\n"); -} - -static void -WriteGlobalDecls(FILE *file) -{ - if (RCSId != strNULL) - WriteRCSDecl(file, strconcat(SubsystemName, "_server"), RCSId); - - /* Used for locations in the request message, *not* reply message. - Reply message locations aren't dependent on IsKernelServer. */ - - if (IsKernelServer) - { - fprintf(file, "#define msgh_request_port\tmsgh_remote_port\n"); - fprintf(file, "#define MACH_MSGH_BITS_REQUEST(bits)"); - fprintf(file, "\tMACH_MSGH_BITS_REMOTE(bits)\n"); - fprintf(file, "#define msgh_reply_port\t\tmsgh_local_port\n"); - fprintf(file, "#define MACH_MSGH_BITS_REPLY(bits)"); - fprintf(file, "\tMACH_MSGH_BITS_LOCAL(bits)\n"); - } - else - { - fprintf(file, "#define msgh_request_port\tmsgh_local_port\n"); - fprintf(file, "#define MACH_MSGH_BITS_REQUEST(bits)"); - fprintf(file, "\tMACH_MSGH_BITS_LOCAL(bits)\n"); - fprintf(file, "#define msgh_reply_port\t\tmsgh_remote_port\n"); - fprintf(file, "#define MACH_MSGH_BITS_REPLY(bits)"); - fprintf(file, "\tMACH_MSGH_BITS_REMOTE(bits)\n"); - } - fprintf(file, "\n"); -} - -static void -WriteProlog(FILE *file) -{ - fprintf(file, "/* Module %s */\n", SubsystemName); - fprintf(file, "\n"); - - WriteIncludes(file); - WriteBogusDefines(file); - WriteGlobalDecls(file); -} - - -static void -WriteSymTabEntries(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - register u_int current = 0; - - for (stat = stats; stat != stNULL; stat = stat->stNext) - if (stat->stKind == skRoutine) { - register num = stat->stRoutine->rtNumber; - const char *name = stat->stRoutine->rtName; - - while (++current <= num) - fprintf(file,"\t\t\t{ \"\", 0, 0 },\n"); - fprintf(file, "\t{ \"%s\", %d, _X%s },\n", - name, - SubsystemBase + current - 1, - name); - } - while (++current <= rtNumber) - fprintf(file,"\t{ \"\", 0, 0 },\n"); -} - -static void -WriteArrayEntries(FILE *file, const statement_t *stats) -{ - register u_int current = 0; - register const statement_t *stat; - - for (stat = stats; stat != stNULL; stat = stat->stNext) - if (stat->stKind == skRoutine) - { - register const routine_t *rt = stat->stRoutine; - - while (current++ < rt->rtNumber) - fprintf(file, "\t\t0,\n"); - fprintf(file, "\t\t_X%s,\n", rt->rtName); - } - while (current++ < rtNumber) - fprintf(file, "\t\t\t0,\n"); -} - -static void -WriteEpilog(FILE *file, const statement_t *stats) -{ - fprintf(file, "\n"); - - /* - * First, the symbol table - */ - fprintf(file, "static mig_routine_t %s_routines[] = {\n", ServerDemux); - - WriteArrayEntries(file, stats); - - fprintf(file, "};\n"); - fprintf(file, "\n"); - - /* - * Then, the server routine - */ - fprintf(file, "mig_external boolean_t %s\n", ServerDemux); - fprintf(file, "\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n"); - - fprintf(file, "{\n"); - fprintf(file, "\tregister mach_msg_header_t *InP = InHeadP;\n"); - - fprintf(file, "\tregister mig_reply_header_t *OutP = (mig_reply_header_t *) OutHeadP;\n"); - - fprintf(file, "\n"); - - WriteStaticDecl(file, itRetCodeType, - itRetCodeType->itDeallocate, itRetCodeType->itLongForm, - !IsKernelServer, "RetCodeType"); - fprintf(file, "\n"); - - fprintf(file, "\tregister mig_routine_t routine;\n"); - fprintf(file, "\n"); - - fprintf(file, "\tOutP->Head.msgh_bits = "); - fprintf(file, "MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InP->msgh_bits), 0);\n"); - fprintf(file, "\tOutP->Head.msgh_size = sizeof *OutP;\n"); - fprintf(file, "\tOutP->Head.msgh_remote_port = InP->msgh_reply_port;\n"); - fprintf(file, "\tOutP->Head.msgh_local_port = MACH_PORT_NULL;\n"); - fprintf(file, "\tOutP->Head.msgh_seqno = 0;\n"); - fprintf(file, "\tOutP->Head.msgh_id = InP->msgh_id + 100;\n"); - fprintf(file, "\n"); - WritePackMsgType(file, itRetCodeType, - itRetCodeType->itDeallocate, itRetCodeType->itLongForm, - !IsKernelServer, "OutP->RetCodeType", "RetCodeType"); - fprintf(file, "\n"); - - fprintf(file, "\tif ((InP->msgh_id > %d) || (InP->msgh_id < %d) ||\n", - SubsystemBase + rtNumber - 1, SubsystemBase); - fprintf(file, "\t ((routine = %s_routines[InP->msgh_id - %d]) == 0)) {\n", - ServerDemux, SubsystemBase); - fprintf(file, "\t\tOutP->RetCode = MIG_BAD_ID;\n"); - fprintf(file, "\t\treturn FALSE;\n"); - fprintf(file, "\t}\n"); - - /* Call appropriate routine */ - fprintf(file, "\t(*routine) (InP, &OutP->Head);\n"); - fprintf(file, "\treturn TRUE;\n"); - fprintf(file, "}\n"); - fprintf(file, "\n"); - - /* - * Then, the _server_routine routine - */ - fprintf(file, "mig_external mig_routine_t %s_routine\n", ServerDemux); - fprintf(file, "\t(const mach_msg_header_t *InHeadP)\n"); - - fprintf(file, "{\n"); - fprintf(file, "\tregister int msgh_id;\n"); - fprintf(file, "\n"); - fprintf(file, "\tmsgh_id = InHeadP->msgh_id - %d;\n", SubsystemBase); - fprintf(file, "\n"); - fprintf(file, "\tif ((msgh_id > %d) || (msgh_id < 0))\n", - rtNumber - 1); - fprintf(file, "\t\treturn 0;\n"); - fprintf(file, "\n"); - fprintf(file, "\treturn %s_routines[msgh_id];\n", ServerDemux); - fprintf(file, "}\n"); - fprintf(file, "\n"); - - /* symtab */ - - if (GenSymTab) { - fprintf(file,"\nmig_symtab_t _%sSymTab[] = {\n",SubsystemName); - WriteSymTabEntries(file,stats); - fprintf(file,"};\n"); - fprintf(file,"int _%sSymTabBase = %d;\n",SubsystemName,SubsystemBase); - fprintf(file,"int _%sSymTabEnd = %d;\n",SubsystemName,SubsystemBase+rtNumber); - } -} - -/* - * Returns the return type of the server-side work function. - * Suitable for "extern %s serverfunc()". - */ -static const char * -ServerSideType(const routine_t *rt) -{ - if (rt->rtServerReturn == argNULL) - return "void"; - else - return rt->rtServerReturn->argType->itTransType; -} - -static void -WriteLocalVarDecl(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - if (it->itInLine && it->itVarArray) - { - register const ipc_type_t *btype = it->itElement; - - fprintf(file, "\t%s %s[%d]", btype->itTransType, - arg->argVarName, it->itNumber/btype->itNumber); - } - else - fprintf(file, "\t%s %s", it->itTransType, arg->argVarName); -} - -static void -WriteLocalPtrDecl(FILE *file, register const argument_t *arg) -{ - fprintf(file, "\t%s *%sP", - FetchServerType(arg->argType->itElement), - arg->argVarName); -} - -static void -WriteServerArgDecl(FILE *file, const argument_t *arg) -{ - fprintf(file, "%s %s%s", - arg->argType->itTransType, - arg->argByReferenceServer ? "*" : "", - arg->argVarName); -} - -/* - * Writes the local variable declarations which are always - * present: InP, OutP, the server-side work function. - */ -static void -WriteVarDecls(FILE *file, const routine_t *rt) -{ - int i; - boolean_t NeedMsghSize = FALSE; - boolean_t NeedMsghSizeDelta = FALSE; - - fprintf(file, "\tregister Request *In0P = (Request *) InHeadP;\n"); - for (i = 1; i <= rt->rtMaxRequestPos; i++) - fprintf(file, "\tregister Request *In%dP;\n", i); - fprintf(file, "\tregister Reply *OutP = (Reply *) OutHeadP;\n"); - - fprintf(file, "\tmig_external %s %s\n", - ServerSideType(rt), rt->rtServerName); - fprintf(file, "\t\t("); - WriteList(file, rt->rtArgs, WriteServerArgDecl, akbServerArg, ", ", ""); - fprintf(file, ");\n"); - fprintf(file, "\n"); - - if (!rt->rtSimpleFixedReply) - fprintf(file, "\tboolean_t msgh_simple;\n"); - else if (!rt->rtSimpleCheckRequest) - { - fprintf(file, "#if\tTypeCheck\n"); - fprintf(file, "\tboolean_t msgh_simple;\n"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - fprintf(file, "\n"); - } - - /* if either request or reply is variable, we may need - msgh_size_delta and msgh_size */ - - if (rt->rtNumRequestVar > 0) - NeedMsghSize = TRUE; - if (rt->rtMaxRequestPos > 0) - NeedMsghSizeDelta = TRUE; - - if (rt->rtNumReplyVar > 1) - NeedMsghSize = TRUE; - if (rt->rtMaxReplyPos > 0) - NeedMsghSizeDelta = TRUE; - - if (NeedMsghSize) - fprintf(file, "\tunsigned int msgh_size;\n"); - if (NeedMsghSizeDelta) - fprintf(file, "\tunsigned int msgh_size_delta;\n"); - - if (NeedMsghSize || NeedMsghSizeDelta) - fprintf(file, "\n"); -} - -static void -WriteMsgError(FILE *file, const char *error_msg) -{ - fprintf(file, "\t\t{ OutP->RetCode = %s; return; }\n", error_msg); -} - -static void -WriteReplyInit(FILE *file, const routine_t *rt) -{ - boolean_t printed_nl = FALSE; - - if (rt->rtSimpleFixedReply) - { - if (!rt->rtSimpleSendReply) /* complex reply message */ - { - printed_nl = TRUE; - fprintf(file, "\n"); - fprintf(file, - "\tOutP->Head.msgh_bits |= MACH_MSGH_BITS_COMPLEX;\n"); - } - } - else - { - printed_nl = TRUE; - fprintf(file, "\n"); - fprintf(file, "\tmsgh_simple = %s;\n", - strbool(rt->rtSimpleSendReply)); - } - - if (rt->rtNumReplyVar == 0) - { - if (!printed_nl) - fprintf(file, "\n"); - fprintf(file, "\tOutP->Head.msgh_size = %d;\n", rt->rtReplySize); - } -} - -static void -WriteReplyHead(FILE *file, const routine_t *rt) -{ - if ((!rt->rtSimpleFixedReply) || - (rt->rtNumReplyVar > 1)) - { - fprintf(file, "\n"); - if (rt->rtMaxReplyPos > 0) - fprintf(file, "\tOutP = (Reply *) OutHeadP;\n"); - } - - if (!rt->rtSimpleFixedReply) - { - fprintf(file, "\tif (!msgh_simple)\n"); - fprintf(file, - "\t\tOutP->Head.msgh_bits |= MACH_MSGH_BITS_COMPLEX;\n"); - } - if (rt->rtNumReplyVar > 1) - fprintf(file, "\tOutP->Head.msgh_size = msgh_size;\n"); -} - -static void -WriteCheckHead(FILE *file, const routine_t *rt) -{ - fprintf(file, "#if\tTypeCheck\n"); - if (rt->rtNumRequestVar > 0) - fprintf(file, "\tmsgh_size = In0P->Head.msgh_size;\n"); - if (!rt->rtSimpleCheckRequest) - fprintf(file, "\tmsgh_simple = !(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX);\n"); - - if (rt->rtNumRequestVar > 0) - fprintf(file, "\tif ((msgh_size < %d)", - rt->rtRequestSize); - else - fprintf(file, "\tif ((In0P->Head.msgh_size != %d)", - rt->rtRequestSize); - - if (rt->rtSimpleCheckRequest) - fprintf(file, " ||\n\t %s(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)", - rt->rtSimpleReceiveRequest ? "" : "!"); - fprintf(file, ")\n"); - WriteMsgError(file, "MIG_BAD_ARGUMENTS"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - fprintf(file, "\n"); -} - -static void -WriteTypeCheck(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - register const routine_t *rt = arg->argRoutine; - - fprintf(file, "#if\tTypeCheck\n"); - if (akCheck(arg->argKind, akbRequestQC)) - fprintf(file, "\tif (* (int *) &In%dP->%s != * (int *) &%sCheck)\n", - arg->argRequestPos, arg->argTTName, arg->argVarName); - else - { - fprintf(file, "\tif ("); - if (!it->itIndefinite) { - fprintf(file, "(In%dP->%s%s.msgt_inline != %s) ||\n\t ", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - strbool(it->itInLine)); - } - fprintf(file, "(In%dP->%s%s.msgt_longform != %s) ||\n", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - strbool(arg->argLongForm)); - if (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC) - { - if (!rt->rtSimpleCheckRequest) - fprintf(file, "\t (MACH_MSG_TYPE_PORT_ANY(In%dP->%s.msgt%s_name) && msgh_simple) ||\n", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? "l" : ""); - } - else - fprintf(file, "\t (In%dP->%s.msgt%s_name != %s) ||\n", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? "l" : "", - it->itOutNameStr); - if (!it->itVarArray) - fprintf(file, "\t (In%dP->%s.msgt%s_number != %d) ||\n", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? "l" : "", - it->itNumber); - fprintf(file, "\t (In%dP->%s.msgt%s_size != %d))\n", - arg->argRequestPos, arg->argTTName, - arg->argLongForm ? "l" : "", - it->itSize); - } - WriteMsgError(file, "MIG_BAD_ARGUMENTS"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - fprintf(file, "\n"); -} - -static void -WriteCheckArgSize(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - register const ipc_type_t *btype = ptype->itElement; - const argument_t *count = arg->argCount; - int multiplier = btype->itTypeSize / btype->itNumber; - - if (ptype->itIndefinite) { - /* - * Check descriptor. If out-of-line, use standard size. - */ - fprintf(file, "(In%dP->%s%s.msgt_inline) ? ", - arg->argRequestPos, - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - } - - if (btype->itTypeSize % 4 != 0) - fprintf(file, "("); - - if (multiplier > 1) - fprintf(file, "%d * ", multiplier); - - fprintf(file, "In%dP->%s", arg->argRequestPos, count->argMsgField); - - /* If the base type size of the data field isn`t a multiple of 4, - we have to round up. */ - if (btype->itTypeSize % 4 != 0) - fprintf(file, " + 3) & ~3"); - - if (ptype->itIndefinite) { - fprintf(file, " : sizeof(%s *)", FetchServerType(btype)); - } -} - -static void -WriteCheckMsgSize(FILE *file, register const argument_t *arg) -{ - register const routine_t *rt = arg->argRoutine; - - /* If there aren't any more In args after this, then - we can use the msgh_size_delta value directly in - the TypeCheck conditional. */ - - if (arg->argRequestPos == rt->rtMaxRequestPos) - { - fprintf(file, "#if\tTypeCheck\n"); - fprintf(file, "\tif (msgh_size != %d + (", rt->rtRequestSize); - WriteCheckArgSize(file, arg); - fprintf(file, "))\n"); - - WriteMsgError(file, "MIG_BAD_ARGUMENTS"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - else - { - /* If there aren't any more variable-sized arguments after this, - then we must check for exact msg-size and we don't need to - update msgh_size. */ - - boolean_t LastVarArg = arg->argRequestPos+1 == rt->rtNumRequestVar; - - /* calculate the actual size in bytes of the data field. note - that this quantity must be a multiple of four. hence, if - the base type size isn't a multiple of four, we have to - round up. note also that btype->itNumber must - divide btype->itTypeSize (see itCalculateSizeInfo). */ - - fprintf(file, "\tmsgh_size_delta = "); - WriteCheckArgSize(file, arg); - fprintf(file, ";\n"); - fprintf(file, "#if\tTypeCheck\n"); - - /* Don't decrement msgh_size until we've checked that - it won't underflow. */ - - if (LastVarArg) - fprintf(file, "\tif (msgh_size != %d + msgh_size_delta)\n", - rt->rtRequestSize); - else - fprintf(file, "\tif (msgh_size < %d + msgh_size_delta)\n", - rt->rtRequestSize); - WriteMsgError(file, "MIG_BAD_ARGUMENTS"); - - if (!LastVarArg) - fprintf(file, "\tmsgh_size -= msgh_size_delta;\n"); - - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - fprintf(file, "\n"); -} - -static const char * -InArgMsgField(register const argument_t *arg) -{ - static char buffer[100]; - - /* - * Inside the kernel, the request and reply port fields - * really hold ipc_port_t values, not mach_port_t values. - * Hence we must cast the values. - */ - - if (IsKernelServer && - ((akIdent(arg->argKind) == akeRequestPort) || - (akIdent(arg->argKind) == akeReplyPort))) - sprintf(buffer, "(ipc_port_t) In%dP->%s", - arg->argRequestPos, arg->argMsgField); - else - sprintf(buffer, "In%dP->%s", - arg->argRequestPos, arg->argMsgField); - - return buffer; -} - -static void -WriteExtractArgValue(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - if (arg->argMultiplier > 1) - WriteCopyType(file, it, "%s", "/* %s */ %s / %d", - arg->argVarName, InArgMsgField(arg), arg->argMultiplier); - else if (it->itInTrans != strNULL) - WriteCopyType(file, it, "%s", "/* %s */ %s(%s)", - arg->argVarName, it->itInTrans, InArgMsgField(arg)); - else - WriteCopyType(file, it, "%s", "/* %s */ %s", - arg->argVarName, InArgMsgField(arg)); - fprintf(file, "\n"); -} - -static void -WriteInitializeCount(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argParent->argType; - register const ipc_type_t *btype = ptype->itElement; - - /* - * Initialize 'count' argument for variable-length inline OUT parameter - * with maximum allowed number of elements. - */ - - fprintf(file, "\t%s = %d;\n", arg->argVarName, - ptype->itNumber/btype->itNumber); - - /* - * If the user passed in a count, then we use the minimum. - * We can't let the user completely override our maximum, - * or the user might convince the server to overwrite the buffer. - */ - - if (arg->argCInOut != argNULL) { - const char *msgfield = InArgMsgField(arg->argCInOut); - - fprintf(file, "\tif (%s < %s)\n", msgfield, arg->argVarName); - fprintf(file, "\t\t%s = %s;\n", arg->argVarName, msgfield); - } - - fprintf(file, "\n"); -} - -static void -WriteInitializePtr(FILE *file, register const argument_t *arg) -{ - if (akCheck(arg->argKind, akbVarNeeded)) - fprintf(file, "\t%sP = %s;\n", - arg->argVarName, arg->argVarName); - else - fprintf(file, "\t%sP = OutP->%s;\n", - arg->argVarName, arg->argMsgField); -} - -static void -WriteTypeCheckArg(FILE *file, register const argument_t *arg) -{ - if (akCheck(arg->argKind, akbRequest)) { - WriteTypeCheck(file, arg); - - if (akCheck(arg->argKind, akbVariable)) - WriteCheckMsgSize(file, arg); - } -} - -static void -WriteAdjustRequestMsgPtr(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - - fprintf(file, - "\tIn%dP = (Request *) ((char *) In%dP + msgh_size_delta - %d);\n\n", - arg->argRequestPos+1, arg->argRequestPos, - ptype->itTypeSize + ptype->itPadSize); -} - -static void -WriteTypeCheckRequestArgs(FILE *file, register const routine_t *rt) -{ - register const argument_t *arg; - register const argument_t *lastVarArg; - - lastVarArg = argNULL; - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - - /* - * Advance message pointer if the last request argument was - * variable-length and the request position will change. - */ - if (lastVarArg != argNULL && - lastVarArg->argRequestPos < arg->argRequestPos) - { - WriteAdjustRequestMsgPtr(file, lastVarArg); - lastVarArg = argNULL; - } - - /* - * Type-check the argument. - */ - WriteTypeCheckArg(file, arg); - - /* - * Remember whether this was variable-length. - */ - if (akCheckAll(arg->argKind, akbVariable|akbRequest)) - lastVarArg = arg; - } -} - -static void -WriteExtractArg(FILE *file, register const argument_t *arg) -{ - if (akCheckAll(arg->argKind, akbSendRcv|akbVarNeeded)) - WriteExtractArgValue(file, arg); - - if ((akIdent(arg->argKind) == akeCount) && - akCheck(arg->argKind, akbReturnSnd)) - { - register ipc_type_t *ptype = arg->argParent->argType; - - if (ptype->itInLine && ptype->itVarArray) - WriteInitializeCount(file, arg); - } - - if (akCheckAll(arg->argKind, akbReturnSnd|akbPointer)) - WriteInitializePtr(file, arg); -} - -static void -WriteServerCallArg(FILE *file, register const argument_t *arg) -{ - const ipc_type_t *it = arg->argType; - boolean_t NeedClose = FALSE; - - if (arg->argByReferenceServer) - fprintf(file, "&"); - - if ((it->itInTrans != strNULL) && - akCheck(arg->argKind, akbSendRcv) && - !akCheck(arg->argKind, akbVarNeeded)) - { - fprintf(file, "%s(", it->itInTrans); - NeedClose = TRUE; - } - - if (akCheck(arg->argKind, akbPointer)) - fprintf(file, "%sP", arg->argVarName); - else if (akCheck(arg->argKind, akbVarNeeded)) - fprintf(file, "%s", arg->argVarName); - else if (akCheck(arg->argKind, akbSendRcv)) { - if (akCheck(arg->argKind, akbIndefinite)) { - fprintf(file, "(In%dP->%s%s.msgt_inline) ", - arg->argRequestPos, - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - fprintf(file, "? %s ", InArgMsgField(arg)); - fprintf(file, ": *((%s **)%s)", - FetchServerType(arg->argType->itElement), - InArgMsgField(arg)); - } - else - fprintf(file, "%s", InArgMsgField(arg)); - } - else - fprintf(file, "OutP->%s", arg->argMsgField); - - if (NeedClose) - fprintf(file, ")"); - - if (!arg->argByReferenceServer && (arg->argMultiplier > 1)) - fprintf(file, " / %d", arg->argMultiplier); -} - -static void -WriteDestroyArg(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - if (akCheck(arg->argKind, akbIndefinite)) { - /* - * Deallocate only if out-of-line. - */ - argument_t *count = arg->argCount; - ipc_type_t *btype = it->itElement; - int multiplier = btype->itTypeSize / btype->itNumber; - - fprintf(file, "\tif (!In%dP->%s%s.msgt_inline)\n", - arg->argRequestPos, - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - fprintf(file, "\t\t%smig_deallocate(* (vm_offset_t *) %s, ", - SubrPrefix, InArgMsgField(arg)); - if (multiplier > 1) - fprintf(file, "%d * ", multiplier); - fprintf(file, " %s);\n", InArgMsgField(count)); - } else { - if (akCheck(arg->argKind, akbVarNeeded)) - fprintf(file, "\t%s(%s);\n", it->itDestructor, arg->argVarName); - else - fprintf(file, "\t%s(%s);\n", it->itDestructor, - InArgMsgField(arg)); - } -} - -static void -WriteDestroyPortArg(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - /* - * If a translated port argument occurs in the body of a request - * message, and the message is successfully processed, then the - * port right should be deallocated. However, the called function - * didn't see the port right; it saw the translation. So we have - * to release the port right for it. - */ - - if ((it->itInTrans != strNULL) && - (it->itOutName == MACH_MSG_TYPE_PORT_SEND)) - { - fprintf(file, "\n"); - fprintf(file, "\tif (IP_VALID(%s))\n", InArgMsgField(arg)); - fprintf(file, "\t\t%sipc_port_release_send(%s);\n", - SubrPrefix, InArgMsgField(arg)); - } -} - -/* - * Check whether WriteDestroyPortArg would generate any code for arg. - */ -static boolean_t -CheckDestroyPortArg(register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - if ((it->itInTrans != strNULL) && - (it->itOutName == MACH_MSG_TYPE_PORT_SEND)) - { - return TRUE; - } - return FALSE; -} - -static void -WriteServerCall(FILE *file, const routine_t *rt) -{ - boolean_t NeedClose = FALSE; - - fprintf(file, "\t"); - if (rt->rtServerReturn != argNULL) - { - const argument_t *arg = rt->rtServerReturn; - const ipc_type_t *it = arg->argType; - - fprintf(file, "OutP->%s = ", arg->argMsgField); - if (it->itOutTrans != strNULL) - { - fprintf(file, "%s(", it->itOutTrans); - NeedClose = TRUE; - } - } - fprintf(file, "%s(", rt->rtServerName); - WriteList(file, rt->rtArgs, WriteServerCallArg, akbServerArg, ", ", ""); - if (NeedClose) - fprintf(file, ")"); - fprintf(file, ");\n"); -} - -static void -WriteGetReturnValue(FILE *file, register const routine_t *rt) -{ - if (rt->rtServerReturn != rt->rtRetCode) - fprintf(file, "\tOutP->%s = KERN_SUCCESS;\n", - rt->rtRetCode->argMsgField); -} - -static void -WriteCheckReturnValue(FILE *file, register const routine_t *rt) -{ - if (rt->rtServerReturn == rt->rtRetCode) - { - fprintf(file, "\tif (OutP->%s != KERN_SUCCESS)\n", - rt->rtRetCode->argMsgField); - fprintf(file, "\t\treturn;\n"); - } -} - -static void -WritePackArgType(FILE *file, register const argument_t *arg) -{ - fprintf(file, "\n"); - - WritePackMsgType(file, arg->argType, - arg->argType->itIndefinite ? d_NO : arg->argDeallocate, - arg->argLongForm, !IsKernelServer, - "OutP->%s", "%s", arg->argTTName); -} - -static void -WritePackArgValue(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - fprintf(file, "\n"); - - if (it->itInLine && it->itVarArray) { - - if (it->itString) { - /* - * Copy variable-size C string with mig_strncpy. - * Save the string length (+ 1 for trailing 0) - * in the argument`s count field. - */ - fprintf(file, - "\tOutP->%s = %smig_strncpy(OutP->%s, %s, %d);\n", - arg->argCount->argMsgField, - SubrPrefix, - arg->argMsgField, - arg->argVarName, - it->itNumber); - } - else { - register argument_t *count = arg->argCount; - register ipc_type_t *btype = it->itElement; - - /* Note btype->itNumber == count->argMultiplier */ - - if (it->itIndefinite) { - /* - * If we are packing argument, it must be from - * a local variable. - */ - fprintf(file, "\tif (%sP != %s) {\n", - arg->argVarName, - arg->argVarName); - fprintf(file, "\t\tOutP->%s%s.msgt_inline = FALSE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - if (arg->argDeallocate == d_YES) - fprintf(file, "\t\tOutP->%s%s.msgt_deallocate = TRUE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - else if (arg->argDeallocate == d_MAYBE) - fprintf(file, "\t\tOutP->%s%s.msgt_deallocate = %s;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - arg->argDealloc->argVarName); - fprintf(file, "\t\t*((%s **)OutP->%s) = %sP;\n", - FetchServerType(btype), - arg->argMsgField, - arg->argVarName); - if (!arg->argRoutine->rtSimpleFixedReply) - fprintf(file, "\t\tmsgh_simple = FALSE;\n"); - fprintf(file, "\t}\n\telse {\n\t"); - } - fprintf(file, "\tmemcpy(OutP->%s, %s, ", - arg->argMsgField, arg->argVarName); - if (btype->itTypeSize > 1) - fprintf(file, "%d * ", - btype->itTypeSize); - fprintf(file, "%s);\n", - count->argVarName); - if (it->itIndefinite) - fprintf(file, "\t}\n"); - } - } - else if (arg->argMultiplier > 1) - WriteCopyType(file, it, "OutP->%s", "/* %s */ %d * %s", - arg->argMsgField, - arg->argMultiplier, - arg->argVarName); - else if (it->itOutTrans != strNULL) - WriteCopyType(file, it, "OutP->%s", "/* %s */ %s(%s)", - arg->argMsgField, it->itOutTrans, arg->argVarName); - else - WriteCopyType(file, it, "OutP->%s", "/* %s */ %s", - arg->argMsgField, arg->argVarName); -} - -static void -WriteCopyArgValue(FILE *file, register const argument_t *arg) -{ - fprintf(file, "\n"); - WriteCopyType(file, arg->argType, "/* %d */ OutP->%s", "In%dP->%s", - arg->argRequestPos, arg->argMsgField); -} - -static void -WriteAdjustMsgSimple(FILE *file, register const argument_t *arg) -{ - /* akbVarNeeded must be on */ - - if (!arg->argRoutine->rtSimpleFixedReply) - { - fprintf(file, "\n"); - fprintf(file, "\tif (MACH_MSG_TYPE_PORT_ANY(%s))\n", arg->argVarName); - fprintf(file, "\t\tmsgh_simple = FALSE;\n"); - } -} - -static void -WriteAdjustMsgCircular(FILE *file, register const argument_t *arg) -{ - fprintf(file, "\n"); - - if (arg->argType->itOutName == MACH_MSG_TYPE_POLYMORPHIC) - fprintf(file, "\tif (%s == MACH_MSG_TYPE_PORT_RECEIVE)\n", - arg->argPoly->argVarName); - - /* - * The carried port right can be accessed in OutP->XXXX. Normally - * the server function stuffs it directly there. If it is InOut, - * then it has already been copied into the reply message. - * If the server function deposited it into a variable (perhaps - * because the reply message is variable-sized) then it has already - * been copied into the reply message. Note we must use InHeadP - * (or In0P->Head) and OutHeadP to access the message headers, - * because of the variable-sized messages. - */ - - fprintf(file, "\tif (IP_VALID((ipc_port_t) InHeadP->msgh_reply_port) &&\n"); - fprintf(file, "\t IP_VALID((ipc_port_t) OutP->%s) &&\n", arg->argMsgField); - fprintf(file, "\t %sipc_port_check_circularity((ipc_port_t) OutP->%s, (ipc_port_t) InHeadP->msgh_reply_port))\n", - SubrPrefix, arg->argMsgField); - fprintf(file, "\t\tOutHeadP->msgh_bits |= MACH_MSGH_BITS_CIRCULAR;\n"); -} - -/* - * Calculate the size of a variable-length message field. - */ -static void -WriteArgSize(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - register int bsize = ptype->itElement->itTypeSize; - register const argument_t *count = arg->argCount; - - if (ptype->itIndefinite) { - /* - * Check descriptor. If out-of-line, use standard size. - */ - fprintf(file, "(OutP->%s%s.msgt_inline) ? ", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - } - - if (bsize % 4 != 0) - fprintf(file, "("); - - if (bsize > 1) - fprintf(file, "%d * ", bsize); - if (ptype->itString) - /* get count from descriptor in message */ - fprintf(file, "OutP->%s", count->argMsgField); - else - /* get count from argument */ - fprintf(file, "%s", count->argVarName); - - /* - * If the base type size is not a multiple of sizeof(int) [4], - * we have to round up. - */ - if (bsize % 4 != 0) - fprintf(file, " + 3) & ~3"); - - if (ptype->itIndefinite) { - fprintf(file, " : sizeof(%s *)", - FetchServerType(ptype->itElement)); - } -} - -/* - * Adjust message size and advance reply pointer. - * Called after packing a variable-length argument that - * has more arguments following. - */ -static void -WriteAdjustMsgSize(FILE *file, register const argument_t *arg) -{ - register routine_t *rt = arg->argRoutine; - register ipc_type_t *ptype = arg->argType; - - /* There are more Out arguments. We need to adjust msgh_size - and advance OutP, so we save the size of the current field - in msgh_size_delta. */ - - fprintf(file, "\tmsgh_size_delta = "); - WriteArgSize(file, arg); - fprintf(file, ";\n"); - - if (rt->rtNumReplyVar == 1) - /* We can still address the message header directly. Fill - in the size field. */ - - fprintf(file, "\tOutP->Head.msgh_size = %d + msgh_size_delta;\n", - rt->rtReplySize); - else - if (arg->argReplyPos == 0) - /* First variable-length argument. The previous msgh_size value - is the minimum reply size. */ - - fprintf(file, "\tmsgh_size = %d + msgh_size_delta;\n", - rt->rtReplySize); - else - fprintf(file, "\tmsgh_size += msgh_size_delta;\n"); - - fprintf(file, - "\tOutP = (Reply *) ((char *) OutP + msgh_size_delta - %d);\n", - ptype->itTypeSize + ptype->itPadSize); -} - -/* - * Calculate the size of the message. Called after the - * last argument has been packed. - */ -static void -WriteFinishMsgSize(FILE *file, register const argument_t *arg) -{ - /* No more Out arguments. If this is the only variable Out - argument, we can assign to msgh_size directly. */ - - if (arg->argReplyPos == 0) { - fprintf(file, "\tOutP->Head.msgh_size = %d + (", - arg->argRoutine->rtReplySize); - WriteArgSize(file, arg); - fprintf(file, ");\n"); - } - else { - fprintf(file, "\tmsgh_size += "); - WriteArgSize(file, arg); - fprintf(file, ";\n"); - } -} - -static void -WritePackArg(FILE *file, register const argument_t *arg) -{ - if (akCheck(arg->argKind, akbReplyInit)) - WritePackArgType(file, arg); - - if ((akIdent(arg->argKind) == akePoly) && - akCheck(arg->argKind, akbReturnSnd)) - WriteAdjustMsgSimple(file, arg); - - if (akCheckAll(arg->argKind, akbReturnSnd|akbVarNeeded)) - WritePackArgValue(file, arg); - else if (akCheckAll(arg->argKind, akbReturnSnd|akbVariable)) { - register const ipc_type_t *it = arg->argType; - - if (it->itString) { - /* Need to call strlen to calculate the size of the argument. */ - fprintf(file, "\tOutP->%s = strlen(OutP->%s) + 1;\n", - arg->argCount->argMsgField, arg->argMsgField); - } else if (it->itIndefinite) { - /* - * We know that array is in reply message. - */ - fprintf(file, "\tif (%sP != OutP->%s) {\n", - arg->argVarName, - arg->argMsgField); - fprintf(file, "\t\tOutP->%s%s.msgt_inline = FALSE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - if (arg->argDeallocate == d_YES) - fprintf(file, "\t\tOutP->%s%s.msgt_deallocate = TRUE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - else if (arg->argDeallocate == d_MAYBE) - fprintf(file, "\t\tOutP->%s%s.msgt_deallocate = %s;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - arg->argDealloc->argVarName); - fprintf(file, "\t\t*((%s **)OutP->%s) = %sP;\n", - FetchServerType(it->itElement), - arg->argMsgField, - arg->argVarName); - if (!arg->argRoutine->rtSimpleFixedReply) - fprintf(file, "\t\tmsgh_simple = FALSE;\n"); - fprintf(file, "\t}\n"); - } - } - - if (akCheck(arg->argKind, akbReplyCopy)) - WriteCopyArgValue(file, arg); - - /* - * If this is a KernelServer, and the reply message contains - * a receive right, we must check for the possibility of a - * port/message circularity. If queueing the reply message - * would cause a circularity, we mark the reply message - * with the circular bit. - */ - - if (IsKernelServer && - akCheck(arg->argKind, akbReturnSnd) && - ((arg->argType->itOutName == MACH_MSG_TYPE_PORT_RECEIVE) || - (arg->argType->itOutName == MACH_MSG_TYPE_POLYMORPHIC))) - WriteAdjustMsgCircular(file, arg); -} - -/* - * Handle reply arguments - fill in message types and copy arguments - * that need to be copied. - */ -static void -WritePackReplyArgs(FILE *file, register const routine_t *rt) -{ - register const argument_t *arg; - register const argument_t *lastVarArg; - - lastVarArg = argNULL; - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - - /* - * Adjust message size and advance message pointer if - * the last reply argument was variable-length and the - * request position will change. - */ - if (lastVarArg != argNULL && - lastVarArg->argReplyPos < arg->argReplyPos) - { - WriteAdjustMsgSize(file, lastVarArg); - lastVarArg = argNULL; - } - - /* - * Copy the argument - */ - WritePackArg(file, arg); - - /* - * Remember whether this was variable-length. - */ - if (akCheckAll(arg->argKind, akbReturnSnd|akbVariable)) - lastVarArg = arg; - } - - /* - * Finish the message size. - */ - if (lastVarArg != argNULL) - WriteFinishMsgSize(file, lastVarArg); -} - -static void -WriteFieldDecl(FILE *file, const argument_t *arg) -{ - WriteFieldDeclPrim(file, arg, FetchServerType); -} - -static void -WriteRoutine(FILE *file, register const routine_t *rt) -{ - fprintf(file, "\n"); - - fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName); - fprintf(file, "mig_internal void _X%s\n", rt->rtName); - fprintf(file, "\t(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)\n"); - - fprintf(file, "{\n"); - WriteStructDecl(file, rt->rtArgs, WriteFieldDecl, akbRequest, "Request"); - WriteStructDecl(file, rt->rtArgs, WriteFieldDecl, akbReply, "Reply"); - - WriteVarDecls(file, rt); - - WriteList(file, rt->rtArgs, WriteCheckDecl, akbRequestQC, "\n", "\n"); - WriteList(file, rt->rtArgs, - IsKernelServer ? WriteTypeDeclOut : WriteTypeDeclIn, - akbReplyInit, "\n", "\n"); - - WriteList(file, rt->rtArgs, WriteLocalVarDecl, - akbVarNeeded, ";\n", ";\n\n"); - WriteList(file, rt->rtArgs, WriteLocalPtrDecl, - akbPointer, ";\n", ";\n\n"); - - WriteCheckHead(file, rt); - - WriteTypeCheckRequestArgs(file, rt); - WriteList(file, rt->rtArgs, WriteExtractArg, akbNone, "", ""); - - WriteServerCall(file, rt); - WriteGetReturnValue(file, rt); - - WriteReverseList(file, rt->rtArgs, WriteDestroyArg, akbDestroy, "", ""); - - /* - * For one-way routines, it doesn`t make sense to check the return - * code, because we return immediately afterwards. However, - * kernel servers may want to deallocate port arguments - and the - * deallocation must not be done if the return code is not KERN_SUCCESS. - */ - if (rt->rtOneWay || rt->rtNoReplyArgs) - { - if (IsKernelServer) - { - if (rtCheckMaskFunction(rt->rtArgs, akbSendBody|akbSendRcv, - CheckDestroyPortArg)) - { - WriteCheckReturnValue(file, rt); - } - WriteReverseList(file, rt->rtArgs, WriteDestroyPortArg, - akbSendBody|akbSendRcv, "", ""); - } - } - else - { - WriteCheckReturnValue(file, rt); - - if (IsKernelServer) - WriteReverseList(file, rt->rtArgs, WriteDestroyPortArg, - akbSendBody|akbSendRcv, "", ""); - - WriteReplyInit(file, rt); - WritePackReplyArgs(file, rt); - WriteReplyHead(file, rt); - } - - fprintf(file, "}\n"); -} - -void -WriteServer(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - - WriteProlog(file); - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - WriteRoutine(file, stat->stRoutine); - break; - case skImport: - case skSImport: - WriteImport(file, stat->stFileName); - break; - case skUImport: - break; - default: - fatal("WriteServer(): bad statement_kind_t (%d)", - (int) stat->stKind); - } - WriteEpilog(file, stats); -} diff --git a/mig/statement.c b/mig/statement.c deleted file mode 100644 index d26e17c..0000000 --- a/mig/statement.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include - -#include "global.h" -#include "error.h" -#include "statement.h" - -statement_t *StatementList = stNULL; -static statement_t **last = &StatementList; - -statement_t * -stAlloc(void) -{ - register statement_t *new; - - new = malloc(sizeof *new); - if (new == stNULL) - fatal("stAlloc(): %s", unix_error_string(errno)); - *last = new; - last = &new->stNext; - new->stNext = stNULL; - return new; -} diff --git a/mig/statement.h b/mig/statement.h deleted file mode 100644 index 914c6d8..0000000 --- a/mig/statement.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _STATEMENT_H -#define _STATEMENT_H - -#include "routine.h" - -typedef enum statement_kind -{ - skRoutine, - skImport, - skUImport, - skSImport, - skRCSDecl, -} statement_kind_t; - -typedef struct statement -{ - statement_kind_t stKind; - struct statement *stNext; - union - { - /* when stKind == skRoutine */ - routine_t *_stRoutine; - /* when stKind == skImport, skUImport, skSImport */ - const_string_t _stFileName; - } data; -} statement_t; - -#define stRoutine data._stRoutine -#define stFileName data._stFileName - -#define stNULL ((statement_t *) 0) - -/* stNext will be initialized to put the statement in the list */ -extern statement_t *stAlloc(void); - -/* list of statements, in order they occur in the .defs file */ -extern statement_t *StatementList; - -#endif _STATEMENT_H diff --git a/mig/string.c b/mig/string.c deleted file mode 100644 index 6fe29c2..0000000 --- a/mig/string.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include -#include - -#include "boolean.h" -#include "error.h" -#include "mig_string.h" - -string_t -strmake(const char *string) -{ - register string_t saved; - - saved = malloc(strlen(string) + 1); - if (saved == strNULL) - fatal("strmake('%s'): %s", string, unix_error_string(errno)); - return strcpy(saved, string); -} - -string_t -strconcat(const_string_t left, const_string_t right) -{ - register string_t saved; - - saved = malloc(strlen(left) + strlen(right) + 1); - if (saved == strNULL) - fatal("strconcat('%s', '%s'): %s", - left, right, unix_error_string(errno)); - return strcat(strcpy(saved, left), right); -} - -void -strfree(string_t string) -{ - free(string); -} - -const char * -strbool(boolean_t bool) -{ - if (bool) - return "TRUE"; - else - return "FALSE"; -} - -const char * -strstring(const_string_t string) -{ - if (string == strNULL) - return "NULL"; - else - return string; -} diff --git a/mig/type.c b/mig/type.c deleted file mode 100644 index 9c786e2..0000000 --- a/mig/type.c +++ /dev/null @@ -1,918 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#include -#include - -#include "error.h" -#include "global.h" -#include "type.h" -#include "message.h" - -#if word_size_in_bits == 32 -#define word_size_name MACH_MSG_TYPE_INTEGER_32 -#define word_size_name_string "MACH_MSG_TYPE_INTEGER_32" -#else -#if word_size_in_bits == 64 -#define word_size_name MACH_MSG_TYPE_INTEGER_64 -#define word_size_name_string "MACH_MSG_TYPE_INTEGER_64" -#else -#error Unsupported word size! -#endif -#endif - -ipc_type_t *itRetCodeType; /* used for return codes */ -ipc_type_t *itDummyType; /* used for camelot dummy args */ -ipc_type_t *itRequestPortType; /* used for default Request port arg */ -ipc_type_t *itZeroReplyPortType;/* used for dummy Reply port arg */ -ipc_type_t *itRealReplyPortType;/* used for default Reply port arg */ -ipc_type_t *itWaitTimeType; /* used for dummy WaitTime args */ -ipc_type_t *itMsgOptionType; /* used for dummy MsgOption args */ - -static ipc_type_t *list = itNULL; - -/* - * Searches for a named type. We use a simple - * self-organizing linked list. - */ -ipc_type_t * -itLookUp(identifier_t name) -{ - register ipc_type_t *it, **last; - - for (it = *(last = &list); it != itNULL; it = *(last = &it->itNext)) - if (streql(name, it->itName)) - { - /* move this type to the front of the list */ - *last = it->itNext; - it->itNext = list; - list = it; - - return it; - } - - return itNULL; -} - -/* - * Enters a new name-type association into - * our self-organizing linked list. - */ -void -itInsert(identifier_t name, ipc_type_t *it) -{ - it->itName = name; - it->itNext = list; - list = it; -} - -static ipc_type_t * -itAlloc(void) -{ - static const ipc_type_t prototype = - { - strNULL, /* identifier_t itName */ - 0, /* ipc_type_t *itNext */ - 0, /* u_int itTypeSize */ - 0, /* u_int itPadSize */ - 0, /* u_int itMinTypeSize */ - 0, /* u_int itInName */ - 0, /* u_int itOutName */ - 0, /* u_int itSize */ - 1, /* u_int itNumber */ - TRUE, /* boolean_t itInLine */ - FALSE, /* boolean_t itLongForm */ - d_NO, /* dealloc_t itDeallocate */ - strNULL, /* string_t itInNameStr */ - strNULL, /* string_t itOutNameStr */ - flNone, /* ipc_flags_t itFlags */ - TRUE, /* boolean_t itStruct */ - FALSE, /* boolean_t itString */ - FALSE, /* boolean_t itVarArray */ - FALSE, /* boolean_t itIndefinite */ - itNULL, /* ipc_type_t *itElement */ - strNULL, /* identifier_t itUserType */ - strNULL, /* identifier_t itServerType */ - strNULL, /* identifier_t itTransType */ - strNULL, /* identifier_t itInTrans */ - strNULL, /* identifier_t itOutTrans */ - strNULL, /* identifier_t itDestructor */ - }; - register ipc_type_t *new; - - new = malloc(sizeof *new); - if (new == itNULL) - fatal("itAlloc(): %s", unix_error_string(errno)); - *new = prototype; - return new; -} - -/* - * Convert an IPC type-name into a string. - */ -static string_t -itNameToString(u_int name) -{ - char buffer[100]; - - (void) sprintf(buffer, "%u", name); - return strmake(buffer); -} - -/* - * Calculate itTypeSize, itPadSize, itMinTypeSize. - * Every type needs this info; it is recalculated - * when itInLine, itNumber, or itSize changes. - */ -static void -itCalculateSizeInfo(register ipc_type_t *it) -{ - if (it->itInLine) - { - u_int bytes = (it->itNumber * it->itSize + 7) / 8; - u_int padding = (4 - bytes%4)%4; - - it->itTypeSize = bytes; - it->itPadSize = padding; - if (it->itVarArray) - it->itMinTypeSize = 0; - else - it->itMinTypeSize = bytes + padding; - } - else - { - /* out-of-line, so use size of pointers */ - u_int bytes = sizeof_pointer; - - it->itTypeSize = bytes; - it->itPadSize = 0; - it->itMinTypeSize = bytes; - } - - /* Unfortunately, these warning messages can't give a type name; - we haven't seen a name yet (it might stay anonymous.) */ - - if ((it->itNumber * it->itSize) % 8 != 0) - warn("size of C types must be multiples of 8 bits"); - - if ((it->itTypeSize == 0) && !it->itVarArray) - warn("sizeof(%s) == 0", it->itName); -} - -/* - * Fill in default values for some fields used in code generation: - * itInNameStr, itOutNameStr, itUserType, itServerType, itTransType - * Every argument's type should have these values filled in. - */ -static void -itCalculateNameInfo(register ipc_type_t *it) -{ - if (it->itInNameStr == strNULL) - it->itInNameStr = strmake(itNameToString(it->itInName)); - if (it->itOutNameStr == strNULL) - it->itOutNameStr = strmake(itNameToString(it->itOutName)); - - if (it->itUserType == strNULL) - it->itUserType = it->itName; - if (it->itServerType == strNULL) - it->itServerType = it->itName; - - /* - * KernelServer and KernelUser interfaces get special treatment here. - * On the kernel side of the interface, ports are really internal - * port pointers (ipc_port_t), not port names (mach_port_t). - * At this point, we don't know if the argument is in or out, - * so we don't know if we should look at itInName or itOutName. - * Looking at both should be OK. - * - * This is definitely a hack, but I think it is cleaner than - * mucking with type declarations throughout the kernel .def files, - * hand-conditionalizing on KERNEL_SERVER and KERNEL_USER. - */ - - if (IsKernelServer && - streql(it->itServerType, "mach_port_t") && - (((it->itInName == MACH_MSG_TYPE_POLYMORPHIC) && - (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC)) || - MACH_MSG_TYPE_PORT_ANY(it->itInName) || - MACH_MSG_TYPE_PORT_ANY(it->itOutName))) - it->itServerType = "ipc_port_t"; - - if (IsKernelUser && - streql(it->itUserType, "mach_port_t") && - (((it->itInName == MACH_MSG_TYPE_POLYMORPHIC) && - (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC)) || - MACH_MSG_TYPE_PORT_ANY(it->itInName) || - MACH_MSG_TYPE_PORT_ANY(it->itOutName))) - it->itUserType = "ipc_port_t"; - - if (it->itTransType == strNULL) - it->itTransType = it->itServerType; -} - -ipc_flags_t -itCheckFlags(ipc_flags_t flags, identifier_t name) -{ - /* only one of flLong and flNotLong */ - - if ((flags&(flLong|flNotLong)) == (flLong|flNotLong)) { - warn("%s: IsLong and IsNotLong cancel out", name); - flags &= ~(flLong|flNotLong); - } - - /* only one of flDealloc, flNotDealloc, flMaybeDealloc */ - - if (flags & flMaybeDealloc) { - if (flags & (flDealloc|flNotDealloc)) { - warn("%s: Dealloc and NotDealloc ignored with Dealloc[]", name); - flags &= ~(flDealloc|flNotDealloc); - } - } - - if ((flags&(flDealloc|flNotDealloc)) == (flDealloc|flNotDealloc)) { - warn("%s: Dealloc and NotDealloc cancel out", name); - flags &= ~(flDealloc|flNotDealloc); - } - - return flags; -} - -dealloc_t -itCheckDeallocate(const ipc_type_t *it, ipc_flags_t flags, dealloc_t dfault, - identifier_t name) -{ - dealloc_t dealloc = dfault; - - if (flags & flMaybeDealloc) - dealloc = d_MAYBE; - if (flags & flDealloc) - dealloc = d_YES; - if (flags & flNotDealloc) - dealloc = d_NO; - - if (dealloc == dfault) { - if (flags & flMaybeDealloc) - warn("%s: Dealloc[] is redundant", name); - if (flags & flDealloc) - warn("%s: Dealloc is redundant", name); - if (flags & flNotDealloc) - warn("%s: NotDealloc is redundant", name); - } - - if (flags & (flMaybeDealloc|flDealloc|flNotDealloc)) { - /* only give semantic warnings if the user specified something */ - - if (dealloc != d_NO) { - if (it->itInLine && !it->itIndefinite) - warn("%s: Dealloc will cause an IPC error", name); - } - } - - return dealloc; -} - -static enum uselong { NotLong, CanBeLong, ShouldBeLong, MustBeLong, TooLong } -itUseLong(register const ipc_type_t *it) -{ - enum uselong uselong = NotLong; - - if ((it->itInName == MACH_MSG_TYPE_POLYMORPHIC) || - (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC) || - it->itVarArray) - uselong = CanBeLong; - - if ((it->itVarArray && !it->itInLine) || it->itIndefinite) - uselong = ShouldBeLong; - - if (((it->itInName != MACH_MSG_TYPE_POLYMORPHIC) && - (it->itInName >= (1<<8))) || - ((it->itOutName != MACH_MSG_TYPE_POLYMORPHIC) && - (it->itOutName >= (1<<8))) || - (it->itSize >= (1<<8)) || - (it->itNumber >= (1<<12))) - uselong = MustBeLong; - - if (((it->itInName != MACH_MSG_TYPE_POLYMORPHIC) && - (it->itInName >= (1<<16))) || - ((it->itOutName != MACH_MSG_TYPE_POLYMORPHIC) && - (it->itOutName >= (1<<16))) || - (it->itSize >= (1<<16))) - uselong = TooLong; - - return uselong; -} - -boolean_t -itCheckIsLong(const ipc_type_t *it, ipc_flags_t flags, boolean_t dfault, - identifier_t name) -{ - boolean_t islong = dfault; - - if (flags & flLong) - islong = TRUE; - if (flags & flNotLong) - islong = FALSE; - - if (islong == dfault) { - if (flags & flLong) - warn("%s: IsLong is redundant", name); - if (flags & flNotLong) - warn("%s: IsNotLong is redundant", name); - } - - if (flags & (flLong|flNotLong)) { - enum uselong uselong = itUseLong(it); - - /* only give semantic warnings if the user specified something */ - - if (islong && ((int)uselong <= (int)NotLong)) - warn("%s: doesn't need IsLong", name); - if (!islong && ((int)uselong >= (int)MustBeLong)) - warn("%s: too big for IsNotLong", name); - } - - return islong; -} - -/****************************************************** - * Checks for non-implemented types, conflicting type - * flags and whether the long or short form of msg type - * descriptor is appropriate. Called after each type statement - * is parsed. - ******************************************************/ -static void -itCheckDecl(identifier_t name, register ipc_type_t *it) -{ - enum uselong uselong; - - it->itName = name; - - itCalculateNameInfo(it); - - /* do a bit of error checking, mostly necessary because of - limitations in Mig */ - - if (it->itVarArray) { - if ((it->itInTrans != strNULL) || (it->itOutTrans != strNULL)) - error("%s: can't translate variable-sized arrays", name); - - if (it->itDestructor != strNULL) - error("%s: can't destroy variable-sized array", name); - } - - if (it->itVarArray && it->itInLine) { - if ((it->itElement->itUserType == strNULL) || - (it->itElement->itServerType == strNULL)) - error("%s: variable-sized in-line arrays need a named base type", - name); - } - - /* process the IPC flag specification */ - - it->itFlags = itCheckFlags(it->itFlags, name); - - it->itDeallocate = itCheckDeallocate(it, it->itFlags, d_NO, name); - - uselong = itUseLong(it); - if (uselong == TooLong) - warn("%s: too big for mach_msg_type_long_t", name); - it->itLongForm = itCheckIsLong(it, it->itFlags, - (int)uselong >= (int)ShouldBeLong, name); -} - -/* - * Pretty-prints translation/destruction/type information. - */ -static void -itPrintTrans(const ipc_type_t *it) -{ - if (!streql(it->itName, it->itUserType)) - printf("\tCUserType:\t%s\n", it->itUserType); - - if (!streql(it->itName, it->itServerType)) - printf("\tCServerType:\t%s\n", it->itServerType); - - if (it->itInTrans != strNULL) - printf("\tInTran:\t\t%s %s(%s)\n", - it->itTransType, it->itInTrans, it->itServerType); - - if (it->itOutTrans != strNULL) - printf("\tOutTran:\t%s %s(%s)\n", - it->itServerType, it->itOutTrans, it->itTransType); - - if (it->itDestructor != strNULL) - printf("\tDestructor:\t%s(%s)\n", it->itDestructor, it->itTransType); -} - -/* - * Pretty-prints type declarations. - */ -static void -itPrintDecl(identifier_t name, const ipc_type_t *it) -{ - printf("Type %s = ", name); - if (!it->itInLine) - printf("^ "); - if (it->itVarArray) - if (it->itNumber == 0 || it->itIndefinite) - printf("array [] of "); - else - printf("array [*:%d] of ", it->itNumber); - else if (it->itStruct && ((it->itNumber != 1) || - (it->itInName == MACH_MSG_TYPE_STRING_C))) - printf("struct [%d] of ", it->itNumber); - else if (it->itNumber != 1) - printf("array [%d] of ", it->itNumber); - - if (streql(it->itInNameStr, it->itOutNameStr)) - printf("(%s,", it->itInNameStr); - else - printf("(%s|%s", it->itInNameStr, it->itOutNameStr); - - printf(" %d%s%s)\n", it->itSize, it->itLongForm ? ", IsLong" : "", - it->itDeallocate == d_YES ? ", Dealloc" - :it->itDeallocate == d_MAYBE ?", Dealloc[]" - : ""); - - itPrintTrans(it); - - printf("\n"); -} - -/* - * Handles named type-specs, which can occur in type - * declarations or in argument lists. For example, - * type foo = type-spec; // itInsert will get called later - * routine foo(arg : bar = type-spec); // itInsert won't get called - */ -void -itTypeDecl(identifier_t name, ipc_type_t *it) -{ - itCheckDecl(name, it); - - if (BeVerbose) - itPrintDecl(name, it); -} - -/* - * Handles declarations like - * type new = name; - * type new = inname|outname; - */ -ipc_type_t * -itShortDecl(u_int inname, const_string_t instr, u_int outname, - const_string_t outstr, u_int defsize) -{ - if (defsize == 0) - error("must use full IPC type decl"); - - return itLongDecl(inname, instr, outname, outstr, defsize, defsize, flNone); -} - -/* - * Handles declarations like - * type new = (name, size, flags...) - * type new = (inname|outname, size, flags...) - */ -ipc_type_t * -itLongDecl(u_int inname, const_string_t instr, u_int outname, - const_string_t outstr, u_int defsize, u_int size, ipc_flags_t flags) -{ - register ipc_type_t *it; - - if ((defsize != 0) && (defsize != size)) - warn("IPC type decl has strange size (%u instead of %u)", - size, defsize); - - it = itAlloc(); - it->itInName = inname; - it->itInNameStr = instr; - it->itOutName = outname; - it->itOutNameStr = outstr; - it->itSize = size; - if (inname == MACH_MSG_TYPE_STRING_C) - { - it->itStruct = FALSE; - it->itString = TRUE; - } - it->itFlags = flags; - - itCalculateSizeInfo(it); - return it; -} - -static ipc_type_t * -itCopyType(const ipc_type_t *old) -{ - register ipc_type_t *new = itAlloc(); - - *new = *old; - new->itName = strNULL; - new->itNext = itNULL; - new->itElement = (ipc_type_t *) old; - - /* size info still valid */ - return new; -} - -/* - * A call to itCopyType is almost always followed with itResetType. - * The exception is itPrevDecl. Also called before adding any new - * translation/destruction/type info (see parser.y). - * - * type new = old; // new doesn't get old's info - * type new = array[*:10] of old; - * // new doesn't get old's info, but new->itElement does - * type new = array[*:10] of struct[3] of old; - * // new and new->itElement don't get old's info - */ - -ipc_type_t * -itResetType(ipc_type_t *old) -{ - /* reset all special translation/destruction/type info */ - - old->itInTrans = strNULL; - old->itOutTrans = strNULL; - old->itDestructor = strNULL; - old->itUserType = strNULL; - old->itServerType = strNULL; - old->itTransType = strNULL; - return old; -} - -/* - * Handles the declaration - * type new = old; - */ -ipc_type_t * -itPrevDecl(identifier_t name) -{ - register ipc_type_t *old; - - old = itLookUp(name); - if (old == itNULL) - { - error("type '%s' not defined", name); - return itAlloc(); - } - else - return itCopyType(old); -} - -/* - * Handles the declarations - * type new = array[] of old; // number is 0 - * type new = array[*] of old; // number is 0 - * type new = array[*:number] of old; - */ -ipc_type_t * -itVarArrayDecl(u_int number, register const ipc_type_t *old) -{ - register ipc_type_t *it = itResetType(itCopyType(old)); - - if (!it->itInLine || it->itVarArray) - error("IPC type decl is too complicated"); - if (number != 0) - it->itNumber *= number; - else { - /* - * Send at most 2048 bytes inline. - */ - u_int bytes; - - bytes = (it->itNumber * it->itSize + 7) / 8; - it->itNumber = (2048 / bytes) * it->itNumber; - it->itIndefinite = TRUE; - } - it->itVarArray = TRUE; - it->itStruct = FALSE; - it->itString = FALSE; - - itCalculateSizeInfo(it); - return it; -} - -/* - * Handles the declaration - * type new = array[number] of old; - */ -ipc_type_t * -itArrayDecl(u_int number, const ipc_type_t *old) -{ - register ipc_type_t *it = itResetType(itCopyType(old)); - - if (!it->itInLine || it->itVarArray) - error("IPC type decl is too complicated"); - it->itNumber *= number; - it->itStruct = FALSE; - it->itString = FALSE; - - itCalculateSizeInfo(it); - return it; -} - -/* - * Handles the declaration - * type new = ^ old; - */ -ipc_type_t * -itPtrDecl(ipc_type_t *it) -{ - if (!it->itInLine || - (it->itVarArray && !it->itIndefinite && (it->itNumber > 0))) - error("IPC type decl is too complicated"); - it->itNumber = 0; - it->itIndefinite = FALSE; - it->itInLine = FALSE; - it->itStruct = TRUE; - it->itString = FALSE; - - itCalculateSizeInfo(it); - return it; -} - -/* - * Handles the declaration - * type new = struct[number] of old; - */ -ipc_type_t * -itStructDecl(u_int number, const ipc_type_t *old) -{ - register ipc_type_t *it = itResetType(itCopyType(old)); - - if (!it->itInLine || it->itVarArray) - error("IPC type decl is too complicated"); - it->itNumber *= number; - it->itStruct = TRUE; - it->itString = FALSE; - - itCalculateSizeInfo(it); - return it; -} - -/* - * Treat 'c_string[n]' as - * 'array[n] of (MSG_TYPE_STRING_C, 8)' - */ -ipc_type_t * -itCStringDecl(u_int count, boolean_t varying) -{ - register ipc_type_t *it; - register ipc_type_t *itElement; - - itElement = itShortDecl(MACH_MSG_TYPE_STRING_C, - "MACH_MSG_TYPE_STRING_C", - MACH_MSG_TYPE_STRING_C, - "MACH_MSG_TYPE_STRING_C", - 8); - itCheckDecl("char", itElement); - - it = itResetType(itCopyType(itElement)); - it->itNumber = count; - it->itVarArray = varying; - it->itStruct = FALSE; - it->itString = TRUE; - - itCalculateSizeInfo(it); - return it; -} - -ipc_type_t * -itMakeCountType(void) -{ - ipc_type_t *it = itAlloc(); - - it->itName = "mach_msg_type_number_t"; - it->itInName = word_size_name; - it->itInNameStr = word_size_name_string; - it->itOutName = word_size_name; - it->itOutNameStr = word_size_name_string; - it->itSize = word_size_in_bits; - - itCalculateSizeInfo(it); - itCalculateNameInfo(it); - return it; -} - -extern ipc_type_t * -itMakeIntType() -{ - ipc_type_t *it = itAlloc(); - - it->itName = "int"; - it->itInName = MACH_MSG_TYPE_INTEGER_32; - it->itInNameStr = "MACH_MSG_TYPE_INTEGER_32"; - it->itOutName = MACH_MSG_TYPE_INTEGER_32; - it->itOutNameStr = "MACH_MSG_TYPE_INTEGER_32"; - it->itSize = 32; - - itCalculateSizeInfo(it); - itCalculateNameInfo(it); - return it; -} - -ipc_type_t * -itMakePolyType(void) -{ - ipc_type_t *it = itAlloc(); - - it->itName = "mach_msg_type_name_t"; - it->itInName = word_size_name; - it->itInNameStr = word_size_name_string; - it->itOutName = word_size_name; - it->itOutNameStr = word_size_name_string; - it->itSize = word_size_in_bits; - - itCalculateSizeInfo(it); - itCalculateNameInfo(it); - return it; -} - -ipc_type_t * -itMakeDeallocType(void) -{ - ipc_type_t *it = itAlloc(); - - it->itName = "boolean_t"; - it->itInName = MACH_MSG_TYPE_BOOLEAN; - it->itInNameStr = "MACH_MSG_TYPE_BOOLEAN"; - it->itOutName = MACH_MSG_TYPE_BOOLEAN; - it->itOutNameStr = "MACH_MSG_TYPE_BOOLEAN"; - it->itSize = 32; - - itCalculateSizeInfo(it); - itCalculateNameInfo(it); - return it; -} - -/* - * Initializes the pre-defined types. - */ -void -init_type(void) -{ - itRetCodeType = itAlloc(); - itRetCodeType->itName = "kern_return_t"; - itRetCodeType->itInName = MACH_MSG_TYPE_INTEGER_32; - itRetCodeType->itInNameStr = "MACH_MSG_TYPE_INTEGER_32"; - itRetCodeType->itOutName = MACH_MSG_TYPE_INTEGER_32; - itRetCodeType->itOutNameStr = "MACH_MSG_TYPE_INTEGER_32"; - itRetCodeType->itSize = 32; - itCalculateSizeInfo(itRetCodeType); - itCalculateNameInfo(itRetCodeType); - - itDummyType = itAlloc(); - itDummyType->itName = "char *"; - itDummyType->itInName = MACH_MSG_TYPE_UNSTRUCTURED; - itDummyType->itInNameStr = "MACH_MSG_TYPE_UNSTRUCTURED"; - itDummyType->itOutName = MACH_MSG_TYPE_UNSTRUCTURED; - itDummyType->itOutNameStr = "MACH_MSG_TYPE_UNSTRUCTURED"; - itDummyType->itSize = word_size_in_bits; - itCalculateSizeInfo(itDummyType); - itCalculateNameInfo(itDummyType); - - itRequestPortType = itAlloc(); - itRequestPortType->itName = "mach_port_t"; - itRequestPortType->itInName = MACH_MSG_TYPE_COPY_SEND; - itRequestPortType->itInNameStr = "MACH_MSG_TYPE_COPY_SEND"; - itRequestPortType->itOutName = MACH_MSG_TYPE_PORT_SEND; - itRequestPortType->itOutNameStr = "MACH_MSG_TYPE_PORT_SEND"; - itRequestPortType->itSize = word_size_in_bits; - itCalculateSizeInfo(itRequestPortType); - itCalculateNameInfo(itRequestPortType); - - itZeroReplyPortType = itAlloc(); - itZeroReplyPortType->itName = "mach_port_t"; - itZeroReplyPortType->itInName = 0; - itZeroReplyPortType->itInNameStr = "0"; - itZeroReplyPortType->itOutName = 0; - itZeroReplyPortType->itOutNameStr = "0"; - itZeroReplyPortType->itSize = word_size_in_bits; - itCalculateSizeInfo(itZeroReplyPortType); - itCalculateNameInfo(itZeroReplyPortType); - - itRealReplyPortType = itAlloc(); - itRealReplyPortType->itName = "mach_port_t"; - itRealReplyPortType->itInName = MACH_MSG_TYPE_MAKE_SEND_ONCE; - itRealReplyPortType->itInNameStr = "MACH_MSG_TYPE_MAKE_SEND_ONCE"; - itRealReplyPortType->itOutName = MACH_MSG_TYPE_PORT_SEND_ONCE; - itRealReplyPortType->itOutNameStr = "MACH_MSG_TYPE_PORT_SEND_ONCE"; - itRealReplyPortType->itSize = word_size_in_bits; - itCalculateSizeInfo(itRealReplyPortType); - itCalculateNameInfo(itRealReplyPortType); - - itWaitTimeType = itMakeIntType(); - itMsgOptionType = itMakeIntType(); -} - -/****************************************************** - * Make sure return values of functions are assignable. - ******************************************************/ -void -itCheckReturnType(identifier_t name, const ipc_type_t *it) -{ - if (!it->itStruct) - error("type of %s is too complicated", name); - if ((it->itInName == MACH_MSG_TYPE_POLYMORPHIC) || - (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC)) - error("type of %s can't be polymorphic", name); -} - - -/****************************************************** - * Called by routine.c to check that request ports are - * simple and correct ports with send rights. - ******************************************************/ -void -itCheckRequestPortType(identifier_t name, const ipc_type_t *it) -{ - if (((it->itOutName != MACH_MSG_TYPE_PORT_SEND) && - (it->itOutName != MACH_MSG_TYPE_PORT_SEND_ONCE) && - (it->itOutName != MACH_MSG_TYPE_POLYMORPHIC)) || - (it->itNumber != 1) || - (it->itSize != word_size_in_bits) || - !it->itInLine || - it->itDeallocate != d_NO || - !it->itStruct || - it->itVarArray) - error("argument %s isn't a proper request port", name); -} - - -/****************************************************** - * Called by routine.c to check that reply ports are - * simple and correct ports with send rights. - ******************************************************/ -void -itCheckReplyPortType(identifier_t name, const ipc_type_t *it) -{ - if (((it->itOutName != MACH_MSG_TYPE_PORT_SEND) && - (it->itOutName != MACH_MSG_TYPE_PORT_SEND_ONCE) && - (it->itOutName != MACH_MSG_TYPE_POLYMORPHIC) && - (it->itOutName != 0)) || - (it->itNumber != 1) || - (it->itSize != word_size_in_bits) || - !it->itInLine || - it->itDeallocate != d_NO || - !it->itStruct || - it->itVarArray) - error("argument %s isn't a proper reply port", name); -} - - -/****************************************************** - * Used by routine.c to check that WaitTime is a - * simple bit 32 integer. - ******************************************************/ -void -itCheckIntType(identifier_t name, const ipc_type_t *it) -{ - if ((it->itInName != MACH_MSG_TYPE_INTEGER_32) || - (it->itOutName != MACH_MSG_TYPE_INTEGER_32) || - (it->itNumber != 1) || - (it->itSize != 32) || - !it->itInLine || - it->itDeallocate != d_NO || - !it->itStruct || - it->itVarArray) - error("argument %s isn't a proper integer", name); -} -void -itCheckNaturalType(name, it) - identifier_t name; - ipc_type_t *it; -{ - if ((it->itInName != word_size_name) || - (it->itOutName != word_size_name) || - (it->itNumber != 1) || - (it->itSize != word_size_in_bits) || - !it->itInLine || - it->itDeallocate != d_NO || - !it->itStruct || - it->itVarArray) - error("argument %s should have been a %s", name, word_size_name_string); -} diff --git a/mig/type.h b/mig/type.h deleted file mode 100644 index f199059..0000000 --- a/mig/type.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992,1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#ifndef _TYPE_H -#define _TYPE_H - -#include - -#include "boolean.h" -#include "mig_string.h" - -typedef u_int ipc_flags_t; - -#define flNone (0x00) -#define flLong (0x01) /* IsLong specified */ -#define flNotLong (0x02) /* NotIsLong specified */ -#define flDealloc (0x04) /* Dealloc specified */ -#define flNotDealloc (0x08) /* NotDealloc specified */ -#define flMaybeDealloc (0x10) /* Dealloc[] specified */ -#define flServerCopy (0x20) /* ServerCopy specified */ -#define flCountInOut (0x40) /* CountInOut specified */ - -typedef enum dealloc { - d_NO, /* do not deallocate */ - d_YES, /* always deallocate */ - d_MAYBE /* deallocate according to parameter */ -} dealloc_t; - -/* Convert dealloc_t to TRUE/FALSE */ -#define strdealloc(d) (strbool(d == d_YES)) - -/* - * itName and itNext are internal fields (not used for code generation). - * They are only meaningful for types entered into the symbol table. - * The symbol table is a simple self-organizing linked list. - * - * The function itCheckDecl checks & fills in computed information. - * Every type actually used (pointed at by argType) is so processed. - * - * The itInName, itOutName, itSize, itNumber, itInLine, itLongForm, - * and itDeallocate fields correspond directly to mach_msg_type_t fields. - * For out-of-line variable sized types, itNumber is zero. For - * in-line variable sized types, itNumber is the maximum size of the - * array. itInName is the msgt_name value supplied to the kernel, - * and itOutName is the msgt_name value received from the kernel. - * Either or both may be MACH_MSG_TYPE_POLYMORPHIC, indicating a - * "polymorphic" msgt_name. For itInName, this means the user - * supplies the value with an argument. For itOutName, this means the - * the value is returned in an argument. - * - * The itInNameStr and itOutNameStr fields contain "printing" versions - * of the itInName and itOutName values. The mapping from number->string - * is not into (eg, MACH_MSG_TYPE_UNSTRUCTURED/MACH_MSG_TYPE_BOOLEAN/ - * MACH_MSG_TYPE_BIT). These fields are used for code-generation and - * pretty-printing. - * - * itFlags contains the user's requests for itLongForm and itDeallocate - * values. itCheckDecl takes it into account when setting itLongForm - * and itDeallocate, but they can be overridden (with a warning message). - * - * itTypeSize is the calculated size of the C type, in bytes. - * itPadSize is the size of any padded needed after the data field. - * itMinTypeSize is the minimum size of the data field, including padding. - * For variable-length inline data, it is zero. - * - * itUserType, itServerType, itTransType are the C types used in - * code generation. itUserType is the C type passed to the user-side stub - * and used for msg declarations in the user-side stub. itServerType - * is the C type used for msg declarations in the server-side stub. - * itTransType is the C type passed to the server function by the - * server-side stub. Normally it differs from itServerType only when - * translation functions are defined. - * - * itInTrans and itOutTrans are translation functions. itInTrans - * takes itServerType values and returns itTransType values. itOutTrans - * takes itTransType vaulues and returns itServerType values. - * itDestructor is a finalization function applied to In arguments - * after the server-side stub calls the server function. It takes - * itTransType values. Any combination of these may be defined. - * - * The following type specification syntax modifies these values: - * type new = old - * ctype: name // itUserType and itServerType - * cusertype: itUserType - * cservertype: itServerType - * intran: itTransType itInTrans(itServerType) - * outtran: itServerType itOutTrans(itTransType) - * destructor: itDestructor(itTransType); - * - * At most one of itStruct and itString should be TRUE. If both are - * false, then this is assumed to be an array type (msg data is passed - * by reference). If itStruct is TRUE, then msg data is passed by value - * and can be assigned with =. If itString is TRUE, then the msg_data - * is a null-terminated string, assigned with strncpy. The itNumber - * value is a maximum length for the string; the msg field always - * takes up this much space. - * - * itVarArray means this is a variable-sized array. If it is inline, - * then itStruct and itString are FALSE. If it is out-of-line, then - * itStruct is TRUE (because pointers can be assigned). - * - * itIndefinite means this is an indefinite-length array - it may be sent - * either inline or out-of-line. itNumber is assigned so that at most - * 2048 bytes are sent inline. - * - * itElement points to any substructure that the type may have. - * It is only used with variable-sized array types. - */ - -typedef struct ipc_type -{ - identifier_t itName; /* Mig's name for this type */ - struct ipc_type *itNext; /* next type in symbol table */ - - u_int itTypeSize; /* size of the C type */ - u_int itPadSize; /* amount of padding after data */ - u_int itMinTypeSize; /* minimal amount of space occupied by data */ - - u_int itInName; /* name supplied to kernel in sent msg */ - u_int itOutName; /* name in received msg */ - u_int itSize; - u_int itNumber; - boolean_t itInLine; - boolean_t itLongForm; - dealloc_t itDeallocate; - - const_string_t itInNameStr; /* string form of itInName */ - const_string_t itOutNameStr;/* string form of itOutName */ - - /* what the user wants, not necessarily what he gets */ - ipc_flags_t itFlags; - - boolean_t itStruct; - boolean_t itString; - boolean_t itVarArray; - boolean_t itIndefinite; - - struct ipc_type *itElement; /* may be NULL */ - - identifier_t itUserType; - identifier_t itServerType; - identifier_t itTransType; - - identifier_t itInTrans; /* may be NULL */ - identifier_t itOutTrans; /* may be NULL */ - identifier_t itDestructor; /* may be NULL */ -} ipc_type_t; - -#define itNULL ((ipc_type_t *) 0) - -extern ipc_type_t *itLookUp(identifier_t name); -extern void itInsert(identifier_t name, ipc_type_t *it); -extern void itTypeDecl(identifier_t name, ipc_type_t *it); - -extern ipc_type_t *itShortDecl(u_int inname, const_string_t instr, - u_int outname, const_string_t outstr, - u_int defsize); -extern ipc_type_t *itLongDecl(u_int inname, const_string_t instr, - u_int outname, const_string_t outstr, - u_int defsize, u_int size, ipc_flags_t flags); -extern ipc_type_t *itPrevDecl(identifier_t name); -extern ipc_type_t *itResetType(ipc_type_t *it); -extern ipc_type_t *itVarArrayDecl(u_int number, const ipc_type_t *it); -extern ipc_type_t *itArrayDecl(u_int number, const ipc_type_t *it); -extern ipc_type_t *itPtrDecl(ipc_type_t *it); -extern ipc_type_t *itStructDecl(u_int number, const ipc_type_t *it); -extern ipc_type_t *itCStringDecl(u_int number, boolean_t varying); - -extern ipc_type_t *itRetCodeType; -extern ipc_type_t *itDummyType; -extern ipc_type_t *itRequestPortType; -extern ipc_type_t *itZeroReplyPortType; -extern ipc_type_t *itRealReplyPortType; -extern ipc_type_t *itWaitTimeType; -extern ipc_type_t *itMsgOptionType; -extern ipc_type_t *itMakeCountType(void); -extern ipc_type_t *itMakePolyType(void); -extern ipc_type_t *itMakeDeallocType(void); - -extern void init_type(void); - -extern void itCheckReturnType(identifier_t name, const ipc_type_t *it); -extern void itCheckRequestPortType(identifier_t name, const ipc_type_t *it); -extern void itCheckReplyPortType(identifier_t name, const ipc_type_t *it); -extern void itCheckIntType(identifier_t name, const ipc_type_t *it); -extern void itCheckNaturalType(identifier_t name, ipc_type_t *it); - - -extern ipc_flags_t itCheckFlags(ipc_flags_t flags, identifier_t name); -extern dealloc_t itCheckDeallocate(const ipc_type_t *it, ipc_flags_t flags, - dealloc_t dfault, identifier_t name); -extern boolean_t itCheckIsLong(const ipc_type_t *it, ipc_flags_t flags, - boolean_t dfault, identifier_t name); - -#endif /* _TYPE_H */ diff --git a/mig/user.c b/mig/user.c deleted file mode 100644 index a5ca5fb..0000000 --- a/mig/user.c +++ /dev/null @@ -1,1332 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992,1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include - -#include "write.h" -#include "error.h" -#include "utils.h" -#include "global.h" -#include "mig_string.h" -#include "cpu.h" - -/************************************************************* - * Writes the standard includes. The subsystem specific - * includes are in .h and writen by - * header:WriteHeader. Called by WriteProlog. - *************************************************************/ -static void -WriteIncludes(FILE *file) -{ - if (IsKernelServer) - { - /* - * We want to get the user-side definitions of types - * like task_t, ipc_space_t, etc. in mach/mach_types.h. - */ - - fprintf(file, "#undef\tKERNEL\n"); - - if (InternalHeaderFileName != strNULL) - { - register char *cp; - - /* Strip any leading path from InternalHeaderFileName. */ - cp = strrchr(InternalHeaderFileName, '/'); - if (cp == 0) - cp = InternalHeaderFileName; - else - cp++; /* skip '/' */ - fprintf(file, "#include \"%s\"\n", cp); - } - } - - if (UserHeaderFileName != strNULL) - { - register char *cp; - - /* Strip any leading path from UserHeaderFileName. */ - cp = strrchr(UserHeaderFileName, '/'); - if (cp == 0) - cp = UserHeaderFileName; - else - cp++; /* skip '/' */ - fprintf(file, "#include \"%s\"\n", cp); - } - - fprintf(file, "#define EXPORT_BOOLEAN\n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "#include \n"); - fprintf(file, "/* LINTLIBRARY */\n"); - fprintf(file, "\n"); -} - -static void -WriteGlobalDecls(FILE *file) -{ - if (RCSId != strNULL) - WriteRCSDecl(file, strconcat(SubsystemName, "_user"), RCSId); - - fprintf(file, "#define msgh_request_port\tmsgh_remote_port\n"); - fprintf(file, "#define msgh_reply_port\t\tmsgh_local_port\n"); - fprintf(file, "\n"); -} - -/************************************************************* - * Writes the standard #includes, #defines, and - * RCS declaration. Called by WriteUser. - *************************************************************/ -static void -WriteProlog(FILE *file) -{ - WriteIncludes(file); - WriteBogusDefines(file); - WriteGlobalDecls(file); -} - -/*ARGSUSED*/ -static void -WriteEpilog(FILE *file) -{ -} - -static const_string_t -WriteHeaderPortType(const argument_t *arg) -{ - if (arg->argType->itInName == MACH_MSG_TYPE_POLYMORPHIC) - return arg->argPoly->argVarName; - else - return arg->argType->itInNameStr; -} - -static void -WriteRequestHead(FILE *file, const routine_t *rt) -{ - if (rt->rtMaxRequestPos > 0) - fprintf(file, "\tInP = &Mess.In;\n"); - - if (rt->rtSimpleFixedRequest) { - fprintf(file, "\tInP->Head.msgh_bits ="); - if (!rt->rtSimpleSendRequest) - fprintf(file, " MACH_MSGH_BITS_COMPLEX|"); - fprintf(file, "\n"); - fprintf(file, "\t\tMACH_MSGH_BITS(%s, %s);\n", - WriteHeaderPortType(rt->rtRequestPort), - WriteHeaderPortType(rt->rtUReplyPort)); - } else { - fprintf(file, "\tInP->Head.msgh_bits = msgh_simple ?\n"); - fprintf(file, "\t\tMACH_MSGH_BITS(%s, %s) :\n", - WriteHeaderPortType(rt->rtRequestPort), - WriteHeaderPortType(rt->rtUReplyPort)); - fprintf(file, "\t\t(MACH_MSGH_BITS_COMPLEX|\n"); - fprintf(file, "\t\t MACH_MSGH_BITS(%s, %s));\n", - WriteHeaderPortType(rt->rtRequestPort), - WriteHeaderPortType(rt->rtUReplyPort)); - } - - fprintf(file, "\t/* msgh_size passed as argument */\n"); - - /* - * KernelUser stubs need to cast the request and reply ports - * from ipc_port_t to mach_port_t. - */ - - if (IsKernelUser) - fprintf(file, "\tInP->%s = (mach_port_t) %s;\n", - rt->rtRequestPort->argMsgField, - rt->rtRequestPort->argVarName); - else - fprintf(file, "\tInP->%s = %s;\n", - rt->rtRequestPort->argMsgField, - rt->rtRequestPort->argVarName); - - if (akCheck(rt->rtUReplyPort->argKind, akbUserArg)) { - if (IsKernelUser) - fprintf(file, "\tInP->%s = (mach_port_t) %s;\n", - rt->rtUReplyPort->argMsgField, - rt->rtUReplyPort->argVarName); - else - fprintf(file, "\tInP->%s = %s;\n", - rt->rtUReplyPort->argMsgField, - rt->rtUReplyPort->argVarName); - } else if (rt->rtOneWay || IsKernelUser) - fprintf(file, "\tInP->%s = MACH_PORT_NULL;\n", - rt->rtUReplyPort->argMsgField); - else - fprintf(file, "\tInP->%s = %smig_get_reply_port();\n", - rt->rtUReplyPort->argMsgField, SubrPrefix); - - fprintf(file, "\tInP->Head.msgh_seqno = 0;\n"); - fprintf(file, "\tInP->Head.msgh_id = %d;\n", rt->rtNumber + SubsystemBase); -} - -/************************************************************* - * Writes declarations for the message types, variables - * and return variable if needed. Called by WriteRoutine. - *************************************************************/ -static void -WriteVarDecls(FILE *file, const routine_t *rt) -{ - fprintf(file, "\tunion {\n"); - fprintf(file, "\t\tRequest In;\n"); - if (!rt->rtOneWay) - fprintf(file, "\t\tReply Out;\n"); - fprintf(file, "\t} Mess;\n"); - fprintf(file, "\n"); - - fprintf(file, "\tregister Request *InP = &Mess.In;\n"); - if (!rt->rtOneWay) - fprintf(file, "\tregister Reply *OutP = &Mess.Out;\n"); - fprintf(file, "\n"); - - if (!rt->rtOneWay || rt->rtProcedure) - fprintf(file, "\tmach_msg_return_t msg_result;\n"); - - if (!rt->rtSimpleFixedRequest) - fprintf(file, "\tboolean_t msgh_simple = %s;\n", - strbool(rt->rtSimpleSendRequest)); - else if (!rt->rtOneWay && - !(rt->rtSimpleCheckReply && rt->rtSimpleReceiveReply)) { - fprintf(file, "#if\tTypeCheck\n"); - fprintf(file, "\tboolean_t msgh_simple;\n"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - - if (rt->rtNumRequestVar > 0) - fprintf(file, "\tunsigned int msgh_size;\n"); - else if (!rt->rtOneWay && !rt->rtNoReplyArgs) - { - fprintf(file, "#if\tTypeCheck\n"); - fprintf(file, "\tunsigned int msgh_size;\n"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - - /* if either request or reply is variable, we need msgh_size_delta */ - if ((rt->rtMaxRequestPos > 0) || - (rt->rtMaxReplyPos > 0)) - fprintf(file, "\tunsigned int msgh_size_delta;\n"); - - fprintf(file, "\n"); -} - -/************************************************************* - * Writes code to call the user provided error procedure - * when a MIG error occurs. Called by WriteMsgSend, - * WriteMsgCheckReceive, WriteMsgSendReceive, WriteCheckIdentity, - * WriteRetCodeCheck, WriteTypeCheck, WritePackArgValue. - *************************************************************/ -static void -WriteMsgError(FILE *file, const routine_t *rt, const char *error_msg) -{ - if (rt->rtProcedure) - fprintf(file, "\t\t{ %s(%s); return; }\n", rt->rtErrorName, error_msg); - else if (rt->rtReturn != rt->rtRetCode) - { - fprintf(file, "\t\t{ %s(%s); ", rt->rtErrorName, error_msg); - if (rt->rtNumReplyVar > 0) - fprintf(file, "OutP = &Mess.Out; "); - fprintf(file, "return OutP->%s; }\n", rt->rtReturn->argMsgField); - } - else - fprintf(file, "\t\treturn %s;\n", error_msg); -} - -/************************************************************* - * Writes the send call when there is to be no subsequent - * receive. Called by WriteRoutine for SimpleProcedures - * or SimpleRoutines - *************************************************************/ -static void -WriteMsgSend(FILE *file, const routine_t *rt) -{ - const char *MsgResult = (rt->rtProcedure) - ? "msg_result =" - : "return"; - - char SendSize[24]; - - if (rt->rtNumRequestVar == 0) - sprintf(SendSize, "%d", rt->rtRequestSize); - else - strcpy(SendSize, "msgh_size"); - - if (IsKernelUser) - { - fprintf(file, "\t%s %smach_msg_send_from_kernel(", - MsgResult, SubrPrefix); - fprintf(file, "&InP->Head, %s);\n", SendSize); - } - else - { - fprintf(file, "\t%s %smach_msg(&InP->Head, MACH_SEND_MSG|%s, %s, 0,", - MsgResult, - SubrPrefix, - rt->rtMsgOption->argVarName, - SendSize); - fprintf(file, - " MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n" - ); - } - - if (rt->rtProcedure) - { - fprintf(file, "\tif (msg_result != MACH_MSG_SUCCESS)\n"); - WriteMsgError(file, rt, "msg_result"); - } -} - -/************************************************************* - * Writes to code to check for error returns from receive. - * Called by WriteMsgSendReceive and WriteMsgRPC - *************************************************************/ -static void -WriteMsgCheckReceive(FILE *file, const routine_t *rt, const char *success) -{ - fprintf(file, "\tif (msg_result != %s) {\n", success); - if (!akCheck(rt->rtUReplyPort->argKind, akbUserArg) && !IsKernelUser) - { - /* If we aren't using a user-supplied reply port, - then deallocate the reply port on any message transmission - errors. */ - fprintf(file, "\t\t%smig_dealloc_reply_port(%s);\n", - SubrPrefix, "InP->Head.msgh_reply_port"); - } - WriteMsgError(file, rt, "msg_result"); - fprintf(file, "\t}\n"); - - /* - * If not using a user supplied reply port, tell the port - * allocator we're done with the port. - */ - if (!akCheck(rt->rtUReplyPort->argKind, akbUserArg) && !IsKernelUser) - { - fprintf(file, "\t%smig_put_reply_port(InP->Head.msgh_reply_port);\n", - SubrPrefix); - } -} - -/************************************************************* - * Writes the send and receive calls and code to check - * for errors. Normally the rpc code is generated instead - * although, the subsytem can be compiled with the -R option - * which will cause this code to be generated. Called by - * WriteRoutine if UseMsgRPC option is false. - *************************************************************/ -static void -WriteMsgSendReceive(FILE *file, const routine_t *rt) -{ - char SendSize[24]; - - if (rt->rtNumRequestVar == 0) - sprintf(SendSize, "%d", rt->rtRequestSize); - else - strcpy(SendSize, "msgh_size"); - - fprintf(file, "\tmsg_result = %smach_msg(&InP->Head, MACH_SEND_MSG|%s, %s, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n", - SubrPrefix, - rt->rtMsgOption->argVarName, - SendSize); - - fprintf(file, "\tif (msg_result != MACH_MSG_SUCCESS)\n"); - WriteMsgError(file, rt, "msg_result"); - fprintf(file, "\n"); - - fprintf(file, "\tmsg_result = %smach_msg(&OutP->Head, MACH_RCV_MSG|%s%s, 0, sizeof(Reply), InP->Head.msgh_local_port, %s, MACH_PORT_NULL);\n", - SubrPrefix, - rt->rtMsgOption->argVarName, - rt->rtWaitTime != argNULL ? "|MACH_RCV_TIMEOUT" : "", - rt->rtWaitTime != argNULL ? rt->rtWaitTime->argVarName : "MACH_MSG_TIMEOUT_NONE"); - WriteMsgCheckReceive(file, rt, "MACH_MSG_SUCCESS"); - fprintf(file, "\n"); -} - -/************************************************************* - * Writes the rpc call and the code to check for errors. - * This is the default code to be generated. Called by WriteRoutine - * for all routine types except SimpleProcedure and SimpleRoutine. - *************************************************************/ -static void -WriteMsgRPC(FILE *file, const routine_t *rt) -{ - char SendSize[24]; - - if (rt->rtNumRequestVar == 0) - sprintf(SendSize, "%d", rt->rtRequestSize); - else - strcpy(SendSize, "msgh_size"); - - if (IsKernelUser) - fprintf(file, "\tmsg_result = %smach_msg_rpc_from_kernel(&InP->Head, %s, sizeof(Reply));\n", - SubrPrefix, - SendSize); - else - fprintf(file, "\tmsg_result = %smach_msg(&InP->Head, MACH_SEND_MSG|MACH_RCV_MSG|%s%s, %s, sizeof(Reply), InP->Head.msgh_reply_port, %s, MACH_PORT_NULL);\n", - SubrPrefix, - rt->rtMsgOption->argVarName, - rt->rtWaitTime != argNULL ? "|MACH_RCV_TIMEOUT" : "", - SendSize, - rt->rtWaitTime != argNULL? rt->rtWaitTime->argVarName : "MACH_MSG_TIMEOUT_NONE"); - WriteMsgCheckReceive(file, rt, "MACH_MSG_SUCCESS"); - fprintf(file, "\n"); -} - -/************************************************************* - * Sets the correct value of the dealloc flag and calls - * Utils:WritePackMsgType to fill in the ipc msg type word(s) - * in the request message. Called by WriteRoutine for each - * argument that is to be sent in the request message. - *************************************************************/ -static void -WritePackArgType(FILE *file, const argument_t *arg) -{ - WritePackMsgType(file, arg->argType, - arg->argType->itIndefinite ? d_NO : arg->argDeallocate, - arg->argLongForm, TRUE, - "InP->%s", "%s", arg->argTTName); - fprintf(file, "\n"); -} - -/************************************************************* - * Writes code to copy an argument into the request message. - * Called by WriteRoutine for each argument that is to placed - * in the request message. - *************************************************************/ -static void -WritePackArgValue(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - register const char *ref = arg->argByReferenceUser ? "*" : ""; - - if (it->itInLine && it->itVarArray) { - - if (it->itString) { - /* - * Copy variable-size C string with mig_strncpy. - * Save the string length (+ 1 for trailing 0) - * in the argument`s count field. - */ - fprintf(file, - "\tInP->%s = %smig_strncpy(InP->%s, %s, %d);\n", - arg->argCount->argMsgField, - SubrPrefix, - arg->argMsgField, - arg->argVarName, - it->itNumber); - } - else { - - /* - * Copy in variable-size inline array with memcpy, - * after checking that number of elements doesn`t - * exceed declared maximum. - */ - register const argument_t *count = arg->argCount; - register const char *countRef = count->argByReferenceUser ? "*" :""; - register const ipc_type_t *btype = it->itElement; - - /* Note btype->itNumber == count->argMultiplier */ - - fprintf(file, "\tif (%s%s > %d) {\n", - countRef, count->argVarName, - it->itNumber/btype->itNumber); - if (it->itIndefinite) { - fprintf(file, "\t\tInP->%s%s.msgt_inline = FALSE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - if (arg->argDeallocate == d_YES) - fprintf(file, "\t\tInP->%s%s.msgt_deallocate = TRUE;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - else if (arg->argDeallocate == d_MAYBE) - fprintf(file, "\t\tInP->%s%s.msgt_deallocate = %s%s;\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - arg->argDealloc->argByReferenceUser ? "*" : "", - arg->argDealloc->argVarName); - fprintf(file, "\t\t*((%s **)InP->%s) = %s%s;\n", - FetchUserType(btype), - arg->argMsgField, - ref, arg->argVarName); - if (!arg->argRoutine->rtSimpleFixedRequest) - fprintf(file, "\t\tmsgh_simple = FALSE;\n"); - } - else - WriteMsgError(file, arg->argRoutine, "MIG_ARRAY_TOO_LARGE"); - - fprintf(file, "\t}\n\telse {\n"); - - fprintf(file, "\t\tmemcpy(InP->%s, %s%s, ", arg->argMsgField, - ref, arg->argVarName); - if (btype->itTypeSize > 1) - fprintf(file, "%d * ", btype->itTypeSize); - fprintf(file, "%s%s);\n", - countRef, count->argVarName); - fprintf(file, "\t}\n"); - } - } - else if (arg->argMultiplier > 1) - WriteCopyType(file, it, "InP->%s", "/* %s */ %d * %s%s", - arg->argMsgField, arg->argMultiplier, - ref, arg->argVarName); - else - WriteCopyType(file, it, "InP->%s", "/* %s */ %s%s", - arg->argMsgField, ref, arg->argVarName); - fprintf(file, "\n"); -} - -static void -WriteAdjustMsgSimple(FILE *file, register const argument_t *arg) -{ - if (!arg->argRoutine->rtSimpleFixedRequest) - { - register const char *ref = arg->argByReferenceUser ? "*" : ""; - - fprintf(file, "\tif (MACH_MSG_TYPE_PORT_ANY(%s%s))\n", - ref, arg->argVarName); - fprintf(file, "\t\tmsgh_simple = FALSE;\n"); - fprintf(file, "\n"); - } -} - -/* - * Calculate the size of a variable-length message field. - */ -static void -WriteArgSize(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - register int bsize = ptype->itElement->itTypeSize; - register const argument_t *count = arg->argCount; - - if (ptype->itIndefinite) { - /* - * Check descriptor. If out-of-line, use standard size. - */ - fprintf(file, "(InP->%s%s.msgt_inline) ? ", - arg->argTTName, arg->argLongForm ? ".msgtl_header" : ""); - } - if (bsize % 4 != 0) - fprintf(file, "("); - - if (bsize > 1) - fprintf(file, "%d * ", bsize); - - if (ptype->itString) - /* get count from descriptor in message */ - fprintf(file, "InP->%s", count->argMsgField); - else - /* get count from argument */ - fprintf(file, "%s%s", - count->argByReferenceUser ? "*" : "", - count->argVarName); - - /* - * If the base type size is not a multiple of sizeof(int) [4], - * we have to round up. - */ - if (bsize % 4 != 0) - fprintf(file, " + 3) & ~3"); - - if (ptype->itIndefinite) { - fprintf(file, " : sizeof(%s *)", - FetchUserType(ptype->itElement)); - } -} - -/* - * Adjust message size and advance request pointer. - * Called after packing a variable-length argument that - * has more arguments following. - */ -static void -WriteAdjustMsgSize(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - - /* There are more In arguments. We need to adjust msgh_size - and advance InP, so we save the size of the current field - in msgh_size_delta. */ - - fprintf(file, "\tmsgh_size_delta = "); - WriteArgSize(file, arg); - fprintf(file, ";\n"); - - if (arg->argRequestPos == 0) - /* First variable-length argument. The previous msgh_size value - is the minimum request size. */ - - fprintf(file, "\tmsgh_size = %d + msgh_size_delta;\n", - arg->argRoutine->rtRequestSize); - else - fprintf(file, "\tmsgh_size += msgh_size_delta;\n"); - - fprintf(file, - "\tInP = (Request *) ((char *) InP + msgh_size_delta - %d);\n", - ptype->itTypeSize + ptype->itPadSize); -} - -/* - * Calculate the size of the message. Called after the - * last argument has been packed. - */ -static void -WriteFinishMsgSize(FILE *file, register const argument_t *arg) -{ - /* No more In arguments. If this is the only variable In - argument, the previous msgh_size value is the minimum - request size. */ - - if (arg->argRequestPos == 0) { - fprintf(file, "\tmsgh_size = %d + (", - arg->argRoutine->rtRequestSize); - WriteArgSize(file, arg); - fprintf(file, ");\n"); - } - else { - fprintf(file, "\tmsgh_size += "); - WriteArgSize(file, arg); - fprintf(file, ";\n"); - } -} - -static void -WriteInitializeCount(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argCInOut->argParent->argType; - register const ipc_type_t *btype = ptype->itElement; - - fprintf(file, "\tif (%s%s < %d)\n", - arg->argByReferenceUser ? "*" : "", - arg->argVarName, - ptype->itNumber/btype->itNumber); - fprintf(file, "\t\tInP->%s = %s%s;\n", - arg->argMsgField, - arg->argByReferenceUser ? "*" : "", - arg->argVarName); - fprintf(file, "\telse\n"); - fprintf(file, "\t\tInP->%s = %d;\n", - arg->argMsgField, ptype->itNumber/btype->itNumber); - fprintf(file, "\n"); -} - -/* - * Called for every argument. Responsible for packing that - * argument into the request message. - */ -static void -WritePackArg(FILE *file, register const argument_t *arg) -{ - if (akCheck(arg->argKind, akbRequest)) - WritePackArgType(file, arg); - - if ((akIdent(arg->argKind) == akePoly) && - akCheckAll(arg->argKind, akbSendSnd|akbUserArg)) - WriteAdjustMsgSimple(file, arg); - - if ((akIdent(arg->argKind) == akeCountInOut) && - akCheck(arg->argKind, akbSendSnd)) - WriteInitializeCount(file, arg); - else if (akCheckAll(arg->argKind, akbSendSnd|akbSendBody)) - WritePackArgValue(file, arg); -} - -/* - * Generate code to fill in all of the request arguments and their - * message types. - */ -static void -WriteRequestArgs(FILE *file, register const routine_t *rt) -{ - register const argument_t *arg; - register const argument_t *lastVarArg; - - lastVarArg = argNULL; - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) - { - /* - * Adjust message size and advance message pointer if - * the last request argument was variable-length and the - * request position will change. - */ - if (lastVarArg != argNULL && - lastVarArg->argRequestPos < arg->argRequestPos) - { - WriteAdjustMsgSize(file, lastVarArg); - lastVarArg = argNULL; - } - - /* - * Copy the argument - */ - WritePackArg(file, arg); - - /* - * Remember whether this was variable-length. - */ - if (akCheckAll(arg->argKind, akbSendSnd|akbSendBody|akbVariable)) - lastVarArg = arg; - } - - /* - * Finish the message size. - */ - if (lastVarArg != argNULL) - WriteFinishMsgSize(file, lastVarArg); -} - -/************************************************************* - * Writes code to check that the return msgh_id is correct and that - * the size of the return message is correct. Called by - * WriteRoutine. - *************************************************************/ -static void -WriteCheckIdentity(FILE *file, const routine_t *rt) -{ - fprintf(file, "\tif (OutP->Head.msgh_id != %d) {\n", - rt->rtNumber + SubsystemBase + 100); - fprintf(file, "\t\tif (OutP->Head.msgh_id == MACH_NOTIFY_SEND_ONCE)\n"); - WriteMsgError(file, rt, "MIG_SERVER_DIED"); - fprintf(file, "\t\telse {\n"); - fprintf(file, "\t\t\t%smig_dealloc_reply_port(%s);\n\t", - SubrPrefix,"InP->Head.msgh_reply_port"); - WriteMsgError(file, rt, "MIG_REPLY_MISMATCH"); - fprintf(file, "\t\t}\n\t}\n"); - fprintf(file, "\n"); - fprintf(file, "#if\tTypeCheck\n"); - - if (rt->rtSimpleCheckReply && rt->rtSimpleReceiveReply) - { - /* Expecting a simple message. We can factor out the check for - a simple message, since the error reply message is also simple. - */ - - if (!rt->rtNoReplyArgs) - fprintf(file, "\tmsgh_size = OutP->Head.msgh_size;\n\n"); - - fprintf(file, - "\tif ((OutP->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||\n"); - if (rt->rtNoReplyArgs) - fprintf(file, "\t (OutP->Head.msgh_size != %d))\n", - rt->rtReplySize); - else { - fprintf(file, "\t ((msgh_size %s %d) &&\n", - (rt->rtNumReplyVar > 0) ? "<" : "!=", - rt->rtReplySize); - fprintf(file, "\t ((msgh_size != sizeof(mig_reply_header_t)) ||\n"); - fprintf(file, "\t (OutP->RetCode == KERN_SUCCESS))))\n"); - } - } - else { - /* Expecting a complex message, or may vary at run time. */ - - fprintf(file, "\tmsgh_size = OutP->Head.msgh_size;\n"); - fprintf(file, "\tmsgh_simple = !(OutP->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX);\n"); - fprintf(file, "\n"); - - fprintf(file, "\tif (((msgh_size %s %d)", - (rt->rtNumReplyVar > 0) ? "<" : "!=", - rt->rtReplySize); - - if (rt->rtSimpleCheckReply) - /* if rtSimpleReceiveReply was true, then we would have - executed the code above. So we know that the message - is complex. */ - fprintf(file, " || msgh_simple"); - fprintf(file, ") &&\n"); - - fprintf(file, "\t ((msgh_size != sizeof(mig_reply_header_t)) ||\n"); - fprintf(file, "\t !msgh_simple ||\n"); - fprintf(file, "\t (OutP->RetCode == KERN_SUCCESS)))\n"); - } - WriteMsgError(file, rt, "MIG_TYPE_ERROR"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - fprintf(file, "\n"); -} - -/************************************************************* - * Write code to generate error handling code if the RetCode - * argument of a Routine is not KERN_SUCCESS. - *************************************************************/ -static void -WriteRetCodeCheck(FILE *file, const routine_t *rt) -{ - fprintf(file, "\tif (OutP->RetCode != KERN_SUCCESS)\n"); - WriteMsgError(file, rt, "OutP->RetCode"); - fprintf(file, "\n"); -} - -/************************************************************* - * Writes code to check that the type of each of the arguments - * in the reply message is what is expected. Called by - * WriteRoutine for each argument in the reply message. - *************************************************************/ -static void -WriteTypeCheck(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - register const routine_t *rt = arg->argRoutine; - - fprintf(file, "#if\tTypeCheck\n"); - if (akCheck(arg->argKind, akbReplyQC)) - { - fprintf(file, "\tif (* (int *) &OutP->%s != * (int *) &%sCheck)\n", - arg->argTTName, arg->argVarName); - } - else - { - fprintf(file, "\tif ("); - if (!it->itIndefinite) { - fprintf(file, "(OutP->%s%s.msgt_inline != %s) ||\n\t ", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - strbool(it->itInLine)); - } - fprintf(file, "(OutP->%s%s.msgt_longform != %s) ||\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : "", - strbool(arg->argLongForm)); - if (it->itOutName == MACH_MSG_TYPE_POLYMORPHIC) - { - if (!rt->rtSimpleCheckReply) - fprintf(file, "\t (MACH_MSG_TYPE_PORT_ANY(OutP->%s.msgt%s_name) && msgh_simple) ||\n", - arg->argTTName, - arg->argLongForm ? "l" : ""); - } - else - fprintf(file, "\t (OutP->%s.msgt%s_name != %s) ||\n", - arg->argTTName, - arg->argLongForm ? "l" : "", - it->itOutNameStr); - if (!it->itVarArray) - fprintf(file, "\t (OutP->%s.msgt%s_number != %d) ||\n", - arg->argTTName, - arg->argLongForm ? "l" : "", - it->itNumber); - fprintf(file, "\t (OutP->%s.msgt%s_size != %d))\n", - arg->argTTName, - arg->argLongForm ? "l" : "", - it->itSize); - } - WriteMsgError(file, rt, "MIG_TYPE_ERROR"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - fprintf(file, "\n"); -} - -static void -WriteCheckArgSize(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - register const ipc_type_t *btype = ptype->itElement; - const argument_t *count = arg->argCount; - int multiplier = btype->itTypeSize / btype->itNumber; - - if (ptype->itIndefinite) { - /* - * Check descriptor. If out-of-line, use standard size. - */ - fprintf(file, "(OutP->%s%s.msgt_inline) ? ", - arg->argTTName, arg->argLongForm ? ".msgtl_header" : ""); - } - - if (btype->itTypeSize % 4 != 0) - fprintf(file, "("); - - if (multiplier > 1) - fprintf(file, "%d * ", multiplier); - - fprintf(file, "OutP->%s", count->argMsgField); - - /* If the base type size of the data field isn`t a multiple of 4, - we have to round up. */ - if (btype->itTypeSize % 4 != 0) - fprintf(file, " + 3) & ~3"); - - if (ptype->itIndefinite) - fprintf(file, " : sizeof(%s *)", FetchUserType(btype)); -} - -static void -WriteCheckMsgSize(FILE *file, register const argument_t *arg) -{ - register const routine_t *rt = arg->argRoutine; - - /* If there aren't any more Out args after this, then - we can use the msgh_size_delta value directly in - the TypeCheck conditional. */ - - if (arg->argReplyPos == rt->rtMaxReplyPos) - { - fprintf(file, "#if\tTypeCheck\n"); - fprintf(file, "\tif (msgh_size != %d + (", - rt->rtReplySize); - WriteCheckArgSize(file, arg); - fprintf(file, "))\n"); - - WriteMsgError(file, rt, "MIG_TYPE_ERROR"); - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - else - { - /* If there aren't any more variable-sized arguments after this, - then we must check for exact msg-size and we don't need - to update msgh_size. */ - - boolean_t LastVarArg = arg->argReplyPos+1 == rt->rtNumReplyVar; - - /* calculate the actual size in bytes of the data field. note - that this quantity must be a multiple of four. hence, if - the base type size isn't a multiple of four, we have to - round up. note also that btype->itNumber must - divide btype->itTypeSize (see itCalculateSizeInfo). */ - - fprintf(file, "\tmsgh_size_delta = "); - WriteCheckArgSize(file, arg); - fprintf(file, ";\n"); - fprintf(file, "#if\tTypeCheck\n"); - - /* Don't decrement msgh_size until we've checked that - it won't underflow. */ - - if (LastVarArg) - fprintf(file, "\tif (msgh_size != %d + msgh_size_delta)\n", - rt->rtReplySize); - else - fprintf(file, "\tif (msgh_size < %d + msgh_size_delta)\n", - rt->rtReplySize); - WriteMsgError(file, rt, "MIG_TYPE_ERROR"); - - if (!LastVarArg) - fprintf(file, "\tmsgh_size -= msgh_size_delta;\n"); - - fprintf(file, "#endif\t/* TypeCheck */\n"); - } - fprintf(file, "\n"); -} - -/************************************************************* - * Write code to copy an argument from the reply message - * to the parameter. Called by WriteRoutine for each argument - * in the reply message. - *************************************************************/ -static void -WriteExtractArgValue(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *argType = arg->argType; - register const char *ref = arg->argByReferenceUser ? "*" : ""; - - if (argType->itInLine && argType->itVarArray) { - - if (argType->itString) { - /* - * Copy out variable-size C string with mig_strncpy. - */ - fprintf(file, "\t(void) %smig_strncpy(%s%s, OutP->%s, %d);\n", - SubrPrefix, - ref, - arg->argVarName, - arg->argMsgField, - argType->itNumber); - } - else if (argType->itIndefinite) { - /* - * If data was returned out-of-line, - * change user`s pointer to point to it. - * If data was returned in-line but doesn`t fit, - * allocate a new buffer, copy the data to it, - * and change user`s pointer to point to it. - * If data was returned in-line and fits, - * copy to buffer. - */ - const argument_t *count = arg->argCount; - const char *countRef = count->argByReferenceUser ? "*" : ""; - const ipc_type_t *btype = argType->itElement; - - fprintf(file, "\tif (!OutP->%s%s.msgt_inline)\n", - arg->argTTName, - arg->argLongForm ? ".msgtl_header" : ""); - fprintf(file, "\t %s%s = *((%s **)OutP->%s);\n", - ref, arg->argVarName, - FetchUserType(btype), arg->argMsgField); - fprintf(file, "\telse if (OutP->%s", count->argMsgField); - if (btype->itNumber > 1) - fprintf(file, " / %d", btype->itNumber); - fprintf(file, " > %s%s) {\n", countRef, count->argVarName); - fprintf(file, "\t %smig_allocate((vm_offset_t *)%s,\n\t\t", - SubrPrefix, arg->argVarName); /* no ref! */ - if (btype->itTypeSize != btype->itNumber) - fprintf(file, "%d * ", btype->itTypeSize/btype->itNumber); - fprintf(file, "OutP->%s);\n", count->argMsgField); - fprintf(file, "\t memcpy(%s%s, OutP->%s, ", ref, arg->argVarName, - arg->argMsgField); - if (btype->itTypeSize != btype->itNumber) - fprintf(file, "%d * ", btype->itTypeSize/btype->itNumber); - fprintf(file, "OutP->%s);\n", count->argMsgField); - fprintf(file, "\t}\n"); - fprintf(file, "\telse {\n"); - - fprintf(file, "\t memcpy(%s%s, OutP->%s, ", ref, arg->argVarName, - arg->argMsgField); - if (btype->itTypeSize != btype->itNumber) - fprintf(file, "%d * ", btype->itTypeSize/btype->itNumber); - fprintf(file, "OutP->%s);\n", count->argMsgField); - fprintf(file, "\t}\n"); - } - else { - - /* - * Copy out variable-size inline array with memcpy, - * after checking that number of elements doesn`t - * exceed user`s maximum. - */ - register const argument_t *count = arg->argCount; - register const char *countRef = count->argByReferenceUser ? "*" :""; - register const ipc_type_t *btype = argType->itElement; - - /* Note count->argMultiplier == btype->itNumber */ - - fprintf(file, "\tif (OutP->%s", count->argMsgField); - if (btype->itNumber > 1) - fprintf(file, " / %d", btype->itNumber); - fprintf(file, " > %s%s) {\n", - countRef, count->argVarName); - - /* - * If number of elements is too many for user receiving area, - * fill user`s area as much as possible. Return the correct - * number of elements. - */ - fprintf(file, "\t\tmemcpy(%s%s, OutP->%s, ", ref, arg->argVarName, - arg->argMsgField); - if (btype->itTypeSize > 1) - fprintf(file, "%d * ", btype->itTypeSize); - fprintf(file, "%s%s);\n", - countRef, count->argVarName); - - fprintf(file, "\t\t%s%s = OutP->%s", - countRef, count->argVarName, count->argMsgField); - if (btype->itNumber > 1) - fprintf(file, " / %d", btype->itNumber); - fprintf(file, ";\n"); - WriteMsgError(file,arg->argRoutine, "MIG_ARRAY_TOO_LARGE"); - - fprintf(file, "\t}\n\telse {\n"); - - fprintf(file, "\t\tmemcpy(%s%s, OutP->%s, ", ref, arg->argVarName, - arg->argMsgField); - if (btype->itTypeSize != btype->itNumber) - fprintf(file, "%d * ", btype->itTypeSize/btype->itNumber); - fprintf(file, "OutP->%s);\n", count->argMsgField); - fprintf(file, "\t}\n"); - } - } - else if (arg->argMultiplier > 1) - WriteCopyType(file, argType, - "%s%s", "/* %s%s */ OutP->%s / %d", - ref, arg->argVarName, arg->argMsgField, - arg->argMultiplier); - else - WriteCopyType(file, argType, - "%s%s", "/* %s%s */ OutP->%s", - ref, arg->argVarName, arg->argMsgField); - fprintf(file, "\n"); -} - -static void -WriteExtractArg(FILE *file, register const argument_t *arg) -{ - register const routine_t *rt = arg->argRoutine; - - if (akCheck(arg->argKind, akbReply)) - WriteTypeCheck(file, arg); - - if (akCheckAll(arg->argKind, akbVariable|akbReply)) - WriteCheckMsgSize(file, arg); - - /* Now that the RetCode is type-checked, check its value. - Must abort immediately if it isn't KERN_SUCCESS, because - in that case the reply message is truncated. */ - - if (arg == rt->rtRetCode) - WriteRetCodeCheck(file, rt); - - if (akCheckAll(arg->argKind, akbReturnRcv)) - WriteExtractArgValue(file, arg); -} - -static void -WriteAdjustReplyMsgPtr(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *ptype = arg->argType; - - fprintf(file, - "\tOutP = (Reply *) ((char *) OutP + msgh_size_delta - %d);\n\n", - ptype->itTypeSize + ptype->itPadSize); -} - -static void -WriteReplyArgs(FILE *file, register const routine_t *rt) -{ - register const argument_t *arg; - register const argument_t *lastVarArg; - - lastVarArg = argNULL; - for (arg = rt->rtArgs; arg != argNULL; arg = arg->argNext) { - - /* - * Advance message pointer if the last reply argument was - * variable-length and the reply position will change. - */ - if (lastVarArg != argNULL && - lastVarArg->argReplyPos < arg->argReplyPos) - { - WriteAdjustReplyMsgPtr(file, lastVarArg); - lastVarArg = argNULL; - } - - /* - * Copy the argument - */ - WriteExtractArg(file, arg); - - /* - * Remember whether this was variable-length. - */ - if (akCheckAll(arg->argKind, akbReturnRcv|akbVariable)) - lastVarArg = arg; - } -} - -/************************************************************* - * Writes code to return the return value. Called by WriteRoutine - * for routines and functions. - *************************************************************/ -static void -WriteReturnValue(FILE *file, const routine_t *rt) -{ - if (rt->rtReturn == rt->rtRetCode) - /* If returning RetCode, we have already checked that it is - KERN_SUCCESS */ - fprintf(file, "\treturn KERN_SUCCESS;\n"); - - else - { - if (rt->rtNumReplyVar > 0) - fprintf(file, "\tOutP = &Mess.Out;\n"); - - fprintf(file, "\treturn OutP->%s;\n", rt->rtReturn->argMsgField); - } -} - -/************************************************************* - * Writes the elements of the message type declaration: the - * msg_type structure, the argument itself and any padding - * that is required to make the argument a multiple of 4 bytes. - * Called by WriteRoutine for all the arguments in the request - * message first and then the reply message. - *************************************************************/ -static void -WriteFieldDecl(FILE *file, const argument_t *arg) -{ - WriteFieldDeclPrim(file, arg, FetchUserType); -} - -static void -WriteStubDecl(FILE *file, register const routine_t *rt) -{ - fprintf(file, "\n"); - fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName); - fprintf(file, "mig_external %s %s\n", ReturnTypeStr(rt), rt->rtUserName); - fprintf(file, "(\n"); - WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ",\n", "\n"); - fprintf(file, ")\n"); - fprintf(file, "{\n"); -} - -/************************************************************* - * Writes all the code comprising a routine body. Called by - * WriteUser for each routine. - *************************************************************/ -static void -WriteRoutine(FILE *file, register const routine_t *rt) -{ - /* write the stub's declaration */ - - WriteStubDecl(file, rt); - - /* typedef of structure for Request and Reply messages */ - - WriteStructDecl(file, rt->rtArgs, WriteFieldDecl, akbRequest, "Request"); - if (!rt->rtOneWay) - WriteStructDecl(file, rt->rtArgs, WriteFieldDecl, akbReply, "Reply"); - - /* declarations for local vars: Union of Request and Reply messages, - InP, OutP and return value */ - - WriteVarDecls(file, rt); - - /* declarations and initializations of the mach_msg_type_t variables - for each argument */ - - WriteList(file, rt->rtArgs, WriteTypeDeclIn, akbRequest, "\n", "\n"); - if (!rt->rtOneWay) - WriteList(file, rt->rtArgs, WriteCheckDecl, akbReplyQC, "\n", "\n"); - - /* fill in all the request message types and then arguments */ - - WriteRequestArgs(file, rt); - - /* fill in request message head */ - - WriteRequestHead(file, rt); - fprintf(file, "\n"); - - /* Write the send/receive or rpc call */ - - if (rt->rtOneWay) - WriteMsgSend(file, rt); - else - { - if (UseMsgRPC) - WriteMsgRPC(file, rt); - else - WriteMsgSendReceive(file, rt); - - /* Check the values that are returned in the reply message */ - - WriteCheckIdentity(file, rt); - - /* If the reply message has no Out parameters or return values - other than the return code, we can type-check it and - return it directly. */ - - if (rt->rtNoReplyArgs) - { - WriteTypeCheck(file, rt->rtRetCode); - - fprintf(file, "\treturn OutP->RetCode;\n"); - } - else { - WriteReplyArgs(file, rt); - - /* return the return value, if any */ - - if (rt->rtProcedure) - fprintf(file, "\t/* Procedure - no return needed */\n"); - else - WriteReturnValue(file, rt); - } - } - - fprintf(file, "}\n"); -} - -/************************************************************* - * Writes out the xxxUser.c file. Called by mig.c - *************************************************************/ -void -WriteUser(FILE *file, const statement_t *stats) -{ - register const statement_t *stat; - - WriteProlog(file); - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - WriteRoutine(file, stat->stRoutine); - break; - case skImport: - case skUImport: - WriteImport(file, stat->stFileName); - break; - case skSImport: - break; - default: - fatal("WriteUser(): bad statement_kind_t (%d)", - (int) stat->stKind); - } - WriteEpilog(file); -} - -/************************************************************* - * Writes out individual .c user files for each routine. Called by mig.c - *************************************************************/ -void -WriteUserIndividual(const statement_t *stats) -{ - register const statement_t *stat; - - for (stat = stats; stat != stNULL; stat = stat->stNext) - switch (stat->stKind) - { - case skRoutine: - { - FILE *file; - register char *filename; - - filename = strconcat(UserFilePrefix, - strconcat(stat->stRoutine->rtName, ".c")); - file = fopen(filename, "w"); - if (file == NULL) - fatal("fopen(%s): %s", filename, - unix_error_string(errno)); - WriteProlog(file); - - { - /* Write all the imports. */ - const statement_t *s; - for (s = stats; s != stNULL; s = s->stNext) - switch (s->stKind) - { - case skImport: - case skUImport: - WriteImport(file, s->stFileName); - break; - } - } - - WriteRoutine(file, stat->stRoutine); - WriteEpilog(file); - fclose(file); - strfree(filename); - } - break; - case skImport: - case skUImport: - break; - case skSImport: - break; - default: - fatal("WriteUserIndividual(): bad statement_kind_t (%d)", - (int) stat->stKind); - } -} diff --git a/mig/utils.c b/mig/utils.c deleted file mode 100644 index f716e01..0000000 --- a/mig/utils.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#include - -#include "write.h" -#include "utils.h" -#include "global.h" - -void -WriteImport(FILE *file, const_string_t filename) -{ - fprintf(file, "#include %s\n", filename); -} - -void -WriteRCSDecl(FILE *file, identifier_t name, const_string_t rcs) -{ - fprintf(file, "#ifndef\tlint\n"); - fprintf(file, "#if\tUseExternRCSId\n"); - fprintf(file, "char %s_rcsid[] = %s;\n", name, rcs); - fprintf(file, "#else\t/* UseExternRCSId */\n"); - fprintf(file, "static char rcsid[] = %s;\n", rcs); - fprintf(file, "#endif\t/* UseExternRCSId */\n"); - fprintf(file, "#endif\t/* lint */\n"); - fprintf(file, "\n"); -} - -void -WriteBogusDefines(FILE *file) -{ - fprintf(file, "#ifndef\tmig_internal\n"); - fprintf(file, "#define\tmig_internal\tstatic\n"); - fprintf(file, "#endif\n"); - fprintf(file, "\n"); - - fprintf(file, "#ifndef\tmig_external\n"); - fprintf(file, "#define mig_external\n"); - fprintf(file, "#endif\n"); - fprintf(file, "\n"); - - fprintf(file, "#ifndef\tTypeCheck\n"); - fprintf(file, "#define\tTypeCheck 1\n"); - fprintf(file, "#endif\n"); - fprintf(file, "\n"); - - fprintf(file, "#ifndef\tUseExternRCSId\n"); - fprintf(file, "#define\tUseExternRCSId\t\t1\n"); - fprintf(file, "#endif\n"); - fprintf(file, "\n"); -} - -void -WriteList(FILE *file, const argument_t *args, write_list_fn_t *func, u_int mask, - const char *between, const char *after) -{ - register const argument_t *arg; - register boolean_t sawone = FALSE; - - for (arg = args; arg != argNULL; arg = arg->argNext) - if (akCheckAll(arg->argKind, mask)) - { - if (sawone) - fprintf(file, "%s", between); - sawone = TRUE; - - (*func)(file, arg); - } - - if (sawone) - fprintf(file, "%s", after); -} - -static boolean_t -WriteReverseListPrim(FILE *file, register const argument_t *arg, - write_list_fn_t *func, u_int mask, const char *between) -{ - boolean_t sawone = FALSE; - - if (arg != argNULL) - { - sawone = WriteReverseListPrim(file, arg->argNext, func, mask, between); - - if (akCheckAll(arg->argKind, mask)) - { - if (sawone) - fprintf(file, "%s", between); - sawone = TRUE; - - (*func)(file, arg); - } - } - - return sawone; -} - -void -WriteReverseList(FILE *file, const argument_t *args, write_list_fn_t *func, - u_int mask, const char *between, const char *after) -{ - boolean_t sawone; - - sawone = WriteReverseListPrim(file, args, func, mask, between); - - if (sawone) - fprintf(file, "%s", after); -} - -void -WriteNameDecl(FILE *file, const argument_t *arg) -{ - fprintf(file, "%s", arg->argVarName); -} - -void -WriteUserVarDecl(FILE *file, const argument_t *arg) -{ - const char *ref = arg->argByReferenceUser ? "*" : ""; - - fprintf(file, "\t%s %s%s", arg->argType->itUserType, ref, arg->argVarName); -} - -void -WriteServerVarDecl(FILE *file, const argument_t *arg) -{ - const char *ref = arg->argByReferenceServer ? "*" : ""; - - fprintf(file, "\t%s %s%s", - arg->argType->itTransType, ref, arg->argVarName); -} - -void -WriteTypeDeclIn(FILE *file, register const argument_t *arg) -{ - WriteStaticDecl(file, arg->argType, - arg->argType->itIndefinite ? d_NO : arg->argDeallocate, - arg->argLongForm, TRUE, arg->argTTName); -} - -void -WriteTypeDeclOut(FILE *file, register const argument_t *arg) -{ - WriteStaticDecl(file, arg->argType, - arg->argType->itIndefinite ? d_NO : arg->argDeallocate, - arg->argLongForm, FALSE, arg->argTTName); -} - -void -WriteCheckDecl(FILE *file, register const argument_t *arg) -{ - register const ipc_type_t *it = arg->argType; - - /* We'll only be called for short-form types. - Note we use itOutNameStr instead of itInNameStr, because - this declaration will be used to check received types. */ - - fprintf(file, "\tstatic const mach_msg_type_t %sCheck = {\n", - arg->argVarName); - fprintf(file, "\t\t/* msgt_name = */\t\t%s,\n", it->itOutNameStr); - fprintf(file, "\t\t/* msgt_size = */\t\t%d,\n", it->itSize); - fprintf(file, "\t\t/* msgt_number = */\t\t%d,\n", it->itNumber); - fprintf(file, "\t\t/* msgt_inline = */\t\t%s,\n", - strbool(it->itInLine)); - fprintf(file, "\t\t/* msgt_longform = */\t\tFALSE,\n"); - fprintf(file, "\t\t/* msgt_deallocate = */\t\t%s,\n", - strbool(!it->itInLine)); - fprintf(file, "\t\t/* msgt_unused = */\t\t0\n"); - fprintf(file, "\t};\n"); -} - -const char * -ReturnTypeStr(const routine_t *rt) -{ - if (rt->rtReturn == argNULL) - return "void"; - else - return rt->rtReturn->argType->itUserType; -} - -const char * -FetchUserType(const ipc_type_t *it) -{ - return it->itUserType; -} - -const char * -FetchServerType(const ipc_type_t *it) -{ - return it->itServerType; -} - -void -WriteFieldDeclPrim(FILE *file, const argument_t *arg, - const char *(*tfunc)(const ipc_type_t *)) -{ - register const ipc_type_t *it = arg->argType; - - fprintf(file, "\t\tmach_msg_type_%st %s;\n", - arg->argLongForm ? "long_" : "", arg->argTTName); - - if (it->itInLine && it->itVarArray) - { - register ipc_type_t *btype = it->itElement; - - /* - * Build our own declaration for a varying array: - * use the element type and maximum size specified. - * Note arg->argCount->argMultiplier == btype->itNumber. - */ - fprintf(file, "\t\t%s %s[%d];", - (*tfunc)(btype), - arg->argMsgField, - it->itNumber/btype->itNumber); - } - else - fprintf(file, "\t\t%s %s;", (*tfunc)(it), arg->argMsgField); - - if (it->itPadSize != 0) - fprintf(file, "\n\t\tchar %s[%d];", arg->argPadName, it->itPadSize); -} - -void -WriteStructDecl(FILE *file, const argument_t *args, write_list_fn_t *func, - u_int mask, const char *name) -{ - fprintf(file, "\ttypedef struct {\n"); - fprintf(file, "\t\tmach_msg_header_t Head;\n"); - WriteList(file, args, func, mask, "\n", "\n"); - fprintf(file, "\t} %s;\n", name); - fprintf(file, "\n"); -} - -static void -WriteStaticLongDecl(FILE *file, register const ipc_type_t *it, - dealloc_t dealloc, boolean_t inname, identifier_t name) -{ - fprintf(file, "\tstatic const mach_msg_type_long_t %s = {\n", name); - fprintf(file, "\t{\n"); - fprintf(file, "\t\t/* msgt_name = */\t\t0,\n"); - fprintf(file, "\t\t/* msgt_size = */\t\t0,\n"); - fprintf(file, "\t\t/* msgt_number = */\t\t0,\n"); - fprintf(file, "\t\t/* msgt_inline = */\t\t%s,\n", - strbool(it->itInLine)); - fprintf(file, "\t\t/* msgt_longform = */\t\tTRUE,\n"); - fprintf(file, "\t\t/* msgt_deallocate = */\t\t%s,\n", - strdealloc(dealloc)); - fprintf(file, "\t\t/* msgt_unused = */\t\t0\n"); - fprintf(file, "\t},\n"); - fprintf(file, "\t\t/* msgtl_name = */\t%s,\n", - inname ? it->itInNameStr : it->itOutNameStr); - fprintf(file, "\t\t/* msgtl_size = */\t%d,\n", it->itSize); - fprintf(file, "\t\t/* msgtl_number = */\t%d,\n", it->itNumber); - fprintf(file, "\t};\n"); -} - -static void -WriteStaticShortDecl(FILE *file, register const ipc_type_t *it, - dealloc_t dealloc, boolean_t inname, identifier_t name) -{ - fprintf(file, "\tstatic const mach_msg_type_t %s = {\n", name); - fprintf(file, "\t\t/* msgt_name = */\t\t%s,\n", - inname ? it->itInNameStr : it->itOutNameStr); - fprintf(file, "\t\t/* msgt_size = */\t\t%d,\n", it->itSize); - fprintf(file, "\t\t/* msgt_number = */\t\t%d,\n", it->itNumber); - fprintf(file, "\t\t/* msgt_inline = */\t\t%s,\n", - strbool(it->itInLine)); - fprintf(file, "\t\t/* msgt_longform = */\t\tFALSE,\n"); - fprintf(file, "\t\t/* msgt_deallocate = */\t\t%s,\n", - strdealloc(dealloc)); - fprintf(file, "\t\t/* msgt_unused = */\t\t0\n"); - fprintf(file, "\t};\n"); -} - -void -WriteStaticDecl(FILE *file, const ipc_type_t *it, dealloc_t dealloc, - boolean_t longform, boolean_t inname, identifier_t name) -{ - if (longform) - WriteStaticLongDecl(file, it, dealloc, inname, name); - else - WriteStaticShortDecl(file, it, dealloc, inname, name); -} - -/* - * Like vfprintf, but omits a leading comment in the format string - * and skips the items that would be printed by it. Only %s, %d, - * and %f are recognized. - */ -static void -SkipVFPrintf(FILE *file, register const char *fmt, va_list pvar) -{ - if (*fmt == 0) - return; /* degenerate case */ - - if (fmt[0] == '/' && fmt[1] == '*') { - /* Format string begins with C comment. Scan format - string until end-comment delimiter, skipping the - items in pvar that the enclosed format items would - print. */ - - register int c; - - fmt += 2; - for (;;) { - c = *fmt++; - if (c == 0) - return; /* nothing to format */ - if (c == '*') { - if (*fmt == '/') { - break; - } - } - else if (c == '%') { - /* Field to skip */ - c = *fmt++; - switch (c) { - case 's': - (void) va_arg(pvar, char *); - break; - case 'd': - (void) va_arg(pvar, int); - break; - case 'f': - (void) va_arg(pvar, double); - break; - case '\0': - return; /* error - fmt ends with '%' */ - default: - break; - } - } - } - /* End of comment. To be pretty, skip - the space that follows. */ - fmt++; - if (*fmt == ' ') - fmt++; - } - - /* Now format the string. */ - (void) vfprintf(file, fmt, pvar); -} - -void -WriteCopyType(FILE *file, const ipc_type_t *it, const char *left, - const char *right, ...) -{ - va_list pvar; - va_start(pvar, right); - - if (it->itStruct) - { - fprintf(file, "\t"); - SkipVFPrintf(file, left, pvar); - fprintf(file, " = "); - SkipVFPrintf(file, right, pvar); - fprintf(file, ";\n"); - } - else if (it->itString) - { - fprintf(file, "\t(void) %smig_strncpy(", SubrPrefix); - SkipVFPrintf(file, left, pvar); - fprintf(file, ", "); - SkipVFPrintf(file, right, pvar); - fprintf(file, ", %d);\n", it->itTypeSize); - } - else - { - fprintf(file, "\t{ typedef struct { char data[%d]; } *sp; * (sp) ", - it->itTypeSize); - SkipVFPrintf(file, left, pvar); - fprintf(file, " = * (sp) "); - SkipVFPrintf(file, right, pvar); - fprintf(file, "; }\n"); - } - va_end(pvar); -} - -void -WritePackMsgType(FILE *file, const ipc_type_t *it, dealloc_t dealloc, - boolean_t longform, boolean_t inname, const char *left, - const char *right, ...) -{ - va_list pvar; - va_start(pvar, right); - - fprintf(file, "\t"); - SkipVFPrintf(file, left, pvar); - fprintf(file, " = "); - SkipVFPrintf(file, right, pvar); - fprintf(file, ";\n"); - - va_end(pvar); -} diff --git a/mig/utils.h b/mig/utils.h deleted file mode 100644 index 3a4c832..0000000 --- a/mig/utils.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _UTILS_H -#define _UTILS_H - -/* stuff used by more than one of header.c, user.c, server.c */ - -typedef void write_list_fn_t(FILE *file, const argument_t *arg); - -extern void WriteImport(FILE *file, const_string_t filename); -extern void WriteRCSDecl(FILE *file, identifier_t name, const_string_t rcs); -extern void WriteBogusDefines(FILE *file); - -extern void WriteList(FILE *file, const argument_t *args, write_list_fn_t *func, - u_int mask, const char *between, const char *after); - -extern void WriteReverseList(FILE *file, const argument_t *args, - write_list_fn_t *func, u_int mask, - const char *between, const char *after); - -/* good as arguments to WriteList */ -extern write_list_fn_t WriteNameDecl; -extern write_list_fn_t WriteUserVarDecl; -extern write_list_fn_t WriteServerVarDecl; -extern write_list_fn_t WriteTypeDeclIn; -extern write_list_fn_t WriteTypeDeclOut; -extern write_list_fn_t WriteCheckDecl; - -extern const char *ReturnTypeStr(const routine_t *rt); - -extern const char *FetchUserType(const ipc_type_t *it); -extern const char *FetchServerType(const ipc_type_t *it); -extern void WriteFieldDeclPrim(FILE *file, const argument_t *arg, - const char *(*tfunc)(const ipc_type_t *it)); - -extern void WriteStructDecl(FILE *file, const argument_t *args, - write_list_fn_t *func, u_int mask, - const char *name); - -extern void WriteStaticDecl(FILE *file, const ipc_type_t *it, - dealloc_t dealloc, boolean_t longform, - boolean_t inname, identifier_t name); - -extern void WriteCopyType(FILE *file, const ipc_type_t *it, - const char *left, const char *right, ...); - -extern void WritePackMsgType(FILE *file, const ipc_type_t *it, - dealloc_t dealloc, boolean_t longform, - boolean_t inname, const char *left, - const char *right, ...); - -#endif /* _UTILS_H */ diff --git a/mig/vprint.c b/mig/vprint.c deleted file mode 100644 index ea66c59..0000000 --- a/mig/vprint.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 1990,1992,1993 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software_Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -#ifndef HAVE_VPRINTF - -/* - * ansi varargs versions of printf routines - * This are directly included to deal with nonansi libc's. - */ -#include -#include -#include -#include - -/* - * Forward declaration. - */ -static void _doprnt_ansi(const char *_fmt, va_list _args, FILE *_stream); - -int -vprintf(const char *fmt, va_list args) -{ - _doprnt_ansi(fmt, args, stdout); - return (ferror(stdout) ? EOF : 0); -} - -int -vfprintf(FILE *f, const char *fmt, va_list args) -{ - _doprnt_ansi(fmt, args, f); - return (ferror(f) ? EOF : 0); -} - -int -vsprintf(char *s, const char *fmt, va_list args) -{ - FILE fakebuf; - - fakebuf._flag = _IOSTRG; /* no _IOWRT: avoid stdio bug */ - fakebuf._ptr = s; - fakebuf._cnt = 32767; - _doprnt_ansi(fmt, args, &fakebuf); - putc('\0', &fakebuf); - return (strlen(s)); -} - -int -vsnprintf(char *s, int n, const char *fmt, va_list args) -{ - FILE fakebuf; - - fakebuf._flag = _IOSTRG; /* no _IOWRT: avoid stdio bug */ - fakebuf._ptr = s; - fakebuf._cnt = n-1; - _doprnt_ansi(fmt, args, &fakebuf); - fakebuf._cnt++; - putc('\0', &fakebuf); - if (fakebuf._cnt<0) - fakebuf._cnt = 0; - return (n-fakebuf._cnt-1); -} - -/* - * Common code for printf et al. - * - * The calling routine typically takes a variable number of arguments, - * and passes the address of the first one. This implementation - * assumes a straightforward, stack implementation, aligned to the - * machine's wordsize. Increasing addresses are assumed to point to - * successive arguments (left-to-right), as is the case for a machine - * with a downward-growing stack with arguments pushed right-to-left. - * - * To write, for example, fprintf() using this routine, the code - * - * fprintf(fd, format, args) - * FILE *fd; - * char *format; - * { - * _doprnt_ansi(format, &args, fd); - * } - * - * would suffice. (This example does not handle the fprintf's "return - * value" correctly, but who looks at the return value of fprintf - * anyway?) - * - * This version implements the following printf features: - * - * %d decimal conversion - * %u unsigned conversion - * %x hexadecimal conversion - * %X hexadecimal conversion with capital letters - * %o octal conversion - * %c character - * %s string - * %m.n field width, precision - * %-m.n left adjustment - * %0m.n zero-padding - * %*.* width and precision taken from arguments - * - * This version does not implement %f, %e, or %g. It accepts, but - * ignores, an `l' as in %ld, %lo, %lx, and %lu, and therefore will not - * work correctly on machines for which sizeof(long) != sizeof(int). - * It does not even parse %D, %O, or %U; you should be using %ld, %o and - * %lu if you mean long conversion. - * - * As mentioned, this version does not return any reasonable value. - * - * Permission is granted to use, modify, or propagate this code as - * long as this notice is incorporated. - * - * Steve Summit 3/25/87 - */ - -/* - * Added for general use: - * # prefix for alternate format: - * 0x (0X) for hex - * leading 0 for octal - * + print '+' if positive - * blank print ' ' if positive - * - */ - -/* - * Fixed to handle `l' and `h' prefixes, %% format, and ANSI %p format. - * It does not handle the ANSI %n format. - * - * ANSI NOTE: The formating of %d, %o, %u, %x, and %X are not compliant. - * - * NOTE: Given that this routine uses stdarg.h, I'm not sure that the - * comment above about stack layout is valid. - * - * Peter Stout, 1/11/93 - */ - -#define Ctod(c) ((c) - '0') - -#define MAXBUF (sizeof(long int) * 8) /* enough for binary */ - -typedef int boolean_t; -#define FALSE ((boolean_t) 0) -#define TRUE ((boolean_t) 1) - -#define SHORT sizeof(short) -#define INT sizeof(int) -#define LONG sizeof(long) - -static void -_doprnt_ansi(register const char *fmt, va_list args, FILE *stream) -{ - int length; - int prec; - boolean_t ladjust; - char padc; - long n; - unsigned long u; - int plus_sign; - int sign_char; - boolean_t altfmt; - int base; - int size; - unsigned char char_buf[2]; - - char_buf[1] = '\0'; - - while (*fmt != '\0') { - if (*fmt != '%') { - putc(*fmt++, stream); - continue; - } - - fmt++; - - length = 0; - prec = -1; - ladjust = FALSE; - padc = ' '; - plus_sign = 0; - sign_char = 0; - altfmt = FALSE; - - while (TRUE) { - if (*fmt == '#') { - altfmt = TRUE; - fmt++; - } - else if (*fmt == '-') { - ladjust = TRUE; - fmt++; - } - else if (*fmt == '+') { - plus_sign = '+'; - fmt++; - } - else if (*fmt == ' ') { - if (plus_sign == 0) - plus_sign = ' '; - fmt++; - } - else - break; - } - - if (*fmt == '0') { - padc = '0'; - fmt++; - } - - if (isdigit(*fmt)) { - while(isdigit(*fmt)) - length = 10 * length + Ctod(*fmt++); - } - else if (*fmt == '*') { - length = va_arg(args, int); - fmt++; - if (length < 0) { - ladjust = !ladjust; - length = -length; - } - } - - if (*fmt == '.') { - prec = 0; - fmt++; - if (isdigit(*fmt)) { - prec = 0; - while(isdigit(*fmt)) - prec = 10 * prec + Ctod(*fmt++); - } - else if (*fmt == '*') { - prec = va_arg(args, int); - fmt++; - } - } - - if (*fmt == 'l' || *fmt == 'h') - size = *(fmt++) == 'l' ? LONG : SHORT; - else - size = INT; - - switch(*fmt) { - case 'c': - { - register const char *p; - register const char *p2; - - char_buf[0] = va_arg(args, int); - p = char_buf; - prec = 1; - goto put_string; - - case 's': - if (prec == -1) - prec = INT_MAX; - - p = va_arg(args, char *); - - if (p == (const char *)0) - p = ""; - - put_string: - if (length > 0 && !ladjust) { - n = 0; - p2 = p; - - for (; *p != '\0' && n < prec; p++) - n++; - - p = p2; - - while (n < length) { - putc(padc, stream); - n++; - } - } - - n = 0; - - while (*p != '\0') { - if (++n > prec) - break; - - putc(*p++, stream); - } - - if (n < length && ladjust) { - while (n < length) { - putc(' ', stream); - n++; - } - } - - break; - } - - case 'o': - base = 8; - goto print_unsigned; - - case 'i': - case 'd': - base = 10; - goto print_signed; - - case 'u': - base = 10; - goto print_unsigned; - - case 'x': - case 'X': - base = 16; - goto print_unsigned; - - case 'p': - base = 16; - altfmt = TRUE; - u = (unsigned long) va_arg(args, void *); - goto print_num; - - print_signed: - if (size == INT) - n = va_arg(args, int); - else if (size == LONG) - n = va_arg(args, long); - else - n = (short) va_arg(args, int); - if (n >= 0) { - u = n; - sign_char = plus_sign; - } - else { - u = -n; - sign_char = '-'; - } - goto print_num; - - print_unsigned: - if (size == INT) - u = va_arg(args, unsigned int); - else if (size == LONG) - u = va_arg(args, unsigned long); - else - u = (unsigned short) va_arg(args, unsigned int); - goto print_num; - - print_num: - { - char buf[MAXBUF]; /* build number here */ - register char * p = &buf[MAXBUF-1]; - static const char digits[] = "0123456789abcdef"; - const char *prefix = 0; - - if (u != 0 && altfmt) { - if (base == 8) - prefix = "0"; - else if (base == 16) - prefix = "0x"; - } - - do { - *p-- = digits[u % base]; - u /= base; - } while (u != 0); - - length -= (&buf[MAXBUF-1] - p); - if (sign_char) - length--; - if (prefix) - length -= strlen(prefix); - - if (padc == ' ' && !ladjust) { - /* blank padding goes before prefix */ - while (--length >= 0) - putc(' ', stream); - } - if (sign_char) - putc(sign_char, stream); - if (prefix) - while (*prefix) - putc(*prefix++, stream); - if (padc == '0') { - /* zero padding goes after sign and prefix */ - while (--length >= 0) - putc('0', stream); - } - while (++p != &buf[MAXBUF]) - putc(*p, stream); - - if (ladjust) { - while (--length >= 0) - putc(' ', stream); - } - break; - } - - case '%': - putc('%', stream); - break; - - case '\0': - fmt--; - break; - - default: - putc(*fmt, stream); - } - fmt++; - } -} - -#endif !HAVE_VPRINTF diff --git a/mig/write.h b/mig/write.h deleted file mode 100644 index 8b481a3..0000000 --- a/mig/write.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#ifndef _WRITE_H -#define _WRITE_H - -#include - -#include "statement.h" - -extern void WriteUserHeader(FILE *file, const statement_t *stats); -extern void WriteServerHeader(FILE *file, const statement_t *stats); -extern void WriteInternalHeader(FILE *file, const statement_t *stats); -extern void WriteUser(FILE *file, const statement_t *stats); -extern void WriteUserIndividual(const statement_t *stats); -extern void WriteServer(FILE *file, const statement_t *stats); - -#endif /* _WRITE_H */ -- cgit v1.2.3