xref: /plan9-contrib/sys/src/cmd/gs/src/opcheck.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* Copyright (C) 1993, 1995, 1997, 1998 Aladdin Enterprises.  All rights reserved.
27dd7cddfSDavid du Colombier 
3*593dc095SDavid du Colombier   This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier   implied.
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier   This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier   modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier   of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier   For more information about licensing, please refer to
11*593dc095SDavid du Colombier   http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier   commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier 
17*593dc095SDavid du Colombier /* $Id: opcheck.h,v 1.6 2003/09/03 03:22:59 giles Exp $ */
187dd7cddfSDavid du Colombier /* Definitions for operator operand checking */
19*593dc095SDavid du Colombier /* Requires ialloc.h (for imemory), iref.h, ierrors.h */
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier #ifndef opcheck_INCLUDED
227dd7cddfSDavid du Colombier #  define opcheck_INCLUDED
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier /*
257dd7cddfSDavid du Colombier  * Check the type of an object.  Operators almost always use check_type,
267dd7cddfSDavid du Colombier  * which is defined in oper.h; check_type_only is for checking
277dd7cddfSDavid du Colombier  * subsidiary objects obtained from places other than the stack.
287dd7cddfSDavid du Colombier  */
297dd7cddfSDavid du Colombier #define check_type_only(rf,typ)\
307dd7cddfSDavid du Colombier   BEGIN if ( !r_has_type(&rf,typ) ) return_error(e_typecheck); END
317dd7cddfSDavid du Colombier #define check_stype_only(rf,styp)\
327dd7cddfSDavid du Colombier   BEGIN if ( !r_has_stype(&rf,imemory,styp) ) return_error(e_typecheck); END
337dd7cddfSDavid du Colombier /* Check for array */
347dd7cddfSDavid du Colombier #define check_array_else(rf,errstat)\
357dd7cddfSDavid du Colombier   BEGIN if ( !r_has_type(&rf, t_array) ) errstat; END
367dd7cddfSDavid du Colombier #define check_array_only(rf)\
377dd7cddfSDavid du Colombier   check_array_else(rf, return_error(e_typecheck))
387dd7cddfSDavid du Colombier /* Check for procedure.  check_proc_failed includes the stack underflow */
397dd7cddfSDavid du Colombier /* check, but it doesn't do any harm in the off-stack case. */
40*593dc095SDavid du Colombier int check_proc_failed(const ref *);
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier #define check_proc(rf)\
437dd7cddfSDavid du Colombier   BEGIN if ( !r_is_proc(&rf) ) return_error(check_proc_failed(&rf)); END
447dd7cddfSDavid du Colombier #define check_proc_only(rf) check_proc(rf)
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier /* Check for read, write, or execute access. */
477dd7cddfSDavid du Colombier #define check_access(rf,acc1)\
487dd7cddfSDavid du Colombier   BEGIN if ( !r_has_attr(&rf,acc1) ) return_error(e_invalidaccess); END
497dd7cddfSDavid du Colombier #define check_read(rf) check_access(rf,a_read)
507dd7cddfSDavid du Colombier #define check_write(rf) check_access(rf,a_write)
517dd7cddfSDavid du Colombier #define check_execute(rf) check_access(rf,a_execute)
527dd7cddfSDavid du Colombier #define check_type_access_only(rf,typ,acc1)\
537dd7cddfSDavid du Colombier   BEGIN\
547dd7cddfSDavid du Colombier     if ( !r_has_type_attrs(&rf,typ,acc1) )\
557dd7cddfSDavid du Colombier       return_error((!r_has_type(&rf,typ) ? e_typecheck : e_invalidaccess));\
567dd7cddfSDavid du Colombier   END
577dd7cddfSDavid du Colombier #define check_read_type_only(rf,typ)\
587dd7cddfSDavid du Colombier   check_type_access_only(rf,typ,a_read)
597dd7cddfSDavid du Colombier #define check_write_type_only(rf,typ)\
607dd7cddfSDavid du Colombier   check_type_access_only(rf,typ,a_write)
617dd7cddfSDavid du Colombier 
627dd7cddfSDavid du Colombier /* Check for an integer value within an unsigned bound. */
637dd7cddfSDavid du Colombier #define check_int_leu(orf, u)\
647dd7cddfSDavid du Colombier   BEGIN\
657dd7cddfSDavid du Colombier     check_type(orf, t_integer);\
667dd7cddfSDavid du Colombier     if ( (ulong)(orf).value.intval > (u) ) return_error(e_rangecheck);\
677dd7cddfSDavid du Colombier   END
687dd7cddfSDavid du Colombier #define check_int_leu_only(rf, u)\
697dd7cddfSDavid du Colombier   BEGIN\
707dd7cddfSDavid du Colombier     check_type_only(rf, t_integer);\
717dd7cddfSDavid du Colombier     if ( (ulong)(rf).value.intval > (u) ) return_error(e_rangecheck);\
727dd7cddfSDavid du Colombier   END
737dd7cddfSDavid du Colombier #define check_int_ltu(orf, u)\
747dd7cddfSDavid du Colombier   BEGIN\
757dd7cddfSDavid du Colombier     check_type(orf, t_integer);\
767dd7cddfSDavid du Colombier     if ( (ulong)(orf).value.intval >= (u) ) return_error(e_rangecheck);\
777dd7cddfSDavid du Colombier   END
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier #endif /* opcheck_INCLUDED */
80