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