#! /bin/sh /usr/share/dpatch/dpatch-run ## 211-support-amd64-and-itanium.dpatch by ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Large patch from Harald Vogt to make CERNLIB work better ## DP: (at least when statically linked) on 64-bit architectures. ## DP: Slightly modified in an attempt to keep ABI compatibility of the ## DP: dynamic libraries; not that it matters much as they don't work well ## DP: when dynamically linked on 64-bit anyway. @DPATCH@ diff -urNad cernlib-2006.dfsg.2~/src/cfortran/hbook.h cernlib-2006.dfsg.2/src/cfortran/hbook.h --- cernlib-2006.dfsg.2~/src/cfortran/hbook.h 1999-11-15 17:01:12.000000000 +0000 +++ cernlib-2006.dfsg.2/src/cfortran/hbook.h 2007-12-14 21:41:27.000000000 +0000 @@ -489,6 +489,10 @@ #define HBALLOC(IDN,CHDIR,VAR,BLOCK,ITYPE,ISIZE,IFIRST,NELEM,IBASE,IOFF,NUSE)\ CCALLSFSUB11(HBALLOC,hballoc,INT,STRING,STRING,STRING,INT,INT,INT,INT,INTV,PINT,PINT,IDN,CHDIR,VAR,BLOCK,ITYPE,ISIZE,IFIRST,NELEM,IBASE,IOFF,NUSE) +PROTOCCALLSFSUB11(HBALLOC64,hballoc64,INT,STRING,STRING,STRING,INT,INT,INT,INT,INTV,PLONG,PINT) +#define HBALLOC64(IDN,CHDIR,VAR,BLOCK,ITYPE,ISIZE,IFIRST,NELEM,IBASE,IOFF,NUSE)\ + CCALLSFSUB11(HBALLOC64,hballoc64,INT,STRING,STRING,STRING,INT,INT,INT,INT,INTV,PLONG,PINT,IDN,CHDIR,VAR,BLOCK,ITYPE,ISIZE,IFIRST,NELEM,IBASE,IOFF,NUSE) + PROTOCCALLSFSUB1(HBFREE,hbfree,INT) #define HBFREE(LUN) CCALLSFSUB1(HBFREE,hbfree,INT,LUN) @@ -508,6 +512,13 @@ #define HGNTBF(IDN,VAR,IOFFST,NVAR,IDNEVT,IERROR)\ CCALLSFSUB6(HGNTBF,hgntbf,INT,ZTRINGV,INTV,INT,INT,PINT,IDN,VAR,IOFFST,NVAR,IDNEVT,IERROR) +PROTOCCALLSFSUB6(HGNTBF64,hgntbf64,INT,ZTRINGV,LONGV,INT,INT,PINT) +/* fix the element length of VAR to 32 */ +#define hgntbf64_ELEMS_2 ZTRINGV_ARGS(4) +#define hgntbf64_ELEMLEN_2 ZTRINGV_NUM(32) +#define HGNTBF64(IDN,VAR,IOFFST,NVAR,IDNEVT,IERROR)\ + CCALLSFSUB6(HGNTBF64,hgntbf64,INT,ZTRINGV,LONGV,INT,INT,PINT,IDN,VAR,IOFFST,NVAR,IDNEVT,IERROR) + PROTOCCALLSFSUB1(HGTDIR,hgtdir,PSTRING) #define HGTDIR(CHDIR) CCALLSFSUB1(HGTDIR,hgtdir,PSTRING,CHDIR) diff -urNad cernlib-2006.dfsg.2~/src/packlib/cspack/cspack/hcntpar.inc cernlib-2006.dfsg.2/src/packlib/cspack/cspack/hcntpar.inc --- cernlib-2006.dfsg.2~/src/packlib/cspack/cspack/hcntpar.inc 1996-03-08 15:44:16.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/cspack/cspack/hcntpar.inc 2007-12-14 21:41:27.000000000 +0000 @@ -22,7 +22,7 @@ + ZIFREA=7, ZNWTIT=8, ZITIT1=9, ZNCHRZ=13, ZIFBIT=8, + ZDESC=1, ZLNAME=2, ZNAME=3, ZRANGE=4, ZNADDR=12, + ZARIND=11, ZIBLOK=8, ZNBLOK=10, ZIBANK=9, ZIFTMP=11, - + ZITMP=10, ZNTMP=5, ZNTMP1=3, ZLINK=6) + + ZITMP=10, ZNTMP=5, ZNTMP1=4, ZLINK=6) * #endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/cspack/sysreq/netreq.c cernlib-2006.dfsg.2/src/packlib/cspack/sysreq/netreq.c --- cernlib-2006.dfsg.2~/src/packlib/cspack/sysreq/netreq.c 2007-12-14 21:41:17.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/cspack/sysreq/netreq.c 2007-12-14 21:41:27.000000000 +0000 @@ -341,7 +341,7 @@ return(-errno); } TRACE(2, "sysreq", "recv reply length"); - if ((int)(p = RecvStr(s, &replylen)) <0) { + if ((long)(p = RecvStr(s, &replylen)) <0) { TRACE(2, "sysreq", "RecvStr(RepLen): (errno=%d)", errno); (void) close(s); END_TRACE(); diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hbook/hcntpar.inc cernlib-2006.dfsg.2/src/packlib/hbook/hbook/hcntpar.inc --- cernlib-2006.dfsg.2~/src/packlib/hbook/hbook/hcntpar.inc 1996-01-16 17:07:52.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hbook/hcntpar.inc 2007-12-14 21:41:27.000000000 +0000 @@ -24,7 +24,7 @@ + ZIFREA=7, ZNWTIT=8, ZITIT1=9, ZNCHRZ=13, ZIFBIT=8, + ZDESC=1, ZLNAME=2, ZNAME=3, ZRANGE=4, ZNADDR=12, + ZARIND=11, ZIBLOK=8, ZNBLOK=10, ZIBANK=9, ZIFTMP=11, - + ZID=12, ZITMP=10, ZNTMP=6, ZNTMP1=3, ZLINK=6) + + ZID=12, ZITMP=10, ZNTMP=6, ZNTMP1=4, ZLINK=6) * #endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hmmap/hcreatem.F cernlib-2006.dfsg.2/src/packlib/hbook/hmmap/hcreatem.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hmmap/hcreatem.F 1996-03-13 10:13:20.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hmmap/hcreatem.F 2007-12-14 21:41:27.000000000 +0000 @@ -39,11 +39,11 @@ ************************************************************************ * CHARACTER*(*) MFILE -#if !defined(CERNLIB_ALPHA_OSF) +#if !defined(CERNLIB_ALPHA_OSF) && !defined(CERNLIB_QMLXIA64) INTEGER ICOMAD(1), ISIZE, IBASE(1), HCREATEI SAVE ICOMAD #endif -#if defined(CERNLIB_ALPHA_OSF) +#if defined(CERNLIB_ALPHA_OSF) || defined(CERNLIB_QMLXIA64) INTEGER ISIZE, IBASE(1), HCREATEI INTEGER*8 ICOMAD(1) SAVE ICOMAD @@ -63,6 +63,10 @@ ************************************************************************ ICOMAD(1) = 0 #endif +#if defined(CERNLIB_QMLXIA64) +C this should be a reasonable range for IA64 architectures + ICOMAD(1) = 2**30 +#endif #if (defined(CERNLIB_DECS))&&(!defined(CERNLIB_ALPHA)) ICOMAD(1) = 4*LOCF(ICOMAD(1)) + MFEN ICOMAD(1) = ((ICOMAD(1)+4095)/4096)*4096 diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hmmap/hmapm.F cernlib-2006.dfsg.2/src/packlib/hbook/hmmap/hmapm.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hmmap/hmapm.F 2001-10-02 09:06:15.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hmmap/hmapm.F 2007-12-14 21:41:27.000000000 +0000 @@ -54,11 +54,11 @@ ************************************************************************ * CHARACTER*(*) MFILE -#if !defined(CERNLIB_ALPHA_OSF) +#if !defined(CERNLIB_ALPHA_OSF) && !defined(CERNLIB_QMLXIA64) INTEGER ICOMAD(1), IBASE(1), HMAPI SAVE ICOMAD #endif -#if defined(CERNLIB_ALPHA_OSF) +#if defined(CERNLIB_ALPHA_OSF) || defined(CERNLIB_QMLXIA64) INTEGER IBASE(1), HMAPI INTEGER*8 ICOMAD(1) SAVE ICOMAD @@ -81,6 +81,10 @@ CALL UCTOH(MFILE2,MKEY,4,4) ICOMAD(1) = 0 #endif +#if defined(CERNLIB_QMLXIA64) +C this should be a reasonable range for IA64 architectures + ICOMAD(1) = 2**30 +#endif #if defined(CERNLIB_DECS) ICOMAD(1) = 4*LOCF(ICOMAD(1)) + MFEN ICOMAD(1) = ((ICOMAD(1)+4095)/4096)*4096 diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hballoc.F cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hballoc.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hballoc.F 1996-01-16 17:07:56.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hballoc.F 2007-12-14 21:41:27.000000000 +0000 @@ -42,3 +42,26 @@ ENDIF * END +* +* 64-bit version (separate to preserve ABI compatibility) + SUBROUTINE HBALLOC64(IDN,CHDIR,VAR,BLOCK,ITYPE,ISIZE,IFIRST,NELEM, + + IBASE,IOFF,NUSE) +* + CHARACTER*(*) CHDIR, VAR, BLOCK + INTEGER IDN, ITYPE, ISIZE, NELEM, NUSE, IFIRST, IBASE(1) + INTEGER*8 IBUF(1), IOFF +* + LC = LENOCC(CHDIR) + LV = LENOCC(VAR) + LB = LENOCC(BLOCK) +* + CALL HBALLO1(IDN, CHDIR, LC, VAR, LV, BLOCK, LB, ITYPE, ISIZE, + + IFIRST, NELEM, IBUF, NUSE) +* + IF (NUSE .EQ. 0) THEN + IOFF = 0 + ELSE + IOFF = IBUF(1) - LOC(IBASE(1))/4 + ENDIF +* + END diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hbnt.F cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hbnt.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hbnt.F 1996-01-16 17:07:56.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hbnt.F 2007-12-14 21:41:27.000000000 +0000 @@ -269,11 +269,13 @@ ************************************************************************ * * * * * 1 * * Number of variables to be read out * - * * * *** For every variable 3 words (ZNTMP1) *** * + * * * *** For every variable 4 words (ZNTMP1) *** * * 2 * * Index of variable in LNAME bank * * 3 * * Offset of variable in LNAME bank (INDX-1)*ZNADDR* * 4 * * Offset in dynamically allocated buffer (only * * * * used via HGNTBF) otherwise 0 * + * 5 * * spare (used in 64 bit architectures for upper * + * * * address part) * ************************************************************************ #endif * diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgnt2.F cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgnt2.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgnt2.F 1999-03-05 15:42:35.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgnt2.F 2007-12-14 21:41:27.000000000 +0000 @@ -34,7 +34,13 @@ #include "hbook/hcrecv.inc" * CHARACTER*(*) VAR1(*) +#if defined(CERNLIB_QMLXIA64) + INTEGER*8 IVOFF(*), IOFFST, IOFFSTT + INTEGER IOFFSTV(2) + EQUIVALENCE (IOFFSTV, IOFFSTT) +#else INTEGER IVOFF(*) +#endif CHARACTER*32 VAR INTEGER ILOGIC, HNMPTR LOGICAL LOGIC, INDVAR, ALLVAR, USEBUF, CHKOFF @@ -452,12 +458,21 @@ IQ(LTMP1+JTMP+1) = IOFF IF (USEBUF) THEN IF (IEDIF .EQ. 0) THEN - IQ(LTMP1+JTMP+2) = IOFFST + IOFFSTT = IOFFST ELSE - IQ(LTMP1+JTMP+2) = IOFFST + (IEDIF*ISHFT(ISIZE,-2)) + IOFFSTT = IOFFST + (IEDIF*ISHFT(ISIZE,-2)) ENDIF + IQ(LTMP1+JTMP+2) = IOFFSTT +#if defined(CERNLIB_QMLXIA64) +* store upper part of 64 bit address + IQ(LTMP1+JTMP+3) = IOFFSTV(2) +#endif ELSE IQ(LTMP1+JTMP+2) = 0 +#if defined(CERNLIB_QMLXIA64) +* reset upper part of 64 bit address + IQ(LTMP1+JTMP+3) = 0 +#endif ENDIF LQ(LTMP1-IQ(LTMP1+1)) = LBLOK * diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgntbf.F cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgntbf.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgntbf.F 1996-01-16 17:07:57.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgntbf.F 2007-12-14 21:41:27.000000000 +0000 @@ -26,3 +26,13 @@ CALL HGNT1(IDN, '*', VAR, IOFFST, NVAR1, IDNEVT, IERROR) * END +* +* 64-bit version (separate to preserve ABI compatibility) + SUBROUTINE HGNTBF64(IDN,VAR,IOFFST,NVAR,IDNEVT,IERROR) + CHARACTER*(*) VAR(*) + INTEGER*8 IOFFST(*) +* + NVAR1 = -NVAR + CALL HGNT1(IDN, '*', VAR, IOFFST, NVAR1, IDNEVT, IERROR) +* + END diff -urNad cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgntf.F cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgntf.F --- cernlib-2006.dfsg.2~/src/packlib/hbook/hntup/hgntf.F 1999-03-05 15:42:35.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/hbook/hntup/hgntf.F 2007-12-14 21:41:27.000000000 +0000 @@ -37,6 +37,13 @@ INTEGER ILOGIC LOGICAL LOGIC, INDVAR, USEBUF EQUIVALENCE (LOGIC, ILOGIC) + +#if defined(CERNLIB_QMLXIA64) + INTEGER*8 IOFFST, IOFFSTT + INTEGER IOFFSTV(2) + EQUIVALENCE (IOFFSTV, IOFFSTT) +#endif + * #include "hbook/jbyt.inc" * @@ -76,6 +83,12 @@ INDX = IQ(LTMP1+JTMP) IOFF = IQ(LTMP1+JTMP+1) IOFFST = IQ(LTMP1+JTMP+2) +#if defined(CERNLIB_QMLXIA64) +* fetch full 64 bit address + IOFFSTV(1) = IQ(LTMP1+JTMP+2) + IOFFSTV(2) = IQ(LTMP1+JTMP+3) + IOFFST = IOFFSTT +#endif IF (IOFFST .EQ. 0) THEN USEBUF = .FALSE. ELSE @@ -442,12 +455,21 @@ * IF (USEBUF) THEN IF (IEDIF .EQ. 0) THEN - IQ(LTMP1+JTMP+2) = IOFFST + IOFFSTT = IOFFST ELSE - IQ(LTMP1+JTMP+2) = IOFFST + (IEDIF*ISHFT(ISIZE,-2)) + IOFFSTT = IOFFST + (IEDIF*ISHFT(ISIZE,-2)) ENDIF + IQ(LTMP1+JTMP+2) = IOFFSTT +#if defined(CERNLIB_QMLXIA64) +* store upper part of 64 bit address + IQ(LTMP1+JTMP+3) = IOFFSTV(2) +#endif ELSE IQ(LTMP1+JTMP+2) = 0 +#if defined(CERNLIB_QMLXIA64) +* reset upper part of 64 bit address + IQ(LTMP1+JTMP+3) = 0 +#endif ENDIF * 40 CONTINUE diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/Imakefile cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/Imakefile --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/Imakefile 2002-09-19 16:44:52.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/Imakefile 2007-12-14 21:41:27.000000000 +0000 @@ -11,6 +11,10 @@ sleepf.c signalf.c sigprnt.c sigunbl.c stati.c systei.c \ @@\ tminit.c unlini.c tmread.c +#ifdef CERNLIB_QMLXIA64 +SRCS_C += chkloc.c +#endif + #ifndef CERNLIB_OS9 SRCS_C += timel.c lstati.c #endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/chkloc.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/chkloc.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/chkloc.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/chkloc.c 2007-12-14 21:41:27.000000000 +0000 @@ -0,0 +1,10 @@ +/* + * Utility routine for locf and locb + * H. Vogt (harald.vogt@desy.de) + * + */ + +#if defined(CERNLIB_QMLXIA64) +#include "lp64gs/chkloc.c" +#endif + diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/jumptn.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/jumptn.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/jumptn.c 2004-07-29 14:07:43.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/jumptn.c 2007-12-14 21:41:27.000000000 +0000 @@ -20,8 +20,10 @@ */ #include "kerngen/pilot.h" -#if defined(CERNLIB_QMLXIA64)||defined(CERNLIB_QMVAOS) -#include "vaogs/jumptn.c" +#if defined(CERNLIB_QMVAOS) +#include "vaogs/jumptn.c" +#elif defined(CERNLIB_QMLXIA64) +#include "lp64gs/jumptn.c" #else /*> ROUTINE JUMPTN CERN PROGLIB# Z043 JUMPTN .VERSION KERNFOR 4.40 940929 diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/jumpxn.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/jumpxn.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/jumpxn.c 2004-07-29 14:07:43.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/jumpxn.c 2007-12-14 21:41:27.000000000 +0000 @@ -20,8 +20,10 @@ */ #include "kerngen/pilot.h" -#if defined(CERNLIB_QMLXIA64)||defined(CERNLIB_QMVAOS) +#if defined(CERNLIB_QMVAOS) #include "vaogs/jumpxn.c" +#elif defined(CERNLIB_QMLXIA64) +#include "lp64gs/jumpxn.c" #else /*> ROUTINE JUMPXN CERN PROGLIB# Z042 JUMPXN .VERSION KERNFOR 4.40 940929 diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lenocc.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lenocc.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lenocc.c 1997-10-23 16:25:11.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lenocc.c 2007-12-14 21:41:27.000000000 +0000 @@ -46,7 +46,7 @@ /* look at the last ntail characters */ - ntail = ((int)chcur & 3); + ntail = ((unsigned long)chcur & 3); for (i = ntail; i > 0; i--) { if (*--chcur != ' ') goto exit; } diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/locb.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/locb.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/locb.c 1997-09-02 14:26:37.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/locb.c 2007-12-14 21:41:27.000000000 +0000 @@ -26,6 +26,9 @@ # define DummyDef #endif +#if defined(CERNLIB_QMLXIA64) +#include "lp64gs/locb.c" +#else /*> ROUTINE LOCB CERN PROGLIB# N101 LOCB .VERSION KERNFOR 4.36 930602 @@ -47,6 +50,8 @@ return( (int) iadr ); } /*> END <----------------------------------------------------------*/ +#endif #ifdef CERNLIB_TCGEN_LOCB #undef CERNLIB_TCGEN_LOCB #endif + diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/locf.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/locf.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/locf.c 2004-07-29 14:06:07.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/locf.c 2007-12-14 21:41:27.000000000 +0000 @@ -50,6 +50,8 @@ #include "irtdgs/locf.c" #elif defined(CERNLIB_QMVAOS) #include "vaogs/locf.c" +#elif defined(CERNLIB_QMLXIA64) +#include "lp64gs/locf.c" #else /*> ROUTINE LOCF CERN PROGLIB# N100 LOCF .VERSION KERNFOR 4.36 930602 @@ -68,25 +70,7 @@ DummyDef #endif { -#if defined(CERNLIB_QMLXIA64) - const unsigned long long int mask=0x00000000ffffffff; - static unsigned long long int base=1; - unsigned long long int jadr=(unsigned long long int) iadr; - unsigned long long int jadrl = ((mask & jadr) >> LADUPW); - - if (base == 1) { - base = (~mask & jadr); - } else if(base != (~mask & jadr)) { - printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - printf("locf_() Warning: changing base from %lx to %lx!!!\n", - base, (~mask & jadr)); - printf("This may result in program crash or incorrect results\n"); - printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); - } - return ((unsigned) jadrl); -#else return( ((unsigned) iadr) >> LADUPW ); -#endif } #undef Dummy2LocPar #undef DummyDef diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/chkloc.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/chkloc.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/chkloc.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/chkloc.c 2007-12-14 21:41:27.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * + * Revision 1.1.1.1 2006/06/14 + * Kernlib utility for locf, locb on LP64 architectures H. Vogt + * (AMD64/Intel EM64T and IA64) + * + */ + +#include +#include + +/*> ROUTINE LOCF + CERN PROGLIB# N100 LOCF .VERSION KERNFOR 4.36 930602 +*/ +/*> ROUTINE LOCB + CERN PROGLIB# N101 LOCB .VERSION KERNFOR 4.36 930602 +*/ + +unsigned int chkloc(iadr) + char *iadr; +{ + /* 64 bit architectures may exceed the 32 bit address space ! */ + + /* AMD64/Intel EM64T architectures have the dynamic segments above + 0x80000000000 and the stack immediately below this whereas the text and + data segments are staring from 0x400000. The implementations address + space is limited to 0x00007fffffffffff. + Allocated memory with malloc/calloc is starting from the end of text and + data segments upwards. + + IA64 architectures have the dynamic segments are above 0x2000000000000000, + the stack is above 0x8000000000000000, the data segments starts at + 0x6000000000000000 and the text segments start at 0x4000000000000000 + Allocated memory with malloc/calloc is starting from the end of + data segments upwards. All addresses here are expected to be in + the data segment area. */ + + const unsigned long mask=0xffffffff00000000; + static unsigned long limit=0x00000000ffffffff; + unsigned long jadr=((unsigned long) iadr & mask); +#if !defined (__ia64__) + if ( jadr != 0x0000000000000000) { +#else + if ( jadr != 0x6000000000000000) { +#endif + fprintf(stderr, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + fprintf(stderr, "LOCB/LOCF: address %p exceeds the 32 bit address space\n", iadr); + fprintf(stderr, "or is not in the data segments\n"); + fprintf(stderr, "This may result in program crash or incorrect results\n"); + fprintf(stderr, "Therefore we will stop here\n"); + fprintf(stderr, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + exit (999); + } + jadr=((unsigned long) iadr & limit); + return ((unsigned) jadr); +} +/*> END <----------------------------------------------------------*/ + diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumptn.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumptn.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumptn.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumptn.c 2007-12-14 21:41:27.000000000 +0000 @@ -0,0 +1,83 @@ +/* + * $Id: jumptn.c,v 1.1.1.1 1996/02/15 17:49:32 mclareni Exp $ + * + * $Log: jumptn.c,v $ + * Revision 1.1.1.1 1996/02/15 17:49:32 mclareni + * Kernlib + * + */ +/*> ROUTINE JUMPTN + CERN PROGLIB# Z043 JUMPTN .VERSION KERNLP64 1.00 060717 + Copy of JUMPTN .VERSION KERNVMI 1.09 940531 + ORIG. 21/04/88 JZ+FCA +C +C- To transfer to the user routine TARGET (say) with 2 parameters +C- two steps are needed : + +C- 1) EXTERNAL TARGET to get the address of TARGET +C- IADR = JUMPAD (TARGET) + +C- 3) CALL JUMPT2 (IADR,par1,par2) to transfer +*/ +#define jumpt0 jumpt0_ +#define jumpt1 jumpt1_ +#define jumpt2 jumpt2_ +#define jumpt3 jumpt3_ +#define jumpt4 jumpt4_ + +extern int jumpad_(); + +static void (*jumpto)(); + +void jumpt0(iadr) + int *iadr; +{ + long func; + func = *iadr + (long)jumpad_; + jumpto = (void(*)()) func; + jumpto(); + return; +} + +void jumpt1(iadr,ipara) + int *iadr; + char *ipara; +{ + long func; + func = *iadr + (long)jumpad_; + jumpto = (void(*)()) func; + jumpto (ipara); + return; +} + +void jumpt2(iadr, ipara, iparb) + int *iadr; + char *ipara, *iparb; +{ + long func; + func = *iadr + (long)jumpad_; + jumpto = (void(*)()) func; + jumpto (ipara, iparb); + return; +} +void jumpt3(iadr, ipara, iparb, iparc) + int *iadr; + char *ipara, *iparb, *iparc; +{ + long func; + func = *iadr + (long)jumpad_; + jumpto = (void(*)()) func; + jumpto (ipara, iparb, iparc); + return; +} +void jumpt4(iadr, ipara, iparb, iparc, ipard) + int *iadr; + char *ipara, *iparb, *iparc, *ipard; +{ + long func; + func = *iadr + (long)jumpad_; + jumpto = (void(*)()) func; + jumpto (ipara, iparb, iparc, ipard); + return; +} +/*> END <----------------------------------------------------------*/ diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumpxn.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumpxn.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumpxn.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/jumpxn.c 2007-12-14 21:41:27.000000000 +0000 @@ -0,0 +1,92 @@ +/* + * $Id: jumpxn.c,v 1.1.1.1 1996/02/15 17:49:32 mclareni Exp $ + * + * $Log: jumpxn.c,v $ + * Revision 1.1.1.1 1996/02/15 17:49:32 mclareni + * Kernlib + * + */ +/*> ROUTINE JUMPXN + CERN PROGLIB# Z043 JUMPXN .VERSION KERNLP64 1.00 060717 + Copy of JUMPXN .VERSION KERNVMI 1.08 930527 + ORIG. 21/04/88 JZ+FCA, adapted 11/05/93 AP+JZ +C +C- To transfer to the user routine TARGET (say) with 2 parameters +C- three steps are needed : +C- Check that relative jump addresses fits into 32 bits + +C- 1) EXTERNAL TARGET to get the address of TARGET +C- IADR = JUMPAD (TARGET) + +C- 2) CALL JUMPST (IADR) to set the tranfer address + +C- 3) CALL JUMPX2 (par1,par2) to transfer +*/ + +#include "stdio.h" +#include + +static void (*tarsub)(); + +/* ---- jumpad --------------------------------------------- */ +int jumpad_(ifun) + char *ifun; +{ + long temp; + + temp = (long)ifun - (long)jumpad_; + if (labs(temp) > 0x3fffffff) { + printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + printf("JUMPAD: address %p exceeds the 32 bit address space\n", temp); + printf("This may result in program crash or incorrect results\n"); + printf("Therefore we will stop here\n"); + printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + exit (999); + } + return (int) temp; +} + +/* ---- jumpst --------------------------------------------- */ +void jumpst_(iadr) + int *iadr; +{ + long true; + + true = (long)jumpad_; + true = true + *iadr; + tarsub = (void (*)())true; +} + +/* ---- jumpxn --------------------------------------------- */ +void jumpx0_() +{ + (*tarsub)(); + return; +} + +void jumpx1_(ipara) + char *ipara; +{ + (*tarsub)(ipara); + return; +} + +void jumpx2_(ipara, iparb) + char *ipara, *iparb; +{ + (*tarsub)(ipara, iparb); + return; +} +void jumpx3_(ipara, iparb, iparc) + char *ipara, *iparb, *iparc; +{ + (*tarsub)(ipara, iparb, iparc); + return; +} +void jumpx4_(ipara, iparb, iparc, ipard) + char *ipara, *iparb, *iparc, *ipard; +{ + (*tarsub)(ipara, iparb, iparc, ipard); + return; +} +/*> END <----------------------------------------------------------*/ diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/locb.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/locb.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/locb.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/locb.c 2007-12-14 21:52:38.000000000 +0000 @@ -0,0 +1,37 @@ +/*> ROUTINE LOCB + CERN PROGLIB# N101 LOCB .VERSION KERNFOR 4.36 930602 +*/ + +unsigned int chkloc(char *address); + +unsigned int locb_(iadr) + char *iadr; +{ + return (chkloc(iadr)); +} + +#include /* for ptrdiff_t, size_t */ +#include /* for fprintf */ +#include /* for exit */ + +int iptrdiff_(iadr1, iadr2) + char * iadr1, * iadr2; +{ + long diff = (long)iadr1 - (long)iadr2; + if (diff < (long)INT32_MIN || diff > (long)INT32_MAX) { + fprintf(stderr, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + fprintf(stderr, "IPTRDIFF: difference of addresses %p and %p\n", iadr1, iadr2); + fprintf(stderr, "cannot be stored in 32-bit signed integer!\n"); + fprintf(stderr, "This may result in program crash or incorrect results\n"); + fprintf(stderr, "Therefore we will stop here\n"); + fprintf(stderr, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + exit (999); + } + else return (int)diff; +} + +int iptrsame_(iadr1, iadr2) + char * iadr1, * iadr2; +{ + return (size_t)iadr1 == (size_t)iadr2 ? 1 : 0; +} diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/locf.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/locf.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/lp64gs/locf.c 1970-01-01 00:00:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/lp64gs/locf.c 2007-12-14 21:41:27.000000000 +0000 @@ -0,0 +1,10 @@ +/*> ROUTINE LOCF + CERN PROGLIB# N100 LOCF .VERSION KERNFOR 4.36 930602 +*/ +unsigned int chkloc(char *address); + +unsigned int locf_(iadr) + char *iadr; +{ + return ( (chkloc(iadr)) >> 2 ); +} diff -urNad cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/signalf.c cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/signalf.c --- cernlib-2006.dfsg.2~/src/packlib/kernlib/kerngen/ccgen/signalf.c 1999-10-06 14:17:01.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kernlib/kerngen/ccgen/signalf.c 2007-12-14 21:41:27.000000000 +0000 @@ -45,6 +45,7 @@ C- function value = adr of previous handler */ #include +typedef void (*sighandler_t)(int); #if defined(CERNLIB_QX_SC) int type_of_call signalf_(signum,funct,flag) #endif @@ -58,7 +59,7 @@ int *funct; { int signo, istat; - int handler; + sighandler_t handler; void *oldhand; signo = *signum; @@ -67,14 +68,15 @@ if (*flag < 0) handler = *funct; #endif #if !defined(CERNLIB_QCCINDAD) - if (*flag < 0) handler = (int)funct; + if (*flag < 0) handler = (sighandler_t)funct; #endif - else if (*flag == 0) handler = (int)SIG_DFL; - else if (*flag == 1) handler = (int)SIG_IGN; - else handler = *flag; + else if (*flag == 0) handler = (sighandler_t)SIG_DFL; + else if (*flag == 1) handler = (sighandler_t)SIG_IGN; + else handler = (sighandler_t)(long)*flag; oldhand = signal(signo,handler); - istat = (int)oldhand; + unsigned long myistat = (unsigned long)oldhand; + istat = (int)myistat; #ifndef __GNUC__ if (oldhand == SIG_ERR) istat = -1; #endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_kuip/kkern.c cernlib-2006.dfsg.2/src/packlib/kuip/code_kuip/kkern.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_kuip/kkern.c 1996-05-01 12:08:38.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_kuip/kkern.c 2007-12-14 21:41:27.000000000 +0000 @@ -39,7 +39,8 @@ if( len >= (sizeof blanks) * 4 ) { /* check single characters until next word boundary */ - switch( (int)&str[len] & ( (sizeof blanks) - 1 ) ) { + /* use type long here to be conform with 64 bit architectures*/ + switch( (long)&str[len] & ( (sizeof blanks) - 1 ) ) { case 7: if( str[--len] != ' ' ) return len + 1; case 6: diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/kmbrow.c cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/kmbrow.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/kmbrow.c 1996-03-08 15:33:08.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/kmbrow.c 2007-12-14 21:41:27.000000000 +0000 @@ -278,7 +278,7 @@ char *path, *title; char cval[MAX_string], cval1[MAX_string]; int i, fitem, fcnt, dcnt, icon_type; - int browser_count = 0; + long browser_count = 0; BrObject *brobj; diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/kuxxt.c cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/kuxxt.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/kuxxt.c 1996-03-08 15:33:11.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/kuxxt.c 2007-12-14 21:41:27.000000000 +0000 @@ -340,7 +340,7 @@ { (void) XDeleteContext( XtDisplay( UxTopLevel ), (Window) wgt, - (XContext) client_data ); + (XContext) (long)client_data ); } /****************************************************************************** @@ -385,7 +385,7 @@ return ( UX_ERROR ); XtAddCallback (wgt, XmNdestroyCallback, - UxDeleteContextCB, (XtPointer) xcontext_id); + UxDeleteContextCB, (XtPointer) (long)xcontext_id); return ( UX_NO_ERROR ); } diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkdcmp.c cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkdcmp.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkdcmp.c 1996-03-15 15:54:00.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkdcmp.c 2007-12-14 21:41:27.000000000 +0000 @@ -1541,7 +1541,11 @@ Widget cpanel = stag->command_panel; KmCommand *cmd = stag->cmd; - int ipar = stag->index; + /* for 64 bit compatibility take long here + * int ipar = stag->index; + */ + long ipar = stag->index; + KmParameter *par = cmd->par[ipar]; KmParFile *pfil = par->ptype; diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkdgra.c cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkdgra.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkdgra.c 1996-03-08 15:33:07.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkdgra.c 2007-12-14 21:41:27.000000000 +0000 @@ -289,11 +289,12 @@ km_graph_init_callbacks (km_graphicsDraw, graph_widget, wkid, 0); } -void km_graph_init_callbacks (draw, graph_widget, wkid, flag) +void km_graph_init_callbacks (draw, graph_widget, mywkid, flag) Widget draw, graph_widget; - int wkid, flag; + int mywkid, flag; { /* Add drawing area expose and resize callbacks */ + long wkid = mywkid; if (flag == 0) { XtAddCallback(draw, XmNexposeCallback, (XtCallbackProc)drawing_area_callback, graph_widget); diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkuip.c cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkuip.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/code_motif/mkuip.c 2007-12-14 21:41:17.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/code_motif/mkuip.c 2007-12-14 21:41:27.000000000 +0000 @@ -1687,7 +1687,7 @@ XmStringFree(xmstr); } /* end for ... */ XtAddCallback (km_listSBox,XmNokCallback, - (XtCallbackProc)kuipList_OK, (XtPointer)flag); + (XtCallbackProc)kuipList_OK, (XtPointer) (long)flag); XtAddCallback (km_listSBox,XmNcancelCallback, (XtCallbackProc)destroy_list_id, NULL); XtAddCallback (km_listSBox,XmNhelpCallback, @@ -1914,7 +1914,7 @@ PdMenu = XmCreatePushButtonGadget (kuipControlShellM,appShell_title[i],arglist,0); XtAddCallback(PdMenu,XmNactivateCallback, - (XtCallbackProc)appShell_activate, (XtPointer)i); + (XtCallbackProc)appShell_activate, (XtPointer) (long)i); XtManageChild(PdMenu); break; } /* end ... if (appShell[i] == NULL) */ @@ -1972,7 +1972,7 @@ PdMenu = XmCreatePushButtonGadget (kuipControlShellM,appShell_title[i],arglist,0); XtAddCallback (PdMenu,XmNactivateCallback, - (XtCallbackProc)appShell_activate, (XtPointer)i); + (XtCallbackProc)appShell_activate, (XtPointer) (long)i); XtManageChild(PdMenu); } } diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/help.c cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/help.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/help.c 1996-03-08 15:33:04.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/help.c 2007-12-14 21:41:27.000000000 +0000 @@ -309,7 +309,7 @@ int *type; XmAnyCallbackStruct *call_data; { - int t = (int)type; + long t = (long)type; if (help[t]) XRaiseWindow(XtDisplay(help[t]), XtWindow(help[t])); diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/kxterm.c cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/kxterm.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/kxterm.c 2005-04-18 15:40:49.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/kxterm.c 2007-12-14 21:41:27.000000000 +0000 @@ -1533,7 +1533,7 @@ XtPointer cbs; { Widget text_w; - int i = (int) item; + unsigned long i = (unsigned long) item; Boolean result = True; text_w = get_selection_owner(widget); diff -urNad cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/uxxt.c cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/uxxt.c --- cernlib-2006.dfsg.2~/src/packlib/kuip/programs/kxterm/uxxt.c 1996-03-08 15:33:04.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/kuip/programs/kxterm/uxxt.c 2007-12-14 21:41:27.000000000 +0000 @@ -340,7 +340,7 @@ { (void) XDeleteContext( XtDisplay( UxTopLevel ), (Window) wgt, - (XContext) client_data ); + (XContext) (long)client_data ); } /****************************************************************************** @@ -385,7 +385,7 @@ return ( UX_ERROR ); XtAddCallback (wgt, XmNdestroyCallback, - UxDeleteContextCB, (XtPointer) xcontext_id); + UxDeleteContextCB, (XtPointer) (long)xcontext_id); return ( UX_NO_ERROR ); } diff -urNad cernlib-2006.dfsg.2~/src/packlib/zbook/code/zerror.F cernlib-2006.dfsg.2/src/packlib/zbook/code/zerror.F --- cernlib-2006.dfsg.2~/src/packlib/zbook/code/zerror.F 1996-03-08 12:01:12.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/zbook/code/zerror.F 2007-12-14 21:41:27.000000000 +0000 @@ -16,6 +16,10 @@ C ****************************************************************** C DIMENSION IZ(1),KEY(1),LAB(6),ID(1) +#if defined(CERNLIB_QMLXIA64) + INTEGER*8 JUMPADR +#endif + C C ------------------------------------------------------------------ C @@ -24,7 +28,7 @@ NEWERR = IERR JZ = IZ(1) IF(IZ(JZ+19).EQ.0) CALL ZUSER(IZ,NEWERR,KEY,ID) -#if (defined(CERNLIB_SINGLE)||defined(CERNLIB_DOUBLE)||defined(CERNLIB_UNIVAC)||defined(CERNLIB_PDP10))&&(!defined(CERNLIB_VAX))&&(!defined(CERNLIB_BESM6)) +#if (defined(CERNLIB_SINGLE)||defined(CERNLIB_DOUBLE)||defined(CERNLIB_UNIVAC)||defined(CERNLIB_PDP10))&&(!defined(CERNLIB_VAX))&&(!defined(CERNLIB_BESM6))&&(!defined(CERNLIB_QMLXIA64)) IF(IZ(JZ+19).NE.0) CALL ZJUMP(IZ(JZ+19),IZ,NEWERR,KEY,ID) #endif #if defined(CERNLIB_VAX) @@ -33,6 +37,13 @@ #if defined(CERNLIB_BESM6) IF(IZ(JZ+19).NE.0) CALL ZJUMP(IZ,NEWERR,KEY,ID,IZ(JZ+19)) #endif +#if defined(CERNLIB_QMLXIA64) + IF(IZ(JZ+19).NE.0) THEN + JUMPADR = IZ(JZ+19) + print '(a,z17)','JUMPADR is:', JUMPADR + CALL JUMPT4(JUMPADR,IZ,NEWERR,KEY,ID) + END IF +#endif C IF (NEWERR.LE.0)RETURN C diff -urNad cernlib-2006.dfsg.2~/src/packlib/zbook/code/zjump.c cernlib-2006.dfsg.2/src/packlib/zbook/code/zjump.c --- cernlib-2006.dfsg.2~/src/packlib/zbook/code/zjump.c 1996-03-08 12:01:12.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/zbook/code/zjump.c 2007-12-14 21:41:27.000000000 +0000 @@ -7,6 +7,9 @@ * */ #include "zbook/pilot_c.h" +#if defined(CERNLIB_QMLXIA64) +static void (*target)(); +#endif #if defined(CERNLIB_UNIX) #if defined(CERNLIB_QX_SC) zjump_(name,p1,p2,p3,p4) @@ -18,8 +21,23 @@ ZJUMP(name,p1,p2,p3,p4) #endif char *p1, *p2, *p3, *p4; + +/* LP64 compatibility: + name is taken from a Fortran array and therefore its address is 32 bit + which has to be converted to a 64 bit address to satisfy void (*) (H. Vogt) */ + +#if defined(CERNLIB_QMLXIA64) +int *name; +{ + long jadr; + jadr = *name; /* convert int to long */ + target = (void (*)())jadr; + (*target)(p1, p2, p3, p4); +} +#else void (**name)(); { (**name)(p1, p2, p3, p4); } #endif +#endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/zbook/code/ztrap.F cernlib-2006.dfsg.2/src/packlib/zbook/code/ztrap.F --- cernlib-2006.dfsg.2~/src/packlib/zbook/code/ztrap.F 1996-03-08 12:01:13.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/zbook/code/ztrap.F 2007-12-14 21:41:27.000000000 +0000 @@ -48,8 +48,10 @@ #if defined(CERNLIB_BESM6) IZ(JZ+19) = LOCF(IUSER) #endif -#if defined(CERNLIB_UNIX) +#if defined(CERNLIB_UNIX) && !defined(CERNLIB_QMLXIA64) IZ(JZ+19) = LOCB(IUSER) +#else + IZ(JZ+19) = JUMPAD(IUSER) #endif END #endif diff -urNad cernlib-2006.dfsg.2~/src/packlib/zebra/test/brztest/btest2.F cernlib-2006.dfsg.2/src/packlib/zebra/test/brztest/btest2.F --- cernlib-2006.dfsg.2~/src/packlib/zebra/test/brztest/btest2.F 1997-09-02 15:16:16.000000000 +0000 +++ cernlib-2006.dfsg.2/src/packlib/zebra/test/brztest/btest2.F 2007-12-14 21:41:27.000000000 +0000 @@ -29,6 +29,15 @@ ******************************************************************************** * COMMON/CRZT/IXSTOR,IXDIV,IFENCE(2),LEV,LEVIN,BLVECT(30000) + +* LP64 compatibility: +* For 64-bit pointer systems put local variables referenced by LOCF +* in a dummy named common block to keep addresses in the program region. +* see also: packlib/ffread/test/main.F (H. Vogt) + +#if defined(CERNLIB_QMLXIA64) + COMMON /TEST64/LBANK +#endif DIMENSION LQ(999),IQ(999),Q(999) EQUIVALENCE (IQ(1),Q(1),LQ(9)),(LQ(1),LEV) C