/*----------------------------------------------------------------*/ /* trapphc.c 10/31/2011 Keven Miller kevenm@3kranger.com */ #pragma list off /*---------------------------------------------------------------- This demo program shows how to determine if the running program has PH capability. Set a system trap when calling MAIL which requires PH, and set indicator flag. Build setvar ccopts "-Aa +e +w1" ccxllk trappmc.c, trapph.pub Example run :trapph.pub PH=0 :trapph.pub -v [trapph] code 1003 intr 106 err 254 parm 255 PH=0 : :linkedit "altprog trapph.pub;cap=pm" HP Link Editor/iX (HP30315A.06.17) Copyright Hewlett-Packard Co 1986 LinkEd> altprog trapph.pub;cap=pm :trapph.pub PH=1 :trappm.pub -v PH=1 ------------------------------------------------------------------*/ #include /* printf */ #pragma intrinsic MAIL #pragma intrinsic XSYSTRAP typedef short s16; typedef int s32; typedef unsigned int u32; #define proc /*----------------------------------------------------------------*/ int trap_noph; int trap_view; proc void trapph (s32 code, s32 intr, s32 err, s32 parm) { if ( trap_view ) printf ( "[trapph] code %d intr %d err %d parm %d\n", code, intr, err, parm ); if ( code == 1003 && /* */ intr == 106 && /* MAIL intrinsic (set 5 msg 106)*/ err == 254 ) /* */ { trap_noph = 1; } } /*----------------------------------------------------------------*/ proc int check_for_ph (void) { int old, x; s16 slen; /* check for PH cap */ /* set a system trap to check for failed MAIL call, and set flag */ XSYSTRAP ( (int) &trapph, &old ); /* Set PM trap */ trap_noph = 0; /* clear trap flag */ x = MAIL ( 0, &slen ); /* PM Test */ XSYSTRAP ( old, &old ); /* reset trap */ return ( trap_noph ? 0 : 1 ); } /*----------------------------------------------------------------*/ proc int main ( int ac, char *av [] ) { int x; char *cp; for ( x = 1; x < ac; ++x ) { cp = av [x]; if ( '-' == *cp ) { ++cp; while (*cp) { switch (*cp++) { case 'v': trap_view = 1; break; case '?': printf ( "Usage: %s [options]\n", av [0] ); printf ( " -v verbose\n" ); break; default: printf ( "Unknown option: %c\n", cp [-1] ); } } continue; } } printf ( "PH=%d\n", check_for_ph () ); return 0; } /*----------------------------------------------------------------*/