diff options
Diffstat (limited to 'mig/type.c')
-rw-r--r-- | mig/type.c | 918 |
1 files changed, 0 insertions, 918 deletions
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 <stdio.h> -#include <stdlib.h> - -#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); -} |