From 7b104e9ef9c386ce6a175c024d7fae8703a07bcb Mon Sep 17 00:00:00 2001 From: Oli Date: Sun, 28 Nov 2021 22:14:26 -0300 Subject: [PATCH] migrate fortran to c with f2c --- Makefile | 2 +- tools/connec/Makefile | 13 + tools/connec/connec2d.o | Bin 0 -> 33896 bytes tools/connec/connec3d.o | Bin 0 -> 83352 bytes tools/connec/libf2c/Notice | 23 + tools/connec/libf2c/README | 374 +++ tools/connec/libf2c/abort_.c | 22 + tools/connec/libf2c/abort_.o | Bin 0 -> 1568 bytes tools/connec/libf2c/arith.h | 8 + tools/connec/libf2c/arithchk.c | 267 +++ tools/connec/libf2c/backspac.c | 76 + tools/connec/libf2c/backspac.o | Bin 0 -> 3672 bytes tools/connec/libf2c/c_abs.c | 20 + tools/connec/libf2c/c_abs.o | Bin 0 -> 1384 bytes tools/connec/libf2c/c_cos.c | 23 + tools/connec/libf2c/c_cos.o | Bin 0 -> 1800 bytes tools/connec/libf2c/c_div.c | 53 + tools/connec/libf2c/c_div.o | Bin 0 -> 2376 bytes tools/connec/libf2c/c_exp.c | 25 + tools/connec/libf2c/c_exp.o | Bin 0 -> 1536 bytes tools/connec/libf2c/c_log.c | 23 + tools/connec/libf2c/c_log.o | Bin 0 -> 1568 bytes tools/connec/libf2c/c_sin.c | 23 + tools/connec/libf2c/c_sin.o | Bin 0 -> 1608 bytes tools/connec/libf2c/c_sqrt.c | 41 + tools/connec/libf2c/c_sqrt.o | Bin 0 -> 2392 bytes tools/connec/libf2c/cabs.c | 33 + tools/connec/libf2c/cabs.o | Bin 0 -> 1896 bytes tools/connec/libf2c/close.c | 101 + tools/connec/libf2c/close.o | Bin 0 -> 2712 bytes tools/connec/libf2c/comptry.bat | 13 + tools/connec/libf2c/ctype.c | 2 + tools/connec/libf2c/ctype.h | 47 + tools/connec/libf2c/ctype.o | Bin 0 -> 1200 bytes tools/connec/libf2c/d_abs.c | 18 + tools/connec/libf2c/d_abs.o | Bin 0 -> 1616 bytes tools/connec/libf2c/d_acos.c | 19 + tools/connec/libf2c/d_acos.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_asin.c | 19 + tools/connec/libf2c/d_asin.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_atan.c | 19 + tools/connec/libf2c/d_atan.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_atn2.c | 19 + tools/connec/libf2c/d_atn2.o | Bin 0 -> 1376 bytes tools/connec/libf2c/d_cnjg.c | 19 + tools/connec/libf2c/d_cnjg.o | Bin 0 -> 1440 bytes tools/connec/libf2c/d_cos.c | 19 + tools/connec/libf2c/d_cos.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_cosh.c | 19 + tools/connec/libf2c/d_cosh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_dim.c | 16 + tools/connec/libf2c/d_dim.o | Bin 0 -> 1192 bytes tools/connec/libf2c/d_exp.c | 19 + tools/connec/libf2c/d_exp.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_imag.c | 16 + tools/connec/libf2c/d_imag.o | Bin 0 -> 1176 bytes tools/connec/libf2c/d_int.c | 19 + tools/connec/libf2c/d_int.o | Bin 0 -> 2072 bytes tools/connec/libf2c/d_lg10.c | 21 + tools/connec/libf2c/d_lg10.o | Bin 0 -> 1536 bytes tools/connec/libf2c/d_log.c | 19 + tools/connec/libf2c/d_log.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_mod.c | 46 + tools/connec/libf2c/d_mod.o | Bin 0 -> 2088 bytes tools/connec/libf2c/d_nint.c | 20 + tools/connec/libf2c/d_nint.o | Bin 0 -> 2144 bytes tools/connec/libf2c/d_prod.c | 16 + tools/connec/libf2c/d_prod.o | Bin 0 -> 1184 bytes tools/connec/libf2c/d_sign.c | 18 + tools/connec/libf2c/d_sign.o | Bin 0 -> 1680 bytes tools/connec/libf2c/d_sin.c | 19 + tools/connec/libf2c/d_sin.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_sinh.c | 19 + tools/connec/libf2c/d_sinh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_sqrt.c | 19 + tools/connec/libf2c/d_sqrt.o | Bin 0 -> 1392 bytes tools/connec/libf2c/d_tan.c | 19 + tools/connec/libf2c/d_tan.o | Bin 0 -> 1368 bytes tools/connec/libf2c/d_tanh.c | 19 + tools/connec/libf2c/d_tanh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/derf_.c | 18 + tools/connec/libf2c/derf_.o | Bin 0 -> 1376 bytes tools/connec/libf2c/derfc_.c | 20 + tools/connec/libf2c/derfc_.o | Bin 0 -> 1376 bytes tools/connec/libf2c/dfe.c | 151 ++ tools/connec/libf2c/dfe.o | Bin 0 -> 8080 bytes tools/connec/libf2c/dolio.c | 26 + tools/connec/libf2c/dolio.o | Bin 0 -> 1344 bytes tools/connec/libf2c/dtime_.c | 63 + tools/connec/libf2c/dtime_.o | Bin 0 -> 1952 bytes tools/connec/libf2c/due.c | 77 + tools/connec/libf2c/due.o | Bin 0 -> 4976 bytes tools/connec/libf2c/ef1asc_.c | 25 + tools/connec/libf2c/ef1asc_.o | Bin 0 -> 1392 bytes tools/connec/libf2c/ef1cmc_.c | 20 + tools/connec/libf2c/ef1cmc_.o | Bin 0 -> 1384 bytes tools/connec/libf2c/endfile.c | 160 ++ tools/connec/libf2c/endfile.o | Bin 0 -> 3280 bytes tools/connec/libf2c/erf_.c | 22 + tools/connec/libf2c/erf_.o | Bin 0 -> 1368 bytes tools/connec/libf2c/erfc_.c | 22 + tools/connec/libf2c/erfc_.o | Bin 0 -> 1376 bytes tools/connec/libf2c/err.c | 293 +++ tools/connec/libf2c/err.o | Bin 0 -> 9512 bytes tools/connec/libf2c/etime_.c | 57 + tools/connec/libf2c/etime_.o | Bin 0 -> 1712 bytes tools/connec/libf2c/exit_.c | 43 + tools/connec/libf2c/exit_.o | Bin 0 -> 1360 bytes tools/connec/libf2c/f2c.h | 223 ++ tools/connec/libf2c/f2c.h0 | 223 ++ tools/connec/libf2c/f2ch.add | 162 ++ tools/connec/libf2c/f77_aloc.c | 44 + tools/connec/libf2c/f77_aloc.o | Bin 0 -> 1840 bytes tools/connec/libf2c/f77vers.c | 97 + tools/connec/libf2c/f77vers.o | Bin 0 -> 1016 bytes tools/connec/libf2c/fio.h | 141 ++ tools/connec/libf2c/fmt.c | 530 +++++ tools/connec/libf2c/fmt.h | 105 + tools/connec/libf2c/fmt.o | Bin 0 -> 17744 bytes tools/connec/libf2c/fmtlib.c | 51 + tools/connec/libf2c/fmtlib.o | Bin 0 -> 1480 bytes tools/connec/libf2c/fp.h | 28 + tools/connec/libf2c/ftell64_.c | 52 + tools/connec/libf2c/ftell_.c | 52 + tools/connec/libf2c/ftell_.o | Bin 0 -> 2208 bytes tools/connec/libf2c/getarg_.c | 36 + tools/connec/libf2c/getarg_.o | Bin 0 -> 1480 bytes tools/connec/libf2c/getenv_.c | 62 + tools/connec/libf2c/getenv_.o | Bin 0 -> 2160 bytes tools/connec/libf2c/h_abs.c | 18 + tools/connec/libf2c/h_abs.o | Bin 0 -> 1184 bytes tools/connec/libf2c/h_dim.c | 16 + tools/connec/libf2c/h_dim.o | Bin 0 -> 1192 bytes tools/connec/libf2c/h_dnnt.c | 19 + tools/connec/libf2c/h_dnnt.o | Bin 0 -> 2160 bytes tools/connec/libf2c/h_indx.c | 32 + tools/connec/libf2c/h_indx.o | Bin 0 -> 1264 bytes tools/connec/libf2c/h_len.c | 16 + tools/connec/libf2c/h_len.o | Bin 0 -> 1176 bytes tools/connec/libf2c/h_mod.c | 16 + tools/connec/libf2c/h_mod.o | Bin 0 -> 1184 bytes tools/connec/libf2c/h_nint.c | 19 + tools/connec/libf2c/h_nint.o | Bin 0 -> 2264 bytes tools/connec/libf2c/h_sign.c | 18 + tools/connec/libf2c/h_sign.o | Bin 0 -> 1192 bytes tools/connec/libf2c/hl_ge.c | 18 + tools/connec/libf2c/hl_ge.o | Bin 0 -> 1376 bytes tools/connec/libf2c/hl_gt.c | 18 + tools/connec/libf2c/hl_gt.o | Bin 0 -> 1376 bytes tools/connec/libf2c/hl_le.c | 18 + tools/connec/libf2c/hl_le.o | Bin 0 -> 1376 bytes tools/connec/libf2c/hl_lt.c | 18 + tools/connec/libf2c/hl_lt.o | Bin 0 -> 1376 bytes tools/connec/libf2c/i77vers.c | 343 +++ tools/connec/libf2c/i77vers.o | Bin 0 -> 1032 bytes tools/connec/libf2c/i_abs.c | 18 + tools/connec/libf2c/i_abs.o | Bin 0 -> 1192 bytes tools/connec/libf2c/i_dim.c | 16 + tools/connec/libf2c/i_dim.o | Bin 0 -> 1200 bytes tools/connec/libf2c/i_dnnt.c | 19 + tools/connec/libf2c/i_dnnt.o | Bin 0 -> 2160 bytes tools/connec/libf2c/i_indx.c | 32 + tools/connec/libf2c/i_indx.o | Bin 0 -> 1272 bytes tools/connec/libf2c/i_len.c | 16 + tools/connec/libf2c/i_len.o | Bin 0 -> 1176 bytes tools/connec/libf2c/i_mod.c | 16 + tools/connec/libf2c/i_mod.o | Bin 0 -> 1184 bytes tools/connec/libf2c/i_nint.c | 19 + tools/connec/libf2c/i_nint.o | Bin 0 -> 2264 bytes tools/connec/libf2c/i_sign.c | 18 + tools/connec/libf2c/i_sign.o | Bin 0 -> 1200 bytes tools/connec/libf2c/iargc_.c | 17 + tools/connec/libf2c/iargc_.o | Bin 0 -> 1312 bytes tools/connec/libf2c/iio.c | 159 ++ tools/connec/libf2c/iio.o | Bin 0 -> 7616 bytes tools/connec/libf2c/ilnw.c | 83 + tools/connec/libf2c/ilnw.o | Bin 0 -> 3240 bytes tools/connec/libf2c/inquire.c | 117 + tools/connec/libf2c/inquire.o | Bin 0 -> 4224 bytes tools/connec/libf2c/l_ge.c | 18 + tools/connec/libf2c/l_ge.o | Bin 0 -> 1376 bytes tools/connec/libf2c/l_gt.c | 18 + tools/connec/libf2c/l_gt.o | Bin 0 -> 1376 bytes tools/connec/libf2c/l_le.c | 18 + tools/connec/libf2c/l_le.o | Bin 0 -> 1376 bytes tools/connec/libf2c/l_lt.c | 18 + tools/connec/libf2c/l_lt.o | Bin 0 -> 1376 bytes tools/connec/libf2c/lbitbits.c | 68 + tools/connec/libf2c/lbitbits.o | Bin 0 -> 1496 bytes tools/connec/libf2c/lbitshft.c | 17 + tools/connec/libf2c/lbitshft.o | Bin 0 -> 1200 bytes tools/connec/libf2c/libf2c.a | Bin 0 -> 395224 bytes tools/connec/libf2c/libf2c.lbc | 153 ++ tools/connec/libf2c/libf2c.sy | 153 ++ tools/connec/libf2c/libf2c.zip | Bin 0 -> 129107 bytes tools/connec/libf2c/lio.h | 74 + tools/connec/libf2c/lread.c | 806 +++++++ tools/connec/libf2c/lread.o | Bin 0 -> 24832 bytes tools/connec/libf2c/lwrite.c | 314 +++ tools/connec/libf2c/lwrite.o | Bin 0 -> 5560 bytes tools/connec/libf2c/main.c | 148 ++ tools/connec/libf2c/main.o | Bin 0 -> 3192 bytes tools/connec/libf2c/makefile | 219 ++ tools/connec/libf2c/makefile.sy | 190 ++ tools/connec/libf2c/makefile.u | 219 ++ tools/connec/libf2c/makefile.vc | 195 ++ tools/connec/libf2c/makefile.wat | 189 ++ tools/connec/libf2c/math.hvc | 3 + tools/connec/libf2c/mkfile.plan9 | 162 ++ tools/connec/libf2c/open.c | 301 +++ tools/connec/libf2c/open.o | Bin 0 -> 10296 bytes tools/connec/libf2c/pow_ci.c | 26 + tools/connec/libf2c/pow_ci.o | Bin 0 -> 1552 bytes tools/connec/libf2c/pow_dd.c | 19 + tools/connec/libf2c/pow_dd.o | Bin 0 -> 1376 bytes tools/connec/libf2c/pow_di.c | 41 + tools/connec/libf2c/pow_di.o | Bin 0 -> 1496 bytes tools/connec/libf2c/pow_hh.c | 39 + tools/connec/libf2c/pow_hh.o | Bin 0 -> 1264 bytes tools/connec/libf2c/pow_ii.c | 39 + tools/connec/libf2c/pow_ii.o | Bin 0 -> 1256 bytes tools/connec/libf2c/pow_qq.c | 39 + tools/connec/libf2c/pow_ri.c | 41 + tools/connec/libf2c/pow_ri.o | Bin 0 -> 1504 bytes tools/connec/libf2c/pow_zi.c | 60 + tools/connec/libf2c/pow_zi.o | Bin 0 -> 1920 bytes tools/connec/libf2c/pow_zz.c | 29 + tools/connec/libf2c/pow_zz.o | Bin 0 -> 1792 bytes tools/connec/libf2c/qbitbits.c | 72 + tools/connec/libf2c/qbitshft.c | 17 + tools/connec/libf2c/r_abs.c | 18 + tools/connec/libf2c/r_abs.o | Bin 0 -> 1616 bytes tools/connec/libf2c/r_acos.c | 19 + tools/connec/libf2c/r_acos.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_asin.c | 19 + tools/connec/libf2c/r_asin.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_atan.c | 19 + tools/connec/libf2c/r_atan.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_atn2.c | 19 + tools/connec/libf2c/r_atn2.o | Bin 0 -> 1384 bytes tools/connec/libf2c/r_cnjg.c | 18 + tools/connec/libf2c/r_cnjg.o | Bin 0 -> 1440 bytes tools/connec/libf2c/r_cos.c | 19 + tools/connec/libf2c/r_cos.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_cosh.c | 19 + tools/connec/libf2c/r_cosh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_dim.c | 16 + tools/connec/libf2c/r_dim.o | Bin 0 -> 1200 bytes tools/connec/libf2c/r_exp.c | 19 + tools/connec/libf2c/r_exp.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_imag.c | 16 + tools/connec/libf2c/r_imag.o | Bin 0 -> 1184 bytes tools/connec/libf2c/r_int.c | 19 + tools/connec/libf2c/r_int.o | Bin 0 -> 2088 bytes tools/connec/libf2c/r_lg10.c | 21 + tools/connec/libf2c/r_lg10.o | Bin 0 -> 1536 bytes tools/connec/libf2c/r_log.c | 19 + tools/connec/libf2c/r_log.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_mod.c | 46 + tools/connec/libf2c/r_mod.o | Bin 0 -> 2104 bytes tools/connec/libf2c/r_nint.c | 20 + tools/connec/libf2c/r_nint.o | Bin 0 -> 2264 bytes tools/connec/libf2c/r_sign.c | 18 + tools/connec/libf2c/r_sign.o | Bin 0 -> 1720 bytes tools/connec/libf2c/r_sin.c | 19 + tools/connec/libf2c/r_sin.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_sinh.c | 19 + tools/connec/libf2c/r_sinh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_sqrt.c | 19 + tools/connec/libf2c/r_sqrt.o | Bin 0 -> 1400 bytes tools/connec/libf2c/r_tan.c | 19 + tools/connec/libf2c/r_tan.o | Bin 0 -> 1368 bytes tools/connec/libf2c/r_tanh.c | 19 + tools/connec/libf2c/r_tanh.o | Bin 0 -> 1368 bytes tools/connec/libf2c/rawio.h | 41 + tools/connec/libf2c/rdfmt.c | 553 +++++ tools/connec/libf2c/rdfmt.o | Bin 0 -> 9848 bytes tools/connec/libf2c/rewind.c | 30 + tools/connec/libf2c/rewind.o | Bin 0 -> 2200 bytes tools/connec/libf2c/rsfe.c | 91 + tools/connec/libf2c/rsfe.o | Bin 0 -> 5160 bytes tools/connec/libf2c/rsli.c | 109 + tools/connec/libf2c/rsli.o | Bin 0 -> 4152 bytes tools/connec/libf2c/rsne.c | 618 +++++ tools/connec/libf2c/rsne.o | Bin 0 -> 14024 bytes tools/connec/libf2c/s_cat.c | 86 + tools/connec/libf2c/s_cat.o | Bin 0 -> 1960 bytes tools/connec/libf2c/s_cmp.c | 50 + tools/connec/libf2c/s_cmp.o | Bin 0 -> 1392 bytes tools/connec/libf2c/s_copy.c | 57 + tools/connec/libf2c/s_copy.o | Bin 0 -> 1376 bytes tools/connec/libf2c/s_paus.c | 96 + tools/connec/libf2c/s_paus.o | Bin 0 -> 3664 bytes tools/connec/libf2c/s_rnge.c | 32 + tools/connec/libf2c/s_rnge.o | Bin 0 -> 2328 bytes tools/connec/libf2c/s_stop.c | 48 + tools/connec/libf2c/s_stop.o | Bin 0 -> 1952 bytes tools/connec/libf2c/scomptry.bat | 5 + tools/connec/libf2c/sfe.c | 47 + tools/connec/libf2c/sfe.o | Bin 0 -> 2640 bytes tools/connec/libf2c/sig_die.c | 51 + tools/connec/libf2c/sig_die.o | Bin 0 -> 2008 bytes tools/connec/libf2c/signal1.h | 35 + tools/connec/libf2c/signal1.h0 | 35 + tools/connec/libf2c/signal_.c | 21 + tools/connec/libf2c/signal_.o | Bin 0 -> 1376 bytes tools/connec/libf2c/signbit.c | 24 + tools/connec/libf2c/sue.c | 90 + tools/connec/libf2c/sue.o | Bin 0 -> 5688 bytes tools/connec/libf2c/sysdep1.h | 70 + tools/connec/libf2c/sysdep1.h0 | 70 + tools/connec/libf2c/system_.c | 42 + tools/connec/libf2c/system_.o | Bin 0 -> 1960 bytes tools/connec/libf2c/typesize.c | 18 + tools/connec/libf2c/typesize.o | Bin 0 -> 1064 bytes tools/connec/libf2c/uio.c | 75 + tools/connec/libf2c/uio.o | Bin 0 -> 3376 bytes tools/connec/libf2c/uninit.c | 377 +++ tools/connec/libf2c/uninit.o | Bin 0 -> 3176 bytes tools/connec/libf2c/util.c | 57 + tools/connec/libf2c/util.o | Bin 0 -> 1848 bytes tools/connec/libf2c/wref.c | 294 +++ tools/connec/libf2c/wref.o | Bin 0 -> 5184 bytes tools/connec/libf2c/wrtfmt.c | 377 +++ tools/connec/libf2c/wrtfmt.o | Bin 0 -> 10280 bytes tools/connec/libf2c/wsfe.c | 78 + tools/connec/libf2c/wsfe.o | Bin 0 -> 4864 bytes tools/connec/libf2c/wsle.c | 42 + tools/connec/libf2c/wsle.o | Bin 0 -> 2776 bytes tools/connec/libf2c/wsne.c | 32 + tools/connec/libf2c/wsne.o | Bin 0 -> 2536 bytes tools/connec/libf2c/xsum0.out | 182 ++ tools/connec/libf2c/xwsne.c | 77 + tools/connec/libf2c/xwsne.o | Bin 0 -> 2600 bytes tools/connec/libf2c/z_abs.c | 18 + tools/connec/libf2c/z_abs.o | Bin 0 -> 1376 bytes tools/connec/libf2c/z_cos.c | 21 + tools/connec/libf2c/z_cos.o | Bin 0 -> 1768 bytes tools/connec/libf2c/z_div.c | 50 + tools/connec/libf2c/z_div.o | Bin 0 -> 2312 bytes tools/connec/libf2c/z_exp.c | 23 + tools/connec/libf2c/z_exp.o | Bin 0 -> 1512 bytes tools/connec/libf2c/z_log.c | 121 + tools/connec/libf2c/z_log.o | Bin 0 -> 3032 bytes tools/connec/libf2c/z_sin.c | 21 + tools/connec/libf2c/z_sin.o | Bin 0 -> 1584 bytes tools/connec/libf2c/z_sqrt.c | 35 + tools/connec/libf2c/z_sqrt.o | Bin 0 -> 2200 bytes tools/connec/makefile | 9 - tools/connec/src/Notice | 23 + tools/connec/src/README | 186 ++ tools/connec/src/cds.c | 195 ++ tools/connec/src/cds.o | Bin 0 -> 4648 bytes tools/connec/src/changes | 3523 ++++++++++++++++++++++++++++ tools/connec/src/connec2d | Bin 0 -> 67416 bytes tools/connec/src/connec2d.F | 425 ++++ tools/connec/src/connec2d.c | 683 ++++++ tools/connec/src/connec2d.o | Bin 0 -> 33896 bytes tools/connec/src/connec3d | Bin 0 -> 89064 bytes tools/connec/src/connec3d.F | 854 +++++++ tools/connec/src/connec3d.c | 1449 ++++++++++++ tools/connec/src/connec3d.o | Bin 0 -> 83352 bytes tools/connec/src/data.c | 501 ++++ tools/connec/src/data.o | Bin 0 -> 12256 bytes tools/connec/src/defines.h | 300 +++ tools/connec/src/defs.h | 1073 +++++++++ tools/connec/src/equiv.c | 412 ++++ tools/connec/src/equiv.o | Bin 0 -> 5968 bytes tools/connec/src/error.c | 347 +++ tools/connec/src/error.o | Bin 0 -> 8680 bytes tools/connec/src/exec.c | 985 ++++++++ tools/connec/src/exec.o | Bin 0 -> 20960 bytes tools/connec/src/expr.c | 3738 ++++++++++++++++++++++++++++++ tools/connec/src/expr.o | Bin 0 -> 67056 bytes tools/connec/src/f2c | Bin 0 -> 321976 bytes tools/connec/src/f2c.1 | 222 ++ tools/connec/src/f2c.1t | 391 ++++ tools/connec/src/f2c.h | 223 ++ tools/connec/src/format.c | 2626 +++++++++++++++++++++ tools/connec/src/format.h | 12 + tools/connec/src/format.o | Bin 0 -> 56560 bytes tools/connec/src/formatdata.c | 1263 ++++++++++ tools/connec/src/formatdata.o | Bin 0 -> 28984 bytes tools/connec/src/ftypes.h | 78 + tools/connec/src/gram.c | 1957 ++++++++++++++++ tools/connec/src/gram.dcl | 416 ++++ tools/connec/src/gram.exec | 143 ++ tools/connec/src/gram.expr | 146 ++ tools/connec/src/gram.head | 293 +++ tools/connec/src/gram.io | 175 ++ tools/connec/src/gram.o | Bin 0 -> 55936 bytes tools/connec/src/init.c | 526 +++++ tools/connec/src/init.o | Bin 0 -> 20376 bytes tools/connec/src/intr.c | 1087 +++++++++ tools/connec/src/intr.o | Bin 0 -> 15984 bytes tools/connec/src/io.c | 1509 ++++++++++++ tools/connec/src/io.o | Bin 0 -> 37808 bytes tools/connec/src/iob.h | 26 + tools/connec/src/lex.c | 1749 ++++++++++++++ tools/connec/src/lex.o | Bin 0 -> 41944 bytes tools/connec/src/machdefs.h | 31 + tools/connec/src/main.c | 792 +++++++ tools/connec/src/main.o | Bin 0 -> 35440 bytes tools/connec/src/makefile | 116 + tools/connec/src/makefile.u | 116 + tools/connec/src/makefile.vc | 76 + tools/connec/src/malloc.c | 184 ++ tools/connec/src/mem.c | 272 +++ tools/connec/src/mem.o | Bin 0 -> 6320 bytes tools/connec/src/memset.c | 72 + tools/connec/src/misc.c | 1398 +++++++++++ tools/connec/src/misc.o | Bin 0 -> 21064 bytes tools/connec/src/mkfile.plan9 | 107 + tools/connec/src/names.c | 835 +++++++ tools/connec/src/names.h | 19 + tools/connec/src/names.o | Bin 0 -> 29208 bytes tools/connec/src/niceprintf.c | 445 ++++ tools/connec/src/niceprintf.h | 16 + tools/connec/src/niceprintf.o | Bin 0 -> 9224 bytes tools/connec/src/output.c | 1753 ++++++++++++++ tools/connec/src/output.h | 64 + tools/connec/src/output.o | Bin 0 -> 38472 bytes tools/connec/src/p1defs.h | 158 ++ tools/connec/src/p1output.c | 743 ++++++ tools/connec/src/p1output.o | Bin 0 -> 12976 bytes tools/connec/src/parse.h | 47 + tools/connec/src/parse_args.c | 558 +++++ tools/connec/src/parse_args.o | Bin 0 -> 8808 bytes tools/connec/src/pccdefs.h | 64 + tools/connec/src/pread.c | 990 ++++++++ tools/connec/src/pread.o | Bin 0 -> 21904 bytes tools/connec/src/proc.c | 1834 +++++++++++++++ tools/connec/src/proc.o | Bin 0 -> 40464 bytes tools/connec/src/put.c | 458 ++++ tools/connec/src/put.o | Bin 0 -> 7944 bytes tools/connec/src/putpcc.c | 2169 +++++++++++++++++ tools/connec/src/putpcc.o | Bin 0 -> 41448 bytes tools/connec/src/sysdep.c | 697 ++++++ tools/connec/src/sysdep.h | 101 + tools/connec/src/sysdep.hd | 1 + tools/connec/src/sysdep.o | Bin 0 -> 23560 bytes tools/connec/src/sysdeptest.c | 24 + tools/connec/src/tokdefs.h | 100 + tools/connec/src/tokens | 100 + tools/connec/src/usignal.h | 7 + tools/connec/src/vax.c | 585 +++++ tools/connec/src/vax.o | Bin 0 -> 12104 bytes tools/connec/src/version.c | 2 + tools/connec/src/version.o | Bin 0 -> 1072 bytes tools/connec/src/xsum | Bin 0 -> 13088 bytes tools/connec/src/xsum.c | 239 ++ tools/connec/src/xsum.out | 59 + tools/connec/src/xsum0.out | 59 + 453 files changed, 56716 insertions(+), 10 deletions(-) create mode 100644 tools/connec/Makefile create mode 100644 tools/connec/connec2d.o create mode 100644 tools/connec/connec3d.o create mode 100644 tools/connec/libf2c/Notice create mode 100644 tools/connec/libf2c/README create mode 100644 tools/connec/libf2c/abort_.c create mode 100644 tools/connec/libf2c/abort_.o create mode 100644 tools/connec/libf2c/arith.h create mode 100644 tools/connec/libf2c/arithchk.c create mode 100644 tools/connec/libf2c/backspac.c create mode 100644 tools/connec/libf2c/backspac.o create mode 100644 tools/connec/libf2c/c_abs.c create mode 100644 tools/connec/libf2c/c_abs.o create mode 100644 tools/connec/libf2c/c_cos.c create mode 100644 tools/connec/libf2c/c_cos.o create mode 100644 tools/connec/libf2c/c_div.c create mode 100644 tools/connec/libf2c/c_div.o create mode 100644 tools/connec/libf2c/c_exp.c create mode 100644 tools/connec/libf2c/c_exp.o create mode 100644 tools/connec/libf2c/c_log.c create mode 100644 tools/connec/libf2c/c_log.o create mode 100644 tools/connec/libf2c/c_sin.c create mode 100644 tools/connec/libf2c/c_sin.o create mode 100644 tools/connec/libf2c/c_sqrt.c create mode 100644 tools/connec/libf2c/c_sqrt.o create mode 100644 tools/connec/libf2c/cabs.c create mode 100644 tools/connec/libf2c/cabs.o create mode 100644 tools/connec/libf2c/close.c create mode 100644 tools/connec/libf2c/close.o create mode 100755 tools/connec/libf2c/comptry.bat create mode 100644 tools/connec/libf2c/ctype.c create mode 100644 tools/connec/libf2c/ctype.h create mode 100644 tools/connec/libf2c/ctype.o create mode 100644 tools/connec/libf2c/d_abs.c create mode 100644 tools/connec/libf2c/d_abs.o create mode 100644 tools/connec/libf2c/d_acos.c create mode 100644 tools/connec/libf2c/d_acos.o create mode 100644 tools/connec/libf2c/d_asin.c create mode 100644 tools/connec/libf2c/d_asin.o create mode 100644 tools/connec/libf2c/d_atan.c create mode 100644 tools/connec/libf2c/d_atan.o create mode 100644 tools/connec/libf2c/d_atn2.c create mode 100644 tools/connec/libf2c/d_atn2.o create mode 100644 tools/connec/libf2c/d_cnjg.c create mode 100644 tools/connec/libf2c/d_cnjg.o create mode 100644 tools/connec/libf2c/d_cos.c create mode 100644 tools/connec/libf2c/d_cos.o create mode 100644 tools/connec/libf2c/d_cosh.c create mode 100644 tools/connec/libf2c/d_cosh.o create mode 100644 tools/connec/libf2c/d_dim.c create mode 100644 tools/connec/libf2c/d_dim.o create mode 100644 tools/connec/libf2c/d_exp.c create mode 100644 tools/connec/libf2c/d_exp.o create mode 100644 tools/connec/libf2c/d_imag.c create mode 100644 tools/connec/libf2c/d_imag.o create mode 100644 tools/connec/libf2c/d_int.c create mode 100644 tools/connec/libf2c/d_int.o create mode 100644 tools/connec/libf2c/d_lg10.c create mode 100644 tools/connec/libf2c/d_lg10.o create mode 100644 tools/connec/libf2c/d_log.c create mode 100644 tools/connec/libf2c/d_log.o create mode 100644 tools/connec/libf2c/d_mod.c create mode 100644 tools/connec/libf2c/d_mod.o create mode 100644 tools/connec/libf2c/d_nint.c create mode 100644 tools/connec/libf2c/d_nint.o create mode 100644 tools/connec/libf2c/d_prod.c create mode 100644 tools/connec/libf2c/d_prod.o create mode 100644 tools/connec/libf2c/d_sign.c create mode 100644 tools/connec/libf2c/d_sign.o create mode 100644 tools/connec/libf2c/d_sin.c create mode 100644 tools/connec/libf2c/d_sin.o create mode 100644 tools/connec/libf2c/d_sinh.c create mode 100644 tools/connec/libf2c/d_sinh.o create mode 100644 tools/connec/libf2c/d_sqrt.c create mode 100644 tools/connec/libf2c/d_sqrt.o create mode 100644 tools/connec/libf2c/d_tan.c create mode 100644 tools/connec/libf2c/d_tan.o create mode 100644 tools/connec/libf2c/d_tanh.c create mode 100644 tools/connec/libf2c/d_tanh.o create mode 100644 tools/connec/libf2c/derf_.c create mode 100644 tools/connec/libf2c/derf_.o create mode 100644 tools/connec/libf2c/derfc_.c create mode 100644 tools/connec/libf2c/derfc_.o create mode 100644 tools/connec/libf2c/dfe.c create mode 100644 tools/connec/libf2c/dfe.o create mode 100644 tools/connec/libf2c/dolio.c create mode 100644 tools/connec/libf2c/dolio.o create mode 100644 tools/connec/libf2c/dtime_.c create mode 100644 tools/connec/libf2c/dtime_.o create mode 100644 tools/connec/libf2c/due.c create mode 100644 tools/connec/libf2c/due.o create mode 100644 tools/connec/libf2c/ef1asc_.c create mode 100644 tools/connec/libf2c/ef1asc_.o create mode 100644 tools/connec/libf2c/ef1cmc_.c create mode 100644 tools/connec/libf2c/ef1cmc_.o create mode 100644 tools/connec/libf2c/endfile.c create mode 100644 tools/connec/libf2c/endfile.o create mode 100644 tools/connec/libf2c/erf_.c create mode 100644 tools/connec/libf2c/erf_.o create mode 100644 tools/connec/libf2c/erfc_.c create mode 100644 tools/connec/libf2c/erfc_.o create mode 100644 tools/connec/libf2c/err.c create mode 100644 tools/connec/libf2c/err.o create mode 100644 tools/connec/libf2c/etime_.c create mode 100644 tools/connec/libf2c/etime_.o create mode 100644 tools/connec/libf2c/exit_.c create mode 100644 tools/connec/libf2c/exit_.o create mode 100644 tools/connec/libf2c/f2c.h create mode 100644 tools/connec/libf2c/f2c.h0 create mode 100644 tools/connec/libf2c/f2ch.add create mode 100644 tools/connec/libf2c/f77_aloc.c create mode 100644 tools/connec/libf2c/f77_aloc.o create mode 100644 tools/connec/libf2c/f77vers.c create mode 100644 tools/connec/libf2c/f77vers.o create mode 100644 tools/connec/libf2c/fio.h create mode 100644 tools/connec/libf2c/fmt.c create mode 100644 tools/connec/libf2c/fmt.h create mode 100644 tools/connec/libf2c/fmt.o create mode 100644 tools/connec/libf2c/fmtlib.c create mode 100644 tools/connec/libf2c/fmtlib.o create mode 100644 tools/connec/libf2c/fp.h create mode 100644 tools/connec/libf2c/ftell64_.c create mode 100644 tools/connec/libf2c/ftell_.c create mode 100644 tools/connec/libf2c/ftell_.o create mode 100644 tools/connec/libf2c/getarg_.c create mode 100644 tools/connec/libf2c/getarg_.o create mode 100644 tools/connec/libf2c/getenv_.c create mode 100644 tools/connec/libf2c/getenv_.o create mode 100644 tools/connec/libf2c/h_abs.c create mode 100644 tools/connec/libf2c/h_abs.o create mode 100644 tools/connec/libf2c/h_dim.c create mode 100644 tools/connec/libf2c/h_dim.o create mode 100644 tools/connec/libf2c/h_dnnt.c create mode 100644 tools/connec/libf2c/h_dnnt.o create mode 100644 tools/connec/libf2c/h_indx.c create mode 100644 tools/connec/libf2c/h_indx.o create mode 100644 tools/connec/libf2c/h_len.c create mode 100644 tools/connec/libf2c/h_len.o create mode 100644 tools/connec/libf2c/h_mod.c create mode 100644 tools/connec/libf2c/h_mod.o create mode 100644 tools/connec/libf2c/h_nint.c create mode 100644 tools/connec/libf2c/h_nint.o create mode 100644 tools/connec/libf2c/h_sign.c create mode 100644 tools/connec/libf2c/h_sign.o create mode 100644 tools/connec/libf2c/hl_ge.c create mode 100644 tools/connec/libf2c/hl_ge.o create mode 100644 tools/connec/libf2c/hl_gt.c create mode 100644 tools/connec/libf2c/hl_gt.o create mode 100644 tools/connec/libf2c/hl_le.c create mode 100644 tools/connec/libf2c/hl_le.o create mode 100644 tools/connec/libf2c/hl_lt.c create mode 100644 tools/connec/libf2c/hl_lt.o create mode 100644 tools/connec/libf2c/i77vers.c create mode 100644 tools/connec/libf2c/i77vers.o create mode 100644 tools/connec/libf2c/i_abs.c create mode 100644 tools/connec/libf2c/i_abs.o create mode 100644 tools/connec/libf2c/i_dim.c create mode 100644 tools/connec/libf2c/i_dim.o create mode 100644 tools/connec/libf2c/i_dnnt.c create mode 100644 tools/connec/libf2c/i_dnnt.o create mode 100644 tools/connec/libf2c/i_indx.c create mode 100644 tools/connec/libf2c/i_indx.o create mode 100644 tools/connec/libf2c/i_len.c create mode 100644 tools/connec/libf2c/i_len.o create mode 100644 tools/connec/libf2c/i_mod.c create mode 100644 tools/connec/libf2c/i_mod.o create mode 100644 tools/connec/libf2c/i_nint.c create mode 100644 tools/connec/libf2c/i_nint.o create mode 100644 tools/connec/libf2c/i_sign.c create mode 100644 tools/connec/libf2c/i_sign.o create mode 100644 tools/connec/libf2c/iargc_.c create mode 100644 tools/connec/libf2c/iargc_.o create mode 100644 tools/connec/libf2c/iio.c create mode 100644 tools/connec/libf2c/iio.o create mode 100644 tools/connec/libf2c/ilnw.c create mode 100644 tools/connec/libf2c/ilnw.o create mode 100644 tools/connec/libf2c/inquire.c create mode 100644 tools/connec/libf2c/inquire.o create mode 100644 tools/connec/libf2c/l_ge.c create mode 100644 tools/connec/libf2c/l_ge.o create mode 100644 tools/connec/libf2c/l_gt.c create mode 100644 tools/connec/libf2c/l_gt.o create mode 100644 tools/connec/libf2c/l_le.c create mode 100644 tools/connec/libf2c/l_le.o create mode 100644 tools/connec/libf2c/l_lt.c create mode 100644 tools/connec/libf2c/l_lt.o create mode 100644 tools/connec/libf2c/lbitbits.c create mode 100644 tools/connec/libf2c/lbitbits.o create mode 100644 tools/connec/libf2c/lbitshft.c create mode 100644 tools/connec/libf2c/lbitshft.o create mode 100644 tools/connec/libf2c/libf2c.a create mode 100644 tools/connec/libf2c/libf2c.lbc create mode 100644 tools/connec/libf2c/libf2c.sy create mode 100644 tools/connec/libf2c/libf2c.zip create mode 100644 tools/connec/libf2c/lio.h create mode 100644 tools/connec/libf2c/lread.c create mode 100644 tools/connec/libf2c/lread.o create mode 100644 tools/connec/libf2c/lwrite.c create mode 100644 tools/connec/libf2c/lwrite.o create mode 100644 tools/connec/libf2c/main.c create mode 100644 tools/connec/libf2c/main.o create mode 100644 tools/connec/libf2c/makefile create mode 100644 tools/connec/libf2c/makefile.sy create mode 100644 tools/connec/libf2c/makefile.u create mode 100644 tools/connec/libf2c/makefile.vc create mode 100644 tools/connec/libf2c/makefile.wat create mode 100644 tools/connec/libf2c/math.hvc create mode 100644 tools/connec/libf2c/mkfile.plan9 create mode 100644 tools/connec/libf2c/open.c create mode 100644 tools/connec/libf2c/open.o create mode 100644 tools/connec/libf2c/pow_ci.c create mode 100644 tools/connec/libf2c/pow_ci.o create mode 100644 tools/connec/libf2c/pow_dd.c create mode 100644 tools/connec/libf2c/pow_dd.o create mode 100644 tools/connec/libf2c/pow_di.c create mode 100644 tools/connec/libf2c/pow_di.o create mode 100644 tools/connec/libf2c/pow_hh.c create mode 100644 tools/connec/libf2c/pow_hh.o create mode 100644 tools/connec/libf2c/pow_ii.c create mode 100644 tools/connec/libf2c/pow_ii.o create mode 100644 tools/connec/libf2c/pow_qq.c create mode 100644 tools/connec/libf2c/pow_ri.c create mode 100644 tools/connec/libf2c/pow_ri.o create mode 100644 tools/connec/libf2c/pow_zi.c create mode 100644 tools/connec/libf2c/pow_zi.o create mode 100644 tools/connec/libf2c/pow_zz.c create mode 100644 tools/connec/libf2c/pow_zz.o create mode 100644 tools/connec/libf2c/qbitbits.c create mode 100644 tools/connec/libf2c/qbitshft.c create mode 100644 tools/connec/libf2c/r_abs.c create mode 100644 tools/connec/libf2c/r_abs.o create mode 100644 tools/connec/libf2c/r_acos.c create mode 100644 tools/connec/libf2c/r_acos.o create mode 100644 tools/connec/libf2c/r_asin.c create mode 100644 tools/connec/libf2c/r_asin.o create mode 100644 tools/connec/libf2c/r_atan.c create mode 100644 tools/connec/libf2c/r_atan.o create mode 100644 tools/connec/libf2c/r_atn2.c create mode 100644 tools/connec/libf2c/r_atn2.o create mode 100644 tools/connec/libf2c/r_cnjg.c create mode 100644 tools/connec/libf2c/r_cnjg.o create mode 100644 tools/connec/libf2c/r_cos.c create mode 100644 tools/connec/libf2c/r_cos.o create mode 100644 tools/connec/libf2c/r_cosh.c create mode 100644 tools/connec/libf2c/r_cosh.o create mode 100644 tools/connec/libf2c/r_dim.c create mode 100644 tools/connec/libf2c/r_dim.o create mode 100644 tools/connec/libf2c/r_exp.c create mode 100644 tools/connec/libf2c/r_exp.o create mode 100644 tools/connec/libf2c/r_imag.c create mode 100644 tools/connec/libf2c/r_imag.o create mode 100644 tools/connec/libf2c/r_int.c create mode 100644 tools/connec/libf2c/r_int.o create mode 100644 tools/connec/libf2c/r_lg10.c create mode 100644 tools/connec/libf2c/r_lg10.o create mode 100644 tools/connec/libf2c/r_log.c create mode 100644 tools/connec/libf2c/r_log.o create mode 100644 tools/connec/libf2c/r_mod.c create mode 100644 tools/connec/libf2c/r_mod.o create mode 100644 tools/connec/libf2c/r_nint.c create mode 100644 tools/connec/libf2c/r_nint.o create mode 100644 tools/connec/libf2c/r_sign.c create mode 100644 tools/connec/libf2c/r_sign.o create mode 100644 tools/connec/libf2c/r_sin.c create mode 100644 tools/connec/libf2c/r_sin.o create mode 100644 tools/connec/libf2c/r_sinh.c create mode 100644 tools/connec/libf2c/r_sinh.o create mode 100644 tools/connec/libf2c/r_sqrt.c create mode 100644 tools/connec/libf2c/r_sqrt.o create mode 100644 tools/connec/libf2c/r_tan.c create mode 100644 tools/connec/libf2c/r_tan.o create mode 100644 tools/connec/libf2c/r_tanh.c create mode 100644 tools/connec/libf2c/r_tanh.o create mode 100644 tools/connec/libf2c/rawio.h create mode 100644 tools/connec/libf2c/rdfmt.c create mode 100644 tools/connec/libf2c/rdfmt.o create mode 100644 tools/connec/libf2c/rewind.c create mode 100644 tools/connec/libf2c/rewind.o create mode 100644 tools/connec/libf2c/rsfe.c create mode 100644 tools/connec/libf2c/rsfe.o create mode 100644 tools/connec/libf2c/rsli.c create mode 100644 tools/connec/libf2c/rsli.o create mode 100644 tools/connec/libf2c/rsne.c create mode 100644 tools/connec/libf2c/rsne.o create mode 100644 tools/connec/libf2c/s_cat.c create mode 100644 tools/connec/libf2c/s_cat.o create mode 100644 tools/connec/libf2c/s_cmp.c create mode 100644 tools/connec/libf2c/s_cmp.o create mode 100644 tools/connec/libf2c/s_copy.c create mode 100644 tools/connec/libf2c/s_copy.o create mode 100644 tools/connec/libf2c/s_paus.c create mode 100644 tools/connec/libf2c/s_paus.o create mode 100644 tools/connec/libf2c/s_rnge.c create mode 100644 tools/connec/libf2c/s_rnge.o create mode 100644 tools/connec/libf2c/s_stop.c create mode 100644 tools/connec/libf2c/s_stop.o create mode 100644 tools/connec/libf2c/scomptry.bat create mode 100644 tools/connec/libf2c/sfe.c create mode 100644 tools/connec/libf2c/sfe.o create mode 100644 tools/connec/libf2c/sig_die.c create mode 100644 tools/connec/libf2c/sig_die.o create mode 100644 tools/connec/libf2c/signal1.h create mode 100644 tools/connec/libf2c/signal1.h0 create mode 100644 tools/connec/libf2c/signal_.c create mode 100644 tools/connec/libf2c/signal_.o create mode 100644 tools/connec/libf2c/signbit.c create mode 100644 tools/connec/libf2c/sue.c create mode 100644 tools/connec/libf2c/sue.o create mode 100644 tools/connec/libf2c/sysdep1.h create mode 100644 tools/connec/libf2c/sysdep1.h0 create mode 100644 tools/connec/libf2c/system_.c create mode 100644 tools/connec/libf2c/system_.o create mode 100644 tools/connec/libf2c/typesize.c create mode 100644 tools/connec/libf2c/typesize.o create mode 100644 tools/connec/libf2c/uio.c create mode 100644 tools/connec/libf2c/uio.o create mode 100644 tools/connec/libf2c/uninit.c create mode 100644 tools/connec/libf2c/uninit.o create mode 100644 tools/connec/libf2c/util.c create mode 100644 tools/connec/libf2c/util.o create mode 100644 tools/connec/libf2c/wref.c create mode 100644 tools/connec/libf2c/wref.o create mode 100644 tools/connec/libf2c/wrtfmt.c create mode 100644 tools/connec/libf2c/wrtfmt.o create mode 100644 tools/connec/libf2c/wsfe.c create mode 100644 tools/connec/libf2c/wsfe.o create mode 100644 tools/connec/libf2c/wsle.c create mode 100644 tools/connec/libf2c/wsle.o create mode 100644 tools/connec/libf2c/wsne.c create mode 100644 tools/connec/libf2c/wsne.o create mode 100644 tools/connec/libf2c/xsum0.out create mode 100644 tools/connec/libf2c/xwsne.c create mode 100644 tools/connec/libf2c/xwsne.o create mode 100644 tools/connec/libf2c/z_abs.c create mode 100644 tools/connec/libf2c/z_abs.o create mode 100644 tools/connec/libf2c/z_cos.c create mode 100644 tools/connec/libf2c/z_cos.o create mode 100644 tools/connec/libf2c/z_div.c create mode 100644 tools/connec/libf2c/z_div.o create mode 100644 tools/connec/libf2c/z_exp.c create mode 100644 tools/connec/libf2c/z_exp.o create mode 100644 tools/connec/libf2c/z_log.c create mode 100644 tools/connec/libf2c/z_log.o create mode 100644 tools/connec/libf2c/z_sin.c create mode 100644 tools/connec/libf2c/z_sin.o create mode 100644 tools/connec/libf2c/z_sqrt.c create mode 100644 tools/connec/libf2c/z_sqrt.o delete mode 100755 tools/connec/makefile create mode 100644 tools/connec/src/Notice create mode 100644 tools/connec/src/README create mode 100644 tools/connec/src/cds.c create mode 100644 tools/connec/src/cds.o create mode 100644 tools/connec/src/changes create mode 100755 tools/connec/src/connec2d create mode 100644 tools/connec/src/connec2d.F create mode 100644 tools/connec/src/connec2d.c create mode 100644 tools/connec/src/connec2d.o create mode 100755 tools/connec/src/connec3d create mode 100644 tools/connec/src/connec3d.F create mode 100644 tools/connec/src/connec3d.c create mode 100644 tools/connec/src/connec3d.o create mode 100644 tools/connec/src/data.c create mode 100644 tools/connec/src/data.o create mode 100644 tools/connec/src/defines.h create mode 100644 tools/connec/src/defs.h create mode 100644 tools/connec/src/equiv.c create mode 100644 tools/connec/src/equiv.o create mode 100644 tools/connec/src/error.c create mode 100644 tools/connec/src/error.o create mode 100644 tools/connec/src/exec.c create mode 100644 tools/connec/src/exec.o create mode 100644 tools/connec/src/expr.c create mode 100644 tools/connec/src/expr.o create mode 100755 tools/connec/src/f2c create mode 100644 tools/connec/src/f2c.1 create mode 100644 tools/connec/src/f2c.1t create mode 100644 tools/connec/src/f2c.h create mode 100644 tools/connec/src/format.c create mode 100644 tools/connec/src/format.h create mode 100644 tools/connec/src/format.o create mode 100644 tools/connec/src/formatdata.c create mode 100644 tools/connec/src/formatdata.o create mode 100644 tools/connec/src/ftypes.h create mode 100644 tools/connec/src/gram.c create mode 100644 tools/connec/src/gram.dcl create mode 100644 tools/connec/src/gram.exec create mode 100644 tools/connec/src/gram.expr create mode 100644 tools/connec/src/gram.head create mode 100644 tools/connec/src/gram.io create mode 100644 tools/connec/src/gram.o create mode 100644 tools/connec/src/init.c create mode 100644 tools/connec/src/init.o create mode 100644 tools/connec/src/intr.c create mode 100644 tools/connec/src/intr.o create mode 100644 tools/connec/src/io.c create mode 100644 tools/connec/src/io.o create mode 100644 tools/connec/src/iob.h create mode 100644 tools/connec/src/lex.c create mode 100644 tools/connec/src/lex.o create mode 100644 tools/connec/src/machdefs.h create mode 100644 tools/connec/src/main.c create mode 100644 tools/connec/src/main.o create mode 100644 tools/connec/src/makefile create mode 100644 tools/connec/src/makefile.u create mode 100644 tools/connec/src/makefile.vc create mode 100644 tools/connec/src/malloc.c create mode 100644 tools/connec/src/mem.c create mode 100644 tools/connec/src/mem.o create mode 100644 tools/connec/src/memset.c create mode 100644 tools/connec/src/misc.c create mode 100644 tools/connec/src/misc.o create mode 100644 tools/connec/src/mkfile.plan9 create mode 100644 tools/connec/src/names.c create mode 100644 tools/connec/src/names.h create mode 100644 tools/connec/src/names.o create mode 100644 tools/connec/src/niceprintf.c create mode 100644 tools/connec/src/niceprintf.h create mode 100644 tools/connec/src/niceprintf.o create mode 100644 tools/connec/src/output.c create mode 100644 tools/connec/src/output.h create mode 100644 tools/connec/src/output.o create mode 100644 tools/connec/src/p1defs.h create mode 100644 tools/connec/src/p1output.c create mode 100644 tools/connec/src/p1output.o create mode 100644 tools/connec/src/parse.h create mode 100644 tools/connec/src/parse_args.c create mode 100644 tools/connec/src/parse_args.o create mode 100644 tools/connec/src/pccdefs.h create mode 100644 tools/connec/src/pread.c create mode 100644 tools/connec/src/pread.o create mode 100644 tools/connec/src/proc.c create mode 100644 tools/connec/src/proc.o create mode 100644 tools/connec/src/put.c create mode 100644 tools/connec/src/put.o create mode 100644 tools/connec/src/putpcc.c create mode 100644 tools/connec/src/putpcc.o create mode 100644 tools/connec/src/sysdep.c create mode 100644 tools/connec/src/sysdep.h create mode 100644 tools/connec/src/sysdep.hd create mode 100644 tools/connec/src/sysdep.o create mode 100755 tools/connec/src/sysdeptest.c create mode 100644 tools/connec/src/tokdefs.h create mode 100644 tools/connec/src/tokens create mode 100644 tools/connec/src/usignal.h create mode 100644 tools/connec/src/vax.c create mode 100644 tools/connec/src/vax.o create mode 100644 tools/connec/src/version.c create mode 100644 tools/connec/src/version.o create mode 100755 tools/connec/src/xsum create mode 100644 tools/connec/src/xsum.c create mode 100644 tools/connec/src/xsum.out create mode 100644 tools/connec/src/xsum0.out diff --git a/Makefile b/Makefile index bf17567..c8d4063 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ fftma: cd fftma_module/gen && python3 setup.py install --user binaries: - ./script_fortran.sh + cd ./tools/connec && make clean && make all test: binaries cd tests/integration && python3 -m unittest test.py diff --git a/tools/connec/Makefile b/tools/connec/Makefile new file mode 100644 index 0000000..690ac83 --- /dev/null +++ b/tools/connec/Makefile @@ -0,0 +1,13 @@ +all: conec2d conec3d +libf2c.a: + cd libf2c && make +connec2d.o: + gcc ./src/connec2d.c -c -o connec2d.o +connec3d.o: + gcc ./src/connec3d.c -c -o connec3d.o +conec2d: connec2d.o libf2c.a + gcc connec2d.o ./libf2c/libf2c.a -lm -o conec2d +conec3d: connec3d.o libf2c.a + gcc connec3d.o ./libf2c/libf2c.a -lm -o conec3d +clean: + rm -f conec2d conec3d \ No newline at end of file diff --git a/tools/connec/connec2d.o b/tools/connec/connec2d.o new file mode 100644 index 0000000000000000000000000000000000000000..5008f4b6a71c7a53542a0b83833ca191836fe9ca GIT binary patch literal 33896 zcmeI44}4Z-*~ib=L^5Q6WU0&dsX$3!ZexFOpo2Z|497+=42XQ3V+1<31)HH3P6>-> zO1)IRH9qn7(ks+@welazTLb@~hK8>tW<--lX5HhB5)sl54| z=iKLeuJgOD`?~*}^Za2qM9U}lOG)uiQoIRX*Ab}aZEWePU*cCU@zT9P-mKWF7h@|P zYMCEfoi<{mI}uwIJ(S%M+kT2~G}wWz>gItC-Y+k));u{MYaK7UeSUp=^iJL1ClSQ9 zM;{GLeJQ8wRHHE6six2BzEk(F`}@}Dov~Hh16$)_^8j}?*7}~nrdtGo{p!Ho%8vBU zX1h3Idc5LLO8RFb0<7ThUI<$Ip?$PJ?*!YAI--7W^7SL9kd%|8{PZE=D-NY`#s~C} z@exOixOH4IePCH`WHXr$Px9E=CjP21i&YP?d zx9Li;-al@Qu1QS$)xj*+*;}+N{gylA5<3|O`5y1Uy zuHC#U+M>4`85jG@Q|+nG+f#$&lpPGc7@!Bz2M6~C^|rNhU~JVk_)ggw8_<&H1L(YK40bsb;S7D z*Xp!>G5_ZGXK7ELFO~b~7C#eRxBAVaeGoSDx~&GA(~oH1x1dsX1~c3BT=$0%-*peu zFzCg9(5`D9iVUsjNQtcq+M*rVofJhspWgcXn}-jFUsM!rNpJlxG3onCoPNi)6dRkkUk^`(@fD|SRn30Y0X(l6ZpMH93yn`fMdA0TPOx>KKqE?dv*Ie z>T)(jo<6nxtD;HE+0){_&vR3z^~#&grO9I>I9dbU?n6cIPOF}ZZGC=VOpj6?kKOpP zEQGPvSW0Z`-qgezIIth2WSvGs{C?iwdTLh#x;yg6WX9p6j>$c5A3nT)pL--rsJk>J zJ4&&R_NBPRH~p3$niRB7PYirni?OPQtcuOoL%w$lw=AZbrxn{$VnsWf$3Z}G>s04I zSQ)qOb^d#i&DQCOn~QtSxiz^piBl)3HO_zETC+ksWwYrNVZBeV8`jOsk=EW{mfSDn zAprccTRQtZ(5Y*Z+T_;a-UoML+T?~{-`lj}(17%n8_lB?dhDmvV=}cKFw9IXbm-Bh z*A3`}-e(H^6-=)Q5KwHU*9zC8$2i4~-qOUhJBck#OufFe6rK4@QpY8lBMVGepXz`< zseS5t{TTbS*9}hOLhe&CE>A*(ySlay4Gy`lzIN!S_tozili;aff4;eoDthPE>Ob`) zzg5$>PbcC*Au$MgJK{07lWs%r+*(h_p-bn@;riFYINex;C}1Uirx!QOX- z|B=p`|A#)Tq&}4Q5XbOdv0D?V8EmlZ zI{9~|lPD)){jXEvC~q;-SDxtp@59ais7rUR)6g{xPHq~yhQV>Ap?hNd&$TDmr-W{E z$N#RyGbZw>+An|WKIeY;VAuP0dR}CTKJHyTY)DK# zY@=^3S9N^}5R#7g(Ld(@fS8=1FO~6aLGm}r-wsXaEA{qUsH5d5`Lltee-#P69&`1X zl}9@5zM`8N9Q5ylZBM5E>es)M|DHxg@7eK=pX1H{@m_zt@&BV=|4#mTKh}G){Acg~k<}mW zso7plL;a%q#^$EXre#fHP!)?tCYQ~aSrsWStB6L*Dk4Irm&_=c7OjfTaOcXS-n3cn z{KROaB$5@WoZ)uaURGqXt4*q`sEAIgD!Z(#YEGo2qNIGz%(9u0%E^)Gv67k5NS5bi z_r@+eh@)gu)vS{8$YmwvvqB7)4BdtP+*^yrMTY0-)**OJnbs*(tjS5{G4 zHmRh_WzEM~7iK5RxrQajlt`$T98?#dKBIDa<&3Jb%8IU>XLseuPgKau@va|7y?)B1 zN#i0TXIxj2e|^Bn_OMuxq|qu%GVQb z^Lbk0dc^tPYTrrr@*^R?z5QIp75MFNb>A=XCzP)z{+#ko;=lEI*IfnrfAV>n=axdh zApdXs+~r?~9PHoi;+Fhh5|}6Y^9<&AVks{M4e$NQHoKEpQm|uYCMQDSGjwu>?82;$~%ZpR{kjQN}s!NLVhKu zsb1H7kz*fhw$e@xIAdq*Vg3B&#duk;_f-JA5v3iNr^1MY2ac3g+B5zUS!fL6F4QRfr7iIATomtsr0VSiv|Dzl8;QCQl9u^}zS-B9iE` z#d(ni;vQ$*foq+6vUarsy*fvH7v;F7x_y4OYpLut$Q*H6G}fChC-aKD`Tj{2%n?^b zxh{vzIj&Zqjm+`=Xnt~}nME4)Sl^ZU9V^W&D)g?>)VbEj;|}E&cvs0z+cQ=gS5)L( zQ(fmO`R?NS`BH&oVP;NNmIgGoNDf>W)k|ufO+k*=sNyP?nP1p<7gkH4`FUP_y>wK*I?2nH3ktjii<{!vS<>X}BKHJd zRuPYT@hRn%6HChDm6IpWj8?^~N+y;^Kc}Mac5Fpb9KCC;nnd4)r;za#X^1$ zFU3s^B&DxkcmIdXupiU(mnX*o$x2Z!uhSh6t{uPbCwk0F}H#L zOrR@h7yP~u;BNd4!^Q7BJ^riiMZe5#(C@Fe0OTKeJKb>Gu3^Msf0lA?*SUsIHGW5s zPMgMefw8x7<{Nt%C+@AXU&b45<18hPILnN_&3}dAHqKe3vs?YnHTE{n1;$?DELHo( zhTAxsh$GHxjlPX@x#2d>m86rQ$6qk^Hcoj?l!AV*3l2SbPLv|t#<_tw;@o8PZJhsO zxQ+8}(vjz6Dfb(D8|Nd&Uh=utxAwdz47YLqj5y-_h0(WhzG&=a>|%cX&Ty-LfH>yS zp%DGI47YiBmn7H~CaQH1!E*ds(6AZWORn+KMzn6vZPZ%zKcWb-qjJ_QY%Z$B@hlkuIh<2*<@$m5&F-o`mVf^bDn zOPsh5r5kSJJd-%$JV!bAd&F=X=lP_wTjLvT>}{Nd#$MvYdUdhkQWgJFCKE@Tmn!Et zKWgmd+;CsT^DZ}Bs?e_`j(L5Ra@KD!+~(nWqa*F=P`@q4-mX`lGxqWyfZ_Lx#=hL} z+l;-$G+On)X}DC;t_?f>bR~sEWJ{t|U<8!Uyl};D^`wgQnRmAx%;;{dL;Sx`qyts0&a@pDS z>Oo^K^Lmute;+s8w(BY414Z1GXOzp%=6|oTmn!1iZ@ATeojB~@P%b;G|5wB9dX=J| z2gtStn}?ysUh*(b^Kh2oHcoub34P>YgweNgW*Z&xjeaaN-0ELU9C;`W z(JwRH=3$o6k#=>sP0CzjZ`bW=V=r-*`qrMekhq+avdnOaKSNJ^#^~ET2fusnx{qI~ zd0s<0(El27)f=-WITH1-losoSKyZMfAxrGIc9@gonXDHjc^pKiF#!#PIBj<<-h zx8v<%V=q2N2Vr=hGWJo&5YKY5ze4R-5y$*mOMIc)Zy=8R+(8`Qul(3>$y=KQ>&ipQ z<#4jw5a&)~FXuk(HYvLdxB1^g9QU=~C>ITz|9ytr``YV9$ND`;yvdKo^G-Q6s7Swy zeVy_T5^qyJhIoeZam3NyONqnp9OCf%N#gK(6LILQAr765#G!L9ap*iu96G-u4xK*| zhYr4K;e5VtK#(YK=!`a8#=~yu1Xr?^%b{I2#v6N?U-gcpf2+{QN|@__XotG~DKGx6zS2bhu5*^Tyt;hx?4Z_{i|BJ?{162r{*T7q#(B_itMfML%u}7zcROdU@OVg9F5_9+E58Gga;D+7z3(TE z_I}Xl+xBJ}d-1(N$8DbBR==3|Fh3gibGZ=x$%flJOfx#-ccc29O&s&LhWJADyOemT z^5w+woOugztYdA&u`b<3+|75tJVqS$JBi<=?b<~ge)kaHqV_KlZ&&_@5Pm3xA0`g{ z({*5AokX1H5l4Hoi5F`giityK67f2)yd|2lDupKlXK z-r9*H{`-j6X*@eZ_%7nmIY1owPdhyjM1R44C~^3`fH-vWh_~ywiiYrV;?Vynam3R^ z9DZ*g4xKL$FV?($ojB~jO&or=5{KXaBM$pc;?O@t96G7;M{Qj}{@XQgXN2&xi9>$` zal|u`IQ&i{4*Tj5zLYrpt|kusHsa9#4sqygBMzM>h$BD03gIshhu=RFhu`${!?q|A=!WaoFb* zhkgZd=*%JBu6bS*!W)T0|9awxr;RxL-cB6$KM3KQL-^yw5zo&<`0fz?D)GBC4}T&K zeQ#KDzid(aQ;DNpXAp{C48d{{itP zoi9Hn4!_S4ht7+{i&f_h;;{Gpzy8p5UuaVM4C3%RhB)jmA`bnT#G!LJ@pjEyeF$$R z4*eG5h-V#f_}xex_FF>ulf>coCF0OONF4g7$bX=7h3~)bCk~yF#F3xE5PmUn`27fR z#D5iW_-!T*ofhI)pVttF{kMq2@BPH#_b0@m^9$n8`2%t2yh$8+8z_Hn-sB(r4C3%R zf;jw6AP&D}#PQrampF9liNo(r#9`k`9QNNMj(C1V9QHeiL;nTh(D^;_cAck(LwJAv zkDxrxhY&|RImF?2JaNPsBVHVIt2diC^y`R2=TpRC|25)>XCrag-$NYwPZEdDFNhfht6c;nD3VnhfXzd=-fyg@qC#$?AH^A{(Z!u z^C0nd9iLB!@aKp_|3%`6r@#Kk7|!Pq;?T(;UaaGDG;!z`5J#S;5QqK@;?P+_9Qj#6 z9QI!#4*gBUp>r4UcFprcA^a!Aq5lkV#B-21{PvUoVD1X?5Bt+Y_^=Q@oH*jSFofra z@F~PQG!HX~qu)PH9N#Z2CXRkzM!eB)z2|+NIO1;$;kOe<-X0{5JU>eu_Ae2K-?xcF z=Uo{=!04}b&CgjOJVG4$qlhD(81XjE&rISEso%>(cr9`GZ6sc-`Yps^znVDWyq$QP z>TDqn`^Skxe=l+9yh^-X+xu1sPkVoIzd%2oIN}*i9DWOkBhM2{XY5J#M! zBaV35h(rH7#G$i|ICP#Mj(q+qgug%>e*a7ye$&rQ&OiK~O&s|g5yD3khu;F?SWl)9 zhy5Jli1U-g5$Dasp|h4ablQnS=U(E-^Y#$_BysrdBo4oSAr8N3|CXG8-%T7k9mLyp-PjqzcM*sFUgC%+HIkfX z_#H$X`9CX!M~K7kDB{IlP%a{lcq)lQXD)HrUq>AA-%1?z>xe`DZsO4CAl{Drhwxp* zp}&_n;z|90=NH_6;dc=6ME*l~ggE@>5{KW5iI)apc$LJVGnY7Yt|N~4ZzT@%({`48a{;_y3)c(LaBBI1Z=GI8|FWyGOhO&mHm z5=TD2N*wkZh(mu1ap-I(-md+!D}?VM4*mVa5zlEK>bYOuLmd4Q3E}4xhki~7FACvP zi6j15A$(p4UrZeF-$Weaq?I_{kE|n(ak7y(-jCcz9C>(zING&`IQsoH;?Q}MICO>$ z@3|jGh46gh&@Tz$u@F9oIO3Tf!mkeDYl&Cs{N15E%^lnSH}N#tqaXJWM?bzsyj1o7 zLLB|re?(V4Q(d)9e>eDUnRo))@bf$+)XTt9D_0!IJ95 zwF&3PUWvF%rHwiq6GE404S)9vC&bnk`FKKdeTjvxK6_jM)p1XmH0 zZvHO}EU;d{K7xwwi`>4a{O!9TFvwCn$)BVG{*k{5$HYJET-7fN)&B(mx<_-c|ES}r zThlM=^_EGUZDpPc-$xY%Rl)`I>{6Am;6|6-jDBZ&Reaw zk4gLaoAb6LN>wn=Zzd0=+qCpGy)Dt(Pvf^s@>b_B+?=R2O{_i2e>8u|@rjxg2Z?%h zJa2t^@krC3xqH&mi~9?(f+tr%(AJ+($@<2XtZ(@}*SFoTens+q(pLy%7|62{12lI} z-SpzS10&Qpz4*oeXqsL;r@BMdV!vHZonyyUvc63v>$AS+`tNy&U59^ako%tt2bgOI zcsRASI{S@vZM7awX>I=@Y|fJmYnlFFShI`wu=MTvY4{8 zuT9@?eKlRCZA+}f{v1g?gN}PCXVFYdkN>VYF{3e(p1VGc-i)M@oV*3;OM2|{R{@3SPi|U;C#UqofVEBc+xh`c&=NhX$lCv+SxOcL z*ZyAy9ty1egUmxI>rD!9E@IrEtrWAn;^=~MZm<}M?c z5^@S~rjFT>c=hN7Ka!uqpt1CGavp1uA%)}MoQ z23yJXr^bd8SbwS<4yH|okE`VS9voLSHlV=zQ{{kYF|Kec{$Cv90zLEa5QA;`VNdXl+6^g)#o*^wcHyP5Bsma~=Yg(1xNy}F= z&~z`F zIQ@oK>ZKk(&B{5Zjw*+JZWaymhHOcGGB}C7GU45A6jN566i~rss6W<+W&bZ1;oSk%)PR~rbvKNS&nVy++WiJqw zPY)5baZj+S%)Mlgc=K4%4;&8t+)DI>w_MXJizDDY|-xFCA?+Axj=yx3RZi?7ZDV#W9I{yOC{xqJXx{mbNsuMPWy zB$$rs(MKe)2715Rm%EPV*?7TKUEHh zW>1B4N?CtuY)*mo=V0Yj;j4VfoXm$FmANQ$_}Z}ZeEQHwlRV@qd$G@dBPCy~tnjQ! zu0l0?)+F;Vmj|jC&EadqWv}RS4__Ou-bGG&Q9FEXxMII2gOeqDp^2hAd~F!N$y|20 zQbg5Cue{R*8J5bNG901{P08~rv-l@JE2#K|rt&5oSXHjiC0{y|Z;TIL8}@(EG59NR z!7J-#($)0z%%n@6d{p7;CMMXyxU89s%$%#${JED5vI^x)=Np$ozK*zqr(1_x0EP)Qao_R(#`M6<&(}?#x_s&|hgz{D!&zr3mkX*PEAp z|B!x>{La8bfnOvaW*)+Uw9m9-zKt0F*5C$QM5*XEB~}@+xWa+|w~_MRBnE#qY#3am zei5VZ<;po?=s&iTT(1df4E=#9`6TeU$Zcz3* zhB;*aza_9bfv*B4Pu%2TnPQbc)*kvkCe}!rSO@Eum=E}B)x^Yu$n58G=Ebc>$CX@~ zl5a<=bj2}suIb0P%}q`w6Zu7F*9_C+^gm#R;Y{}6L`LycI5~d^6aTGH@=ZXczkha! zj?J>kc5su!0a%4~tn!!Q4pCNRZ`rGLO*iGhq*+$Ub*#q5RW`K_Zd{mJ6+RlvUMY1Q ztFe)l%`iFPsPeZ44m86moLtH}R%4SZn{3}}awoZ8JHIt2Q|5>^AFIXBIx6^a?rNh} zjrR}14-tmrWhwa~LNYey*mZ`LJXULVSjhvm+F>D)3eT)$LN$A4 zB@;TBGYerIcuJX+lDjoq0WqWmN znTl{_4)8-iBa@jPlprazYUP;>(Y&P8&^(hNnwOP>l4p4n6YMniWUatbsc$+edim(k zPt39-9G?MH=Lp}=#H@6lW@7p#=_8d2o=G2~Jk7*BxOpP9Zth7~mHC;BHu(`%&B`+w zqCL>RhxvIhVohdg*Uy@H*qdpZ+^xcQC{oXmQc3(j6u+sY?03A&EAju!|LFcp^q0kt zGgb0sR4nzw%X5G+|0egls`H(hz<&b-4LAm1%7F)<)Ba0z)_QOX5%E7Q@XXWl2sZ!k=fpSvr6j)j|AAM0lfR>5H#}}xW%lJy zB2;HP{QT;q=gC#iYHf$}uU35CzdOI`j(>HZ|L^Yq;r9Q#=kMY1|IZ%(fA{zuX#Hz7 zvURxu7fqftcG8p?(=(>eobKff7|?G(s82ztf9`%G2%{KwD93+09~L%v{cD9g(X_44<6_A4mJ>ly8HL7(W5P;NnP zWXQli14I3Kh5F~`4$KQ>dR|sV>ij=LB^~&v;7wDG8>_0v6gsiURJfm%1xOcfv z^Rm%Uc6lwupV#(+yaCa?!SPlzT6=wS2lweasBb7Y66tqgUN}@R*za}73x?x^l)54D zx)gj-9On)0pEsaS-@JmTpKv%gnj6BP_9+PW>6sh#!-?a}GqZwi`GJ#l47A5tBp=|; zCLicOpkM!f1EPKU6_m}Ati-4m^z0eZ!Nug<&+UPZkNrF~{?GxR-@9kevqG%~T{2_R z^ckTp8J#jR+jp1|znAs1tgacE9a|@;Hq=CK(`FCw(q=YHJGuUmM=kXmY36hJku5sK z|0lOW!}+y(9$U9|zbSr6oR{~H_^adX`mVgkYCF!ZYkPQi6?|50Ux_#QtLtf|9!?r5 z$9>$&9}brKhAIRue}GuH{M|s=z-7O-7yrCec9UDk-%B%oP%np>aNNgjwsLOwY~^TI z`XgJO|08}va>w6VC2qX){aew;edu2t=e4~NT8GCkRlb7wH0344uTdV-i3Od-%102t zUHJ;)_bM+TE?+Pc|NfF1-{Aj=IQRQoE5Xt3v&u&h|C{m^#NSa~LVTCteQ9hV> zRP{r8Xu!`%tskNFIC91+A4UA9$}b~6E6(eBJ(NR#zSd7sj{eG85zmwS{7U%>;(t(H zLi|zXAwBfa?k4CHmp_FWA1~tnfIjgLp|2-M(BA`n;z#)NNyclA_V*~gO;^5v_=(Dw z5^t{jHsUSg+@EjMZU?Pjq4gS**G>6)<^D|%+09d(64DuWhoMh=L!8&~wy95j*n3v_Ys6nx zUP63_^7o0q8|SsX5^DD|t^btj_iBAeKM-sc?^WWT+GgDVKFVJgWZvd$J#v=EYkLY& zthcp2{~IagY_*f4SN7oXzJ6oB1#I!xZvRd*pEm?Fx7iM!tCe56fk(JZM-EunC9pCBf6-^mA)qkvOmN#~CVPRn>+3)0yopRYoc}7lxb`jb+vENnpyCn8=WWQ@- zKPyx2=o7NC{5v_B`bf6i(FU?Q$enC&tZ!MK;O|MhS<-M$2ffo-?sU{U(s+(Lokgyn4yb&dAQp%=C)ssd!yn-S>C94k$*p4q)Hv)4fvr?o*_N$qK-Pm8_-^K=p;hgiw>RTjyBPui`>C; z;_YcKI^@VB+KY~v{+%pMv}2as(L_5+^I6&6xWt%s^=k?XeIK2=dgJ6K$D1HM!c(QW ztPbAgBZYSHMO{ z*0MWzVua6Xm8Zy!U`_V^czWW%})?*Fm$_;zNZ+ylpY zjQ88%sQ)q5<2{lnWc^|Db-BaK`-p{!*2E&nD;B zvWdQUfc`TA{SEqOB<{-VX?zndI`TZ(Av;<269pKrL$e=u?Q9A@;b&r1xqKIMIYY{&uQH_6mnpR-N9_>}jd zvR!Mq^|^pJd@eEi*5^%zTc5X+j{Fx+vi;iBTc7fNLN<*1sKi}wjp5ekW5nU}38Qa) zZZzEbe1>#}>iw;z-um2b>Lt&`>hmqbt5e}cHD3{~S`fP3L<*_sTAK5YuxB6X(|^UhW-#!FMf7tUc*hjU027MdeLg<|H$@J!)?E25=XmN8-1JG zb%xt@b)nI*?aKQt+2qFZ`y70o;o`HI-k0}VvWbSBC(oOD$y0u0d&O|u-@g;bJSj2y zw!iW|Og3rPj$a^*PMc zi_bIE=P1Kv7e2=mhtDa>+2;(ytaEWure1u?=Vr1kGhBAz^G@RMxk5Sn zTxq!Vc|YmM`&rr6n0o8;2~#gV7pu=rhRZH|K1Uorw<%|zuNrQB?jW7zdjBm`Z+(7b z>cuBs7d|&!cHwg`ari_5`>d}|l<6nC?ff6vjx*fqHzkhsv$=A)vB&8dhT9x6jgIuI z#Q%}4lc~3_3*Ah8#IHlUxu#w|n+NY}>Sed1|07$}aNDmTMn}$hp)=g@VTO+;9gOQZ zQ*U3VE;seE8}@%>yV`K;ri-XM=>JZ++*tjGO}*^O zdm-8WWVqGeNF4f`mCKFQj~Q-XXJ00rW_tfMQ*U#A$JEO%-oJckxb^uN@g~wKfBQNg?|{U0c2{nJgoJT@w>?s=^ZxB8jHq2I}&f0p4k=Uk&B zbEliO+soA3<7Z`a#LOuej2@*~?5hTDE^B3?gH?mc7l?fltlxLprlB^?~M+fBXo`JSm4 zk5B6B*GGn1pPv(l&##TX^?8I|*T6hSp7jm4`o|GR{fWvYcB_Ai;WmdeNN0zRS8G#m zbLeF1C5Klvhi-;jpFN2qhkT=NeMU{aSPA<-vR!Pr)xU%|a=6r?Kf!RD!%U+i{VI`0 z{q1T~Z(kpaO}+Sx#H&4T5pj*vyVG#--%RHLu8T>X&G~*)FMi}lwucP2IXq4rIX|Ub z^li?Y47WKvM><2*=QdMseeN*z;_*G55C1gW`rJtzK0h(~*5_VRFMU9swe-5194}VC z9&yZv2Ff{y;|#YsG$ozonnQC_Z*ypC>Lmvp7ukkepE<;lLwBQZb2!)3OCK=b&NtlZ z4vG2G@b$>>PGO8g($rkQ$sT+BB0;uGgB*Ahp6Z!}!|@6eoYG5R*=yG_0L zkssN9Z@A52HF322N270Ze%x@I!v@l6rt|VIrr!E|$<&L-Z}hl$-Eix(ggAV@YxJ$p zU8Y`gM*SYct^Rk!F(2ya^KSfxXs8^=-B8WpcvEk4IL*{c4md7a8E$=^NgVy^ zX!LCkJxslwZ@mq-`US+1!$61rV8d+=ql}L9tHl42ZLF!c$Hf9uFFrfQt37YMsh48~ zel}D6Os#*3cvv~EsKr=zR*8~IP^1!L%$bs=no}~3$4;Yt0 z#4#>oh+|xSMjYd^)Nt$bR^nJcmn-Ky?=sxx`GC=pd`kQu*&a0Yc0FHf>ZOe{;?yoh*2`Do%%k8%E!*dv6#}0iNk+W<>JNqZ*I8t-_qz<{~ZjM zcAM#WWLKkO{mcJcEgSsf`tEs#TmJ)y!~caw-})bFxbtAoy^PnLI$nznxBdMkarE~#qi_3rkExe&*`&waeTG~82Z=Y4!SJ_79s27G zw>dm*bfn!a+U{23;kdd#uZho5UP?To{43%MlpmR%*pV2eU94k`iR1mq>BRB6kV$;8 z>gN(KRz8HdzwX7iNyJe`#2w|4N3#L;da;_x|=IC8k0ICP4M!_Upcq5lAJ=s!jrId5_B z7l@^K8`r_PbD7Fd7eQW^*O|sX?+24_!&bS`CLgHItz)T-8+aw z|3Tu=e}Z^S*O})X{1xJ8_f6utQ%#Np>(#NlTTarkNUgYt83MjZM-A|BOo>_Qy%eTc)) zMa1D}DsklVbK=mynK<3i9`Px;>iDX2QMKGKc5kYpV}t`bB3R0#Np>h#M^1k zU5P_KLL7cZ5J&xZ;;1hs4xh`3!{-{}(0PhD+TBJR`tK8m{%+ziU4Lqy7|av=XyR!1 zc;fJxK^%U16NjGx#GyZoctpo*B5|~PEpg~9CXV{Mh{NYv;_$hZICORpN4p;phyD>K z1#^aeL*g+Vmym=1h&bBKCJvwH5r>~q#NlT$ap=z_4*eU5M|He@O&mJECk~yB#Nl&0 zarpd%ICQ=tj&>U~4dxI1mc*f-MLeeClI!64#L@0R;_x|vIQ+~b4nIqYL;p_V5zYTT z;%N5~;!&;t3vuYbNE|vliNk-blY=?K{|UsQ(}FnK?Mxi{1;n90gm_HHYpjD$A&z#h zBo3d;h{MkV#Np>L;;4@ihkglh)PG1E_1_SO|7Oj~&p(Sebbdk{I{k^m&t=5d>HL{S z9Qn_6@au^~|7POw`CH=fxtaJn_45*O=)XZcto0ueN4sgK1oMPWed4HZN*q3Oh{IsBI_`HZXd`>0~ovVpM=LX{Nb1!k|uOW_c+2G(?h(rHn;_&${arivK|C`>j z;qyKCX-FLUCle1Rp6<0Jj&?f}k7|7{;?O^zICP4L!~b=};r~|R&{;_wI*$;CpRL59 zFMmN@Hspr!`oO_IB@X?)#NqSUP+UH#51;Lc!%tV@(C&6F zh(o8CIQsQl;_$zYIO?Az4*kCqho9ZVq5m!Mn4S+bIL(W1JdVc`hkl4S{In$w|NV%= z&qc(cKbm+rVb7aE9PKV74xMGhQU4p_@VSvVeEy9%>fa>}{V$2bPlMBgIYa*>;xQeU z)()OY9QtPyho4@=;eQ-)_?bZ*`U{Cee;M(Jj@LcJp|grObRH)TpKlO{&(DaX-uq!N zXXrN~4nM7lL%$>On2t->!OtTO{R@c0&q(6%KaV*4EF}*8dx%5-G2*CynmFpW5{I8% z#Nnsz8Nr-U--I~yTM&nz9}|auKJl35KiI(wi5KfU97h~}W)O$}+lj-^J;d9o{vU}K zD}RPK+I@pK+TBGQI{S!2=g1c2=bu3w{(BNfyXO;!{w2iWXEt%@&m$hw@w(Z;mlKEn zZ;8XtgT&!~J8}4VmpJr4B_7uC@>&M-M7vFhquo}-q2GZxbh;CV&S>KBKbtt}7Z8X3 z?Zn|{4RPqNBOcT7iaGep#G(HW;_&kUarkfaqhQYP(~LOuGl@h0Y~m3e$McAz-9qBf zA4eSeGl)ZHIdS-3Lmc%_5r_UZ;_&l6ap>`#c2@!|?eB$sk zkT~>*6A$aSOd^hUXAzHR{X*jK^DE+L_jkmh{}6HLY$uL>eL@`d-w=m>gVw?P;in~W z=w}g+={V*(cs_CH4QHeB$tPBXQ`jBo6(x#G${5cvQ#n72?o;lQ{Hu5{G`H zHo=_Xza??hcO(w|JmT;(j5zc!BOcT7n(5%z5QqNt#Np>=;_&|jaroIn9QrR44{QGa zB#w5!B93-zwGHMRRh`Df(e5e4q2G!)^!pJ1=pD<9%zp3N@ELJ~_h{Jylarg-n zhkifeVbw1rj&{cpk7)gD;_x$%cvS0eCJsL~kuZjw z;pbH1&~HsVrsJFA;5~>#|2*RGa{+Pq{~2-kSx6l9%N+bp2fv><{5ty2ZX#MHLk!J>Rw0n+&_azRUi;2U}Y~mQ- zUl51RuZTnEe~H8AUx-8hMdC5d;VlP$pE&e)6Nk^V%;31d=V`>@ryX(VcOf3u^`tj( z)DIvIKO>04&o#v1XBlzm+)W%h4-to-=ZHi9uf&o6dk+2)ap>p`kxa={R-mn`51Bde4aRT{!Se2mJ)}4ozCUwkWM_N>rZnBZ%G{O`hVIX zkTZOqOB{ZRh@-!gh(muC@raJsLgHxmSHz+7JL0H+f;fD>N*q3S5{J$n;%K*Cmta27 zKaDu_+YyiHxO8*yp2X2^0de@elsNp%Ar3!_h(rH3#G(HO;!z#1$B9Gd&%~kg5909o zC2{yXrfV=~=$u3x?Y1Ef{d0&zzc2Baj>|9yA4MGPP9_eY3y8zdUBuz%e&W!7lz2q* z-%K3szC=8#^=}i0{zt^2Q#U7=Km4Cc9R52HhfXeWv^#(}^v4m0{tV(V9j|!~zL+@L zy_Gn8t|ksY&k%>7SBRtjed5sHM;!G>o)yd)^(PUB|E|R0r!R5nTudA~6Ntl4F>&bs zf;jU3jf3Ay9QtdB!{^h);q#xw;pb!G(EplvSm%Gev&+x<6ynfnMI1gm6Nk@1#Nl%s zap=q>4xNR>;pZ;m(7&HJ#$}y@KTRC^TZzMG332$ue~irMW5;w0<_!Jj#G&7YcvQ#h zEaK3~BMzMliNojR#Mi0*BI3}woj7#@o^sglz z*8FcIj&@fPht6u^sQ(jj`1}WP_}on#^=UnVIYYlOarkLN9QvJz$8=os96UlC`WF(1 zpG%0t|9s-`b0cx+uOtrr)x;xSVp~rfI?oY@&R>bc=hwvHvq7#G-|%{h`ewwT-<~-9 z7UIyqi+D`OYmI|HMjZN26NjIz z#Nq!-;_#CeE4Ply+*{{In&pCj^u`NMyE;_%azIP@dLp?@Lqi2AvdINH6EIP~We zhyIPkq4OAV_i&5Uh{Ml0#G&7p zcudD}n1hcZ4*ki*;b%5+_`jPt{5(J$`WuKt|5f79FCiY)ar~4x^!E~ne%<`?^KVZa z{?8!}KmCbAe#l&MeUdtT(PU6tNmpJ^aArAkq6NjI7h(rGq;$hAIJK|{f zxIX3Qd@6B_V+L`wn?oG>VdCi5c;e{S9O9_IfjIPkLmYk{B@X?K#A7;+FFE+@#G(HV zarpU!IQ*Y*ZZK!~Ih{E4I}?X~F7b$t@A<^h?oi@Ut)D;~?Os6~?OsP5`oAZRemzMX z^)ceme}g#ud_f%g-g&`1V>*rv9sC61&_A6x{In+y|AUCb&j{ksA5T22`CmyK?an72 z(fV76!_QsBqgua)IQ*<5j&?T_hyKUJ(cju?td`$i9sdXQjfg}4bmH)H7IEn35s&Hk z4s!6J#G!vF@x_|YRO0Y|2XXjWNgVa79sE%T-%Nb5`gzI0Uw7~ih@-!sJNRA)uirOe z0OR<+=6nM2u=;F4e2(%?#I-rE2k`}3-=BC?`NhPSDj!cA{k_J)uP2W2x{df^)qj*Y z#yv(HI@^gu=R@M~S-T+75ORio1L85w|5OKWK^*#-#No3$arhig9Dc?UFI7L&9sEk- z@H3xySaZIGIO^{r4*#o&!~a&|@c&QZ(Ah;CI<@)*#|3_x5{G^Z;xWyqlY@674*lN5 z;d2mi_?$r;e&!G_RX>Xy{3hbizt_Rn5Qopd5J$iMK^#7J6NgS(|6u;`)0jB)+YpC- zC*m>9A9DbG(FI7KxI{4kh;pYM35j~EcAddPi#Nq!9;_&|k zari&_{NT7i=S1RYw>5F-=Msm0gm_Hz8S3Cg#L?~~;_x|_IQ%Rp4nMyoUaEc`bnvyr z(eCpO{w8tw|CBg<9yK7CKYX4-9PPFx4*hP#p&um<{X*g~&0(^GUrro;77&M@+lj-^ zgT&$I3F4*dXN!ZsKpcLy6OZa~w39gM_YsHxV+RJu1^!zQhySyPLqDH5^oJ0K{!fWR z|0?1!&1bQL|B^WTtRxOUj}V8S7l^~pcH*V#=UoRcCEiZQarEnQ;?OB3j&^S*4*ds+L;o@2G0bxZe}OpK-A;U&=DC|V{L~*5oX_xc z0`XGybGn1KCJsLxiAU5=m^ge6CJvn<;;5fV9Q|5K9Q|5J96ApXN4uMdLw^Tx=>Lm& zOmq9n!M`PrcI#ab92fXJojClQO&orD5ieCg=R5dd;_x$pIQ(2eJgVdSbK=msi8yrb zBaVJOO&tAtjW~4PBaU{zA`boZ3xhdBzbWyU=GMl+vxuYJZp7hp5OMgKL>zu*5ieCg z#SXrRIQ-l~Jfh=uFLC%>Lp-YW8;C?!=)JAr75k#NlTKap=z>9@Bi5I{2-`p?^1V_Trs(yAl_%7n` zvyXUKkFWX{1@ni`5OL_VC64+W;^^04;^@~z;?TL0ICK^hho5_hLw^xm9DX_yho7GikLvjLBMzO5h(l)rarA2uarA2i zap?Rnap*in9De>r9Qtn)k7;h7Ir!JapxY65szy9LgLV0MjSf#5=VdkOnjZ{Zzm3&_lZO2YvS&Wb zcn9Lp?@k;(`xA%HDa7IDO5&yJXTF0kAr3#c5f5vgzatJm4-t=O{nNyuzm+(2UMG$m z_7O*a8x0SR3+kH_hkhn;_{k>@{ei?|nrD%Nk0TEK8N}gd4srOuhdBJKB3`O~9(V8! z#Nj7KJgnojgE)MCN*p?SiKD)5Vfo|InmGE^oj7uc5QqLS;_x$rIP~Wbk7;g89sE|} z(7&5F{5(J${$C^xKRbw*s-J&3_{YTIr`CvI&hT?A@kpY~JB2uOS`mj%2jb}01;o*> z@x)O-i#YVJCk{V%6Nml-#ABM<6Ar$KIP_m24nNz8!~eI$;iuk6FTUY(wo>)e#KBJ{ z4nJoSho7FrQC~nD^+Slm|5e1{|3>1d{|#~IuO<#ZTZlvdW#Tc-=bsL~lQ{IhAPzs? zCBgjR{|w^rb0+ap^>dbk=Mrz1XwDlz96rYohtJu>;qwOK(7ByBbnYPzo#%+7za_*` z|1ojse@7gCPACfI4E@uI$28Au2hSl6{V;L(=|>#?uOJRT*AXvOKT8~Z8FBde4e_v! z`zqq_`809({2OuTzfBxE9}$O6lTqd8-lGeSI~^+Son{}keA_e$c>pHCb*4-iKV8;PTS8*%8rMI3&< zCJy~Nmj?5XY0ga?{AA+LZ%G_}vWUa~5aRGNig>B|ne5<~6NjJciNnvYiNnwDiAQzZ z*Aj>RCgRY4fjIQPB#!z;$a=H?Zn~pW8(1nHSwtG)EgTd7qr`iIP{wnhkh^O$l+q* zs2@ul`m>3{&rQUk|107#&G`Wbf0#J*pCS%F&k~3K&xpg%H^fWT&r#!oIfJJYho2u3 zho21M5go_w#No3K@u=1hA&z!O5l6d|i9`Pu;>h7X;;3Is9Qw}^ho85JL;oYiNjA*;_!bCaro&=yj1-RcJM;t@H38hSjTHNarm4^JfihC6Nmp5#G_ij znmGLYi8$K*3vuXwL>&3lnh?w%^$m$b|1{$8lS3T(Vd62(KkDEY6Nmm7;)^w(pAv`v z+lj-^J;Y1Z&ngFhggEp!IQSL^f1UVZ_5Y58f9T-*h$EjPCkDq6yn%zCPP|le=t4ZK zKJ$prQ9g)xMEMBf3zSbG9#wuN@ukWa5l8;F6JM2|6zSQeMZuFJr#% zyTtY})rYlyAMrWL>rYPXAm@nk6NqEJ{fM}$V-4*nT&P~S7!>(_cBI}oIcXa zxMbQiFJtQD#GUw~vYX-WWlWe{G;)HMQ8ant#L<)dCrp|=eRM|ef(Y~Z=>4eXhKHrrZYTS9Be0ex7!MBH=^T#$3ocA+jjn~X!7&D*@=QZWG$4y$$zu_J@FM7OLbA8y-6-fH;Q`E#t#f2c.h +On such machines, one can enable INTEGER*8 by uncommenting the typedefs +of longint and ulongint in f2c.h and adjusting them, so they read + typedef long longint; + typedef unsigned long ulongint; +and by compiling libf2c with -DAllow_TYQUAD, as discussed below. + + +Most of the routines in libf2c are support routines for Fortran +intrinsic functions or for operations that f2c chooses not +to do "in line". There are a few exceptions, summarized below -- +functions and subroutines that appear to your program as ordinary +external Fortran routines. + +If you use the REAL valued functions listed below (ERF, ERFC, +DTIME, and ETIME) with "f2c -R", then you need to compile the +corresponding source files with -DREAL=float. To do this, it is +perhaps simplest to add "-DREAL=float" to CFLAGS in the makefile. + +1. CALL ABORT prints a message and causes a core dump. + +2. ERF(r) and DERF(d) and the REAL and DOUBLE PRECISION + error functions (with x REAL and d DOUBLE PRECISION); + DERF must be declared DOUBLE PRECISION in your program. + Both ERF and DERF assume your C library provides the + underlying erf() function (which not all systems do). + +3. ERFC(r) and DERFC(d) are the complementary error functions: + ERFC(r) = 1 - ERF(r) and DERFC(d) = 1.d0 - DERFC(d) + (except that their results may be more accurate than + explicitly evaluating the above formulae would give). + Again, ERFC and r are REAL, and DERFC and d are DOUBLE + PRECISION (and must be declared as such in your program), + and ERFC and DERFC rely on your system's erfc(). + +4. CALL GETARG(n,s), where n is an INTEGER and s is a CHARACTER + variable, sets s to the n-th command-line argument (or to + all blanks if there are fewer than n command-line arguments); + CALL GETARG(0,s) sets s to the name of the program (on systems + that support this feature). See IARGC below. + +5. CALL GETENV(name, value), where name and value are of type + CHARACTER, sets value to the environment value, $name, of + name (or to blanks if $name has not been set). + +6. NARGS = IARGC() sets NARGS to the number of command-line + arguments (an INTEGER value). + +7. CALL SIGNAL(n,func), where n is an INTEGER and func is an + EXTERNAL procedure, arranges for func to be invoked when n + occurs (on systems where this makes sense). + +If your compiler complains about the signal calls in main.c, s_paus.c, +and signal_.c, you may need to adjust signal1.h suitably. See the +comments in signal1.h. + +8. ETIME(ARR) and DTIME(ARR) are REAL functions that return + execution times. ARR is declared REAL ARR(2). The elapsed + user and system CPU times are stored in ARR(1) and ARR(2), + respectively. ETIME returns the total elapsed CPU time, + i.e., ARR(1) + ARR(2). DTIME returns total elapsed CPU + time since the previous call on DTIME. + +9. CALL SYSTEM(cmd), where cmd is of type CHARACTER, passes + cmd to the system's command processor (on systems where + this can be done). + +10. CALL FLUSH flushes all buffers. + +11. FTELL(i) is an INTEGER function that returns the current + offset of Fortran unit i (or -1 if unit i is not open). + +12. CALL FSEEK(i, offset, whence, *errlab) attemps to move + Fortran unit i to the specified offset: absolute offset + if whence = 0; relative to the current offset if whence = 1; + relative to the end of the file if whence = 2. It branches + to label errlab if unit i is not open or if the call + otherwise fails. + +The routines whose objects are makefile.u's $(I77) are for I/O. +The following comments apply to them. + +If your system lacks /usr/include/local.h , +then you should create an appropriate local.h in +this directory. An appropriate local.h may simply +be empty, or it may #define VAX or #define CRAY +(or whatever else you must do to make fp.h work right). +Alternatively, edit fp.h to suite your machine. + +If your system lacks /usr/include/fcntl.h , then you +should simply create an empty fcntl.h in this directory. +If your compiler then complains about creat and open not +having a prototype, compile with OPEN_DECL defined. +On many systems, open and creat are declared in fcntl.h . + +If your system's sprintf does not work the way ANSI C +specifies -- specifically, if it does not return the +number of characters transmitted -- then insert the line + +#define USE_STRLEN + +at the end of fmt.h . This is necessary with +at least some versions of Sun software. +In particular, if you get a warning about an improper +pointer/integer combination in compiling wref.c, then +you need to compile with -DUSE_STRLEN . + +If your system's fopen does not like the ANSI binary +reading and writing modes "rb" and "wb", then you should +compile open.c with NON_ANSI_RW_MODES #defined. + +If you get error messages about references to cf->_ptr +and cf->_base when compiling wrtfmt.c and wsfe.c or to +stderr->_flag when compiling err.c, then insert the line + +#define NON_UNIX_STDIO + +at the beginning of fio.h, and recompile everything (or +at least those modules that contain NON_UNIX_STDIO). + +Unformatted sequential records consist of a length of record +contents, the record contents themselves, and the length of +record contents again (for backspace). Prior to 17 Oct. 1991, +the length was of type int; now it is of type long, but you +can change it back to int by inserting + +#define UIOLEN_int + +at the beginning of fio.h. This affects only sue.c and uio.c . + +If you have a really ancient K&R C compiler that does not understand +void, add -Dvoid=int to the definition of CFLAGS in the makefile. + +On VAX, Cray, or Research Tenth-Edition Unix systems, you may +need to add -DVAX, -DCRAY, or -DV10 (respectively) to CFLAGS +to make fp.h work correctly. Alternatively, you may need to +edit fp.h to suit your machine. + +If your compiler complains about the signal calls in main.c, s_paus.c, +and signal_.c, you may need to adjust signal1.h suitably. See the +comments in signal1.h. + +You may need to supply the following non-ANSI routines: + + fstat(int fileds, struct stat *buf) is similar +to stat(char *name, struct stat *buf), except that +the first argument, fileds, is the file descriptor +returned by open rather than the name of the file. +fstat is used in the system-dependent routine +canseek (in the libf2c source file err.c), which +is supposed to return 1 if it's possible to issue +seeks on the file in question, 0 if it's not; you may +need to suitably modify err.c . On non-UNIX systems, +you can avoid references to fstat and stat by compiling +with NON_UNIX_STDIO defined; in that case, you may need +to supply access(char *Name,0), which is supposed to +return 0 if file Name exists, nonzero otherwise. + + char * mktemp(char *buf) is supposed to replace the +6 trailing X's in buf with a unique number and then +return buf. The idea is to get a unique name for +a temporary file. + +On non-UNIX systems, you may need to change a few other, +e.g.: the form of name computed by mktemp() in endfile.c and +open.c; the use of the open(), close(), and creat() system +calls in endfile.c, err.c, open.c; and the modes in calls on +fopen() and fdopen() (and perhaps the use of fdopen() itself +-- it's supposed to return a FILE* corresponding to a given +an integer file descriptor) in err.c and open.c (component ufmt +of struct unit is 1 for formatted I/O -- text mode on some systems +-- and 0 for unformatted I/O -- binary mode on some systems). +Compiling with -DNON_UNIX_STDIO omits all references to creat() +and almost all references to open() and close(), the exception +being in the function f__isdev() (in open.c). + +If you wish to use translated Fortran that has funny notions +of record length for direct unformatted I/O (i.e., that assumes +RECL= values in OPEN statements are not bytes but rather counts +of some other units -- e.g., 4-character words for VMS), then you +should insert an appropriate #define for url_Adjust at the +beginning of open.c . For VMS Fortran, for example, +#define url_Adjust(x) x *= 4 +would suffice. + +By default, Fortran I/O units 5, 6, and 0 are pre-connected to +stdin, stdout, and stderr, respectively. You can change this +behavior by changing f_init() in err.c to suit your needs. +Note that f2c assumes READ(*... means READ(5... and WRITE(*... +means WRITE(6... . Moreover, an OPEN(n,... statement that does +not specify a file name (and does not specify STATUS='SCRATCH') +assumes FILE='fort.n' . You can change this by editing open.c +and endfile.c suitably. + +Unless you adjust the "#define MXUNIT" line in fio.h, Fortran units +0, 1, ..., 99 are available, i.e., the highest allowed unit number +is MXUNIT - 1. + +Lines protected from compilation by #ifdef Allow_TYQUAD +are for a possible extension to 64-bit integers in which +integer = int = 32 bits and longint = long = 64 bits. + +The makefile does not attempt to compile pow_qq.c, qbitbits.c, +and qbitshft.c, which are meant for use with INTEGER*8. To use +INTEGER*8, you must modify f2c.h to declare longint and ulongint +appropriately; then add $(QINT) to the end of the makefile's +dependency list for libf2c.a (if makefile is a copy of makefile.u; +for the PC makefiles, add pow_qq.obj qbitbits.obj qbitshft.obj +to the library's dependency list and adjust libf2c.lbc or libf2c.sy +accordingly). Also add -DAllow_TYQUAD to the makefile's CFLAGS +assignment. To make longint and ulongint available, it may suffice +to add -DINTEGER_STAR_8 to the CFLAGS assignment. + +Following Fortran 90, s_cat.c and s_copy.c allow the target of a +(character string) assignment to be appear on its right-hand, at +the cost of some extra overhead for all run-time concatenations. +If you prefer the extra efficiency that comes with the Fortran 77 +requirement that the left-hand side of a character assignment not +be involved in the right-hand side, compile s_cat.c and s_copy.c +with -DNO_OVERWRITE . + +Extensions (Feb. 1993) to NAMELIST processing: + 1. Reading a ? instead of &name (the start of a namelist) causes +the namelist being sought to be written to stdout (unit 6); +to omit this feature, compile rsne.c with -DNo_Namelist_Questions. + 2. Reading the wrong namelist name now leads to an error message +and an attempt to skip input until the right namelist name is found; +to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip. + 3. Namelist writes now insert newlines before each variable; to omit +this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines. + 4. (Sept. 1995) When looking for the &name that starts namelist +input, lines whose first non-blank character is something other +than &, $, or ? are treated as comment lines and ignored, unless +rsne.c is compiled with -DNo_Namelist_Comments. + +Nonstandard extension (Feb. 1993) to open: for sequential files, +ACCESS='APPEND' (or access='anything else starting with "A" or "a"') +causes the file to be positioned at end-of-file, so a write will +append to the file. + +Some buggy Fortran programs use unformatted direct I/O to write +an incomplete record and later read more from that record than +they have written. For records other than the last, the unwritten +portion of the record reads as binary zeros. The last record is +a special case: attempting to read more from it than was written +gives end-of-file -- which may help one find a bug. Some other +Fortran I/O libraries treat the last record no differently than +others and thus give no help in finding the bug of reading more +than was written. If you wish to have this behavior, compile +uio.c with -DPad_UDread . + +If you want to be able to catch write failures (e.g., due to a +disk being full) with an ERR= specifier, compile dfe.c, due.c, +sfe.c, sue.c, and wsle.c with -DALWAYS_FLUSH. This will lead to +slower execution and more I/O, but should make ERR= work as +expected, provided fflush returns an error return when its +physical write fails. + +Carriage controls are meant to be interpreted by the UNIX col +program (or a similar program). Sometimes it's convenient to use +only ' ' as the carriage control character (normal single spacing). +If you compile lwrite.c and wsfe.c with -DOMIT_BLANK_CC, formatted +external output lines will have an initial ' ' quietly omitted, +making use of the col program unnecessary with output that only +has ' ' for carriage control. + +The Fortran 77 Standard leaves it up to the implementation whether +formatted writes of floating-point numbers of absolute value < 1 have +a zero before the decimal point. By default, libI77 omits such +superfluous zeros, but you can cause them to appear by compiling +lwrite.c, wref.c, and wrtfmt.c with -DWANT_LEAD_0 . + +If your (Unix) system lacks a ranlib command, you don't need it. +Either comment out the makefile's ranlib invocation, or install +a harmless "ranlib" command somewhere in your PATH, such as the +one-line shell script + + exit 0 + +or (on some systems) + + exec /usr/bin/ar lts $1 >/dev/null + +By default, the routines that implement complex and double complex +division, c_div.c and z_div.c, call sig_die to print an error message +and exit if they see a divisor of 0, as this is sometimes helpful for +debugging. On systems with IEEE arithmetic, compiling c_div.c and +z_div.c with -DIEEE_COMPLEX_DIVIDE causes them instead to set both +the real and imaginary parts of the result to +INFINITY if the +numerator is nonzero, or to NaN if it vanishes. + +Nowadays most Unix and Linux systems have function + int ftruncate(int fildes, off_t len); +defined in system header file unistd.h that adjusts the length of file +descriptor fildes to length len. Unless endfile.c is compiled with +-DNO_TRUNCATE, endfile.c #includes "unistd.h" and calls ftruncate() if +necessary to shorten files. If your system lacks ftruncate(), compile +endfile.c with -DNO_TRUNCATE to make endfile.c use the older and more +portable scheme of shortening a file by copying to a temporary file +and back again. + +The initializations for "f2c -trapuv" are done by _uninit_f2c(), +whose source is uninit.c, introduced June 2001. On IEEE-arithmetic +systems, _uninit_f2c should initialize floating-point variables to +signaling NaNs and, at its first invocation, should enable the +invalid operation exception. Alas, the rules for distinguishing +signaling from quiet NaNs were not specified in the IEEE P754 standard, +nor were the precise means of enabling and disabling IEEE-arithmetic +exceptions, and these details are thus system dependent. There are +#ifdef's in uninit.c that specify them for some popular systems. If +yours is not one of these systems, it may take some detective work to +discover the appropriate details for your system. Sometimes it helps +to look in the standard include directories for header files with +relevant-sounding names, such as ieeefp.h, nan.h, or trap.h, and +it may be simplest to run experiments to see what distinguishes a +signaling from a quiet NaN. (If x is initialized to a signaling +NaN and the invalid operation exception is masked off, as it should +be by default on IEEE-arithmetic systems, then computing, say, +y = x + 1 will yield a quiet NaN.) diff --git a/tools/connec/libf2c/abort_.c b/tools/connec/libf2c/abort_.c new file mode 100644 index 0000000..92c841a --- /dev/null +++ b/tools/connec/libf2c/abort_.c @@ -0,0 +1,22 @@ +#include "stdio.h" +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern VOID sig_die(); + +int abort_() +#else +extern void sig_die(const char*,int); + +int abort_(void) +#endif +{ +sig_die("Fortran abort routine called", 1); +return 0; /* not reached */ +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/abort_.o b/tools/connec/libf2c/abort_.o new file mode 100644 index 0000000000000000000000000000000000000000..75d719bfe2b4d0588bad7f37391969c86b3ef69c GIT binary patch literal 1568 zcmbVL&1(};5T9+tMvWm#g+dkgB!1AxMlCG`C2g7yWHF#Eh?ngqSxqq6h20m39#rUA z@K5pR$&3CKo_h4)pCIVW?o6}YY&>+9eKYf$nKvKry$=n$xnvk1WWZyXX@UYAFU{my zEY{#Ml%Rd|yZDU)+MgZ~{EL>aw6u?Y6u&ovP=~H>x?L2^Fqr6}@0mS!H1hi71S|0h zV7z+<#jJcxd_mz*SF2v2i=LUC+4QwP}cf`Nvu`hSGSb) z@J@nq?EhFHw^M)uetA@Yb9pd&pI?A4FTk;n94f$tIW#$o`Fbd0WzHL*jM&vwU-9e^ zySBg|lwG$V8oqY=Ll5F(a=>ZXo!uSV=`@?q8~e`w&aT~Xl4PZX0bK{`;?LiNt}sp$ zqAmnC87Kc!_ew=?$J*_JigcLpfk>e@a+UU`8dMncUG0)jRaH?Xi#Kpyh3?n`MK(~~ zC<4_B#$(UN2tUxCYCSzzkF?u+!`aWyOs+e7!ZqGf=F95o9uZu_pJr0SKTQ_DCyT+0 z$Z0-uGgcYD#rS>Jh4FE~4FQF_PBN!E@&3q? +#include /* possibly for ssize_t */ +#include +#include +#include /* another possible place for ssize_t */ + +#ifdef NO_FPINIT +#define fpinit_ASL() +#else +#ifndef KR_headers +extern +#ifdef __cplusplus + "C" +#endif + void fpinit_ASL(void); +#endif /*KR_headers*/ +#endif /*NO_FPINIT*/ + + static int dalign; + typedef struct +Akind { + char *name; + int kind; + } Akind; + + static Akind +IEEE_8087 = { "IEEE_8087", 1 }, +IEEE_MC68k = { "IEEE_MC68k", 2 }, +IBM = { "IBM", 3 }, +VAX = { "VAX", 4 }, +CRAY = { "CRAY", 5}; + + static double t_nan; + + static Akind * +Lcheck(void) +{ + union { + double d; + long L[2]; + } u; + struct { + double d; + long L; + } x[2]; + + if (sizeof(x) > 2*(sizeof(double) + sizeof(long))) + dalign = 1; + u.L[0] = u.L[1] = 0; + u.d = 1e13; + if (u.L[0] == 1117925532 && u.L[1] == -448790528) + return &IEEE_MC68k; + if (u.L[1] == 1117925532 && u.L[0] == -448790528) + return &IEEE_8087; + if (u.L[0] == -2065213935 && u.L[1] == 10752) + return &VAX; + if (u.L[0] == 1267827943 && u.L[1] == 704643072) + return &IBM; + return 0; + } + + static Akind * +icheck(void) +{ + union { + double d; + int L[2]; + } u; + struct { + double d; + int L; + } x[2]; + + if (sizeof(x) > 2*(sizeof(double) + sizeof(int))) + dalign = 1; + u.L[0] = u.L[1] = 0; + u.d = 1e13; + if (u.L[0] == 1117925532 && u.L[1] == -448790528) + return &IEEE_MC68k; + if (u.L[1] == 1117925532 && u.L[0] == -448790528) + return &IEEE_8087; + if (u.L[0] == -2065213935 && u.L[1] == 10752) + return &VAX; + if (u.L[0] == 1267827943 && u.L[1] == 704643072) + return &IBM; + return 0; + } + +char *emptyfmt = ""; /* avoid possible warning message with printf("") */ + + static Akind * +ccheck(void) +{ + union { + double d; + long L; + } u; + long Cray1; + + /* Cray1 = 4617762693716115456 -- without overflow on non-Crays */ + Cray1 = printf(emptyfmt) < 0 ? 0 : 4617762; + if (printf(emptyfmt, Cray1) >= 0) + Cray1 = 1000000*Cray1 + 693716; + if (printf(emptyfmt, Cray1) >= 0) + Cray1 = 1000000*Cray1 + 115456; + u.d = 1e13; + if (u.L == Cray1) + return &CRAY; + return 0; + } + + static int +fzcheck(void) +{ + double a, b; + int i; + + a = 1.; + b = .1; + for(i = 155;; b *= b, i >>= 1) { + if (i & 1) { + a *= b; + if (i == 1) + break; + } + } + b = a * a; + return b == 0.; + } + + static int +need_nancheck(void) +{ + double t; + + errno = 0; + t = log(t_nan); + if (errno == 0) + return 1; + errno = 0; + t = sqrt(t_nan); + return errno == 0; + } + + void +get_nanbits(unsigned int *b, int k) +{ + union { double d; unsigned int z[2]; } u, u1, u2; + + k = 2 - k; + u1.z[k] = u2.z[k] = 0x7ff00000; + u1.z[1-k] = u2.z[1-k] = 0; + u.d = u1.d - u2.d; /* Infinity - Infinity */ + b[0] = u.z[0]; + b[1] = u.z[1]; + } + + int +main(void) +{ + FILE *f; + Akind *a = 0; + int Ldef = 0; + size_t sa, sb; + unsigned int nanbits[2]; + + fpinit_ASL(); +#ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */ + f = fopen("arith.h", "w"); + if (!f) { + printf("Cannot open arith.h\n"); + return 1; + } +#else + f = stdout; +#endif + + if (sizeof(double) == 2*sizeof(long)) + a = Lcheck(); + else if (sizeof(double) == 2*sizeof(int)) { + Ldef = 1; + a = icheck(); + } + else if (sizeof(double) == sizeof(long)) + a = ccheck(); + if (a) { + fprintf(f, "#define %s\n#define Arith_Kind_ASL %d\n", + a->name, a->kind); + if (Ldef) + fprintf(f, "#define Long int\n#define Intcast (int)(long)\n"); + if (dalign) + fprintf(f, "#define Double_Align\n"); + if (sizeof(char*) == 8) + fprintf(f, "#define X64_bit_pointers\n"); +#ifndef NO_LONG_LONG + if (sizeof(long long) > sizeof(long) + && sizeof(long long) == sizeof(void*)) + fprintf(f, "#define LONG_LONG_POINTERS\n"); + if (sizeof(long long) < 8) +#endif + fprintf(f, "#define NO_LONG_LONG\n"); +#ifdef NO_SSIZE_T /*{{*/ + if (sizeof(size_t) == sizeof(long)) + fprintf(f, "#define ssize_t long\n"); + else if (sizeof(size_t) == sizeof(int)) + fprintf(f, "#define ssize_t int\n"); +#ifndef NO_LONG_LONG + else if (sizeof(size_t) == sizeof(long long)) + fprintf(f, "#define ssize_t long long\n"); +#endif + else + fprintf(f, "#define ssize_t signed size_t\n"); /* punt */ +#else /*}{*/ + if (sizeof(size_t) != sizeof(ssize_t)) + fprintf(f, "/* sizeof(size_t) = %d but sizeof(ssize_t) = %d */\n", + (int)sizeof(size_t), (int)sizeof(ssize_t)); +#endif /*}}*/ + if (a->kind <= 2) { + if (fzcheck()) + fprintf(f, "#define Sudden_Underflow\n"); + t_nan = -a->kind; + if (need_nancheck()) + fprintf(f, "#define NANCHECK\n"); + if (sizeof(double) == 2*sizeof(unsigned int)) { + get_nanbits(nanbits, a->kind); + fprintf(f, "#define QNaN0 0x%x\n", nanbits[0]); + fprintf(f, "#define QNaN1 0x%x\n", nanbits[1]); + } + } + return 0; + } + fprintf(f, "/* Unknown arithmetic */\n"); + return 1; + } + +#ifdef __sun +#ifdef __i386 +/* kludge for Intel Solaris */ +void fpsetprec(int x) { } +#endif +#endif diff --git a/tools/connec/libf2c/backspac.c b/tools/connec/libf2c/backspac.c new file mode 100644 index 0000000..908a618 --- /dev/null +++ b/tools/connec/libf2c/backspac.c @@ -0,0 +1,76 @@ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef KR_headers +integer f_back(a) alist *a; +#else +integer f_back(alist *a) +#endif +{ unit *b; + OFF_T v, w, x, y, z; + uiolen n; + FILE *f; + + f__curunit = b = &f__units[a->aunit]; /* curunit for error messages */ + if(a->aunit >= MXUNIT || a->aunit < 0) + err(a->aerr,101,"backspace") + if(b->useek==0) err(a->aerr,106,"backspace") + if(b->ufd == NULL) { + fk_open(1, 1, a->aunit); + return(0); + } + if(b->uend==1) + { b->uend=0; + return(0); + } + if(b->uwrt) { + t_runc(a); + if (f__nowreading(b)) + err(a->aerr,errno,"backspace") + } + f = b->ufd; /* may have changed in t_runc() */ + if(b->url>0) + { + x=FTELL(f); + y = x % b->url; + if(y == 0) x--; + x /= b->url; + x *= b->url; + (void) FSEEK(f,x,SEEK_SET); + return(0); + } + + if(b->ufmt==0) + { FSEEK(f,-(OFF_T)sizeof(uiolen),SEEK_CUR); + fread((char *)&n,sizeof(uiolen),1,f); + FSEEK(f,-(OFF_T)n-2*sizeof(uiolen),SEEK_CUR); + return(0); + } + w = x = FTELL(f); + z = 0; + loop: + while(x) { + x -= x < 64 ? x : 64; + FSEEK(f,x,SEEK_SET); + for(y = x; y < w; y++) { + if (getc(f) != '\n') + continue; + v = FTELL(f); + if (v == w) { + if (z) + goto break2; + goto loop; + } + z = v; + } + err(a->aerr,(EOF),"backspace") + } + break2: + FSEEK(f, z, SEEK_SET); + return 0; +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/backspac.o b/tools/connec/libf2c/backspac.o new file mode 100644 index 0000000000000000000000000000000000000000..4dd33c5c3b3a81f63795f2ee91041e1097677d33 GIT binary patch literal 3672 zcmbuBT})e59KcWctOzX@H=Zs_NO^p7@z2}_Y z|MPs@Q(o%|bQjrdgo}+FA=@KP38}kxyYDr+UQ$IWiS&$gLK>0=hmKS2=Q^tYIYJjo zcDuoX>YWYt=4HANv(t3vhlHjFyWmxd&Vh78HlXjuF4ZYh6#JujV-UXbJ~G<^V_meAaAHyqbjcBG`*Y}Q4REk>pq zmgzQ_7!=UWX1zA&{Hm3b5@+g4L1nrm8(45@ z)Ahu8{#ro`n1dS<*TN13^y@~Metm_emYwrKV19kouWfl3z2NM3_OJT)u3myJ*xusi zeeE00b5n-@hO~srwO$xe{l;Zz$P&KH=^MJUTR8nv?9)tV){C7*e65`ZjbX?mV-ap# zE$uK-s|*zlk+n8%#};^@%}}jh<9<~CeCHyD)NDP~uhMtvA6rzrW24&lP$L^VKfcMP zWiEkP(AS%}+$AiZW>#-Q9ozA*2lO8d&1E~N&B`*XH?h|Jtqq2T8=Il#Ayi)~=S;l; z_I;^a&eTPiMW4RG(*F8S^C2*&+KSEJ{)_rBS82B^k~jFk-@c-LZ~kG?6$H4B@di1x}q%5wV! z+*siCOg9Ce5Aivw&lmX|b?1tG4p+Lw=WxGSDmj{7FOwW?T6w4AXwhheqYa4UaDxR{ zf``vxm*4{E>F7A*at{qBqiWK1&~w1k)Yy_VM$NA_w|Sac_nMUDvucV9-Y|p|!(SmO zCMAV1SeIGwatm&^;P>p{c#yE7e8G&>`4GlV3+}Su`z`om7W}XUmn?X%1wU=UU$Wpc zz-xs4GR_dNISYH;g1>FSi6_v}M8c{PiNqdnC9<4Q;b_aDu?aaG9FLH&EQgZuWOQ65 zstj$2$o>I&R8d1D99M!PXb=vn!3dFi0s}rNAP;nRAMYBJ2PI#iONM|-JRXh7kyt3G zj>n=TJR!%8lxrPt~?eP?Ho<<0Q_IQRkzlabdKd*5?0nd;Bm0`Uz{R7w1)F z9{e47_gU~B3qEeaUtt{U!LN?b_XB}HAnIJto8v*MCm17uVrE3;wCV9m2f66u21Yjs>q}R~@cT zl@R9O6fL#xKkc8vGp zN+jq}m1&iD;;|996ws#G(+oq@C}VOs9-LH&2X(|VoJbH)C^k8%M8P8(Qx#87|4^fG z0hzh}$J+(ISa<#}louEZzemkc-W&n$f(Q4)3y&x+_R}`a)(zJT^YCA`I%d3waejX> zOgens#*WKf)2qyX#UyRuVk0?C3bCx7iR&PnF)W=j0+ n!S6DE{gCC)9T1sg2l9O!2*T^;2*2q<{-3b@8{>wo&G-Ks|1|j^ literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/c_abs.c b/tools/connec/libf2c/c_abs.c new file mode 100644 index 0000000..858f2c8 --- /dev/null +++ b/tools/connec/libf2c/c_abs.c @@ -0,0 +1,20 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern double f__cabs(); + +double c_abs(z) complex *z; +#else +extern double f__cabs(double, double); + +double c_abs(complex *z) +#endif +{ +return( f__cabs( z->r, z->i ) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_abs.o b/tools/connec/libf2c/c_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..ba7f7aca48d2cd17785014e86e286aa644b4fbf8 GIT binary patch literal 1384 zcmb_b%}N6?5T0$-u0Pl+B0>dwQT(ByMMY7Nwc1vpSn%gyFYC5$DQGKnw@^Lkp)cU0 zc=jad#W(N~JO~P21)bR@8pG;A{FY>9zRYBjne0V6mkDSZ2xzbZUzT72DuFNE@Kgi( zpcgh;PkK50eDfMEgizk2%y&GJ!$#{)zl9;s7eG7P2CW&A!fluff_6&)yi, zr = z->r; + r->r = cos(zr) * cosh(zi); + r->i = - sin(zr) * sinh(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_cos.o b/tools/connec/libf2c/c_cos.o new file mode 100644 index 0000000000000000000000000000000000000000..eb887fecf4be354b9b08047b33a161822ffc62a9 GIT binary patch literal 1800 zcmbu9&ubGw6vtnFV56qlr1TJIg&Y>CLWYFap9e{rCRri0VjD|iB){Ak(Ik-FNEJ~b zAOtChe~EvBq6g3Z1wDAkL9wJ)Mc>QLwBu&igTAo)-hAf!X5P%s)qwV@tVR*|Ro=C;rUp>`WvrC;50!{cYTl_07gcNp)uysNYYnvX9<|?4 zJ3?*SuMIvf-M;f-Qk?zuLV$T5c%Iw@&u-YW5S$6T#s#a$7kS?s^660cr8gal4t#5& zly?}4B1nezeE(vWSa5>cY>saA1W@0vcVT1&sx8Z+;Wp0q#A$xvP_dWtzK|l;z5Z&;@pd# zc2VeK6941=FynFCtkr=TX3z315%u(kHD>C&Ca_-jZq2N*hG8ZzVv9QTR;AgiwRK?B z1*~ouz#83lTkl{(r)%mgzg~ZiKxCn<%DOngVHWoboBegPjkohf`| z8_`CgRVQzNQ|M_PaRTZ4lbywf_#8DP+vlzrZUP zIMuK5qc7^D`bj791a$6OjSfsbrr{_`@#Sj;c{w!~y< zNeE=ZL literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/c_div.c b/tools/connec/libf2c/c_div.c new file mode 100644 index 0000000..9463a43 --- /dev/null +++ b/tools/connec/libf2c/c_div.c @@ -0,0 +1,53 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern VOID sig_die(); +VOID c_div(c, a, b) +complex *a, *b, *c; +#else +extern void sig_die(const char*,int); +void c_div(complex *c, complex *a, complex *b) +#endif +{ + double ratio, den; + double abr, abi, cr; + + if( (abr = b->r) < 0.) + abr = - abr; + if( (abi = b->i) < 0.) + abi = - abi; + if( abr <= abi ) + { + if(abi == 0) { +#ifdef IEEE_COMPLEX_DIVIDE + float af, bf; + af = bf = abr; + if (a->i != 0 || a->r != 0) + af = 1.; + c->i = c->r = af / bf; + return; +#else + sig_die("complex division by zero", 1); +#endif + } + ratio = (double)b->r / b->i ; + den = b->i * (1 + ratio*ratio); + cr = (a->r*ratio + a->i) / den; + c->i = (a->i*ratio - a->r) / den; + } + + else + { + ratio = (double)b->i / b->r ; + den = b->r * (1 + ratio*ratio); + cr = (a->r + a->i*ratio) / den; + c->i = (a->i - a->r*ratio) / den; + } + c->r = cr; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_div.o b/tools/connec/libf2c/c_div.o new file mode 100644 index 0000000000000000000000000000000000000000..0790f3cca5b81c3c92c11bf36fd8df36f6cb2a33 GIT binary patch literal 2376 zcmbtUOHUI~6uxBu5w*7%O)zTG1Y*$Wg!)7iu|vbd*oYBOK%{A5DplK>b|6UNBWgqv zOt=B_~ayBXg7 z7J6cacVM;K39!eg?ySK(D=Y0zu)>u{ta^%vPY^hY#K*8-&hV~Ru!+dG8Q%GImY4NY zhtF^(;Uw9KlSbE*I6uCT$V}DF&(AwNkK4_r4gq*blWMxPpCTq{n`#D%vdmt-v>kXDK>Xo!57>!0?t| z*9@=!YGJ{fQg6B8_0@Sxj1?5u7z*w4SGC3ZQ&zu!kG@N<-nOIP_5v3JHG1{V%?>JR z{z++hZyaM9e)&XWh52AaE0&{(nJ>g-fld@i3|b@3eN5<1Tov}JVLRx9(g-zBh$CE}SL4sEAxCv5@RcCc*XRHQdy zvL5UMEYcWmt~0`s=7xrr`qoIRQ5UX{$ganPQ2^!@RbTaw*+29 zcM(GMS7FIIr2?mkc@?}uiC6pj5ko?CM2PJ(J$pWBMPtxb#?gJ!%9v-Px@8VpOwXiy zqgIq+0y>5y+@7oz*sXdsa45;_i^Mb0q{(zjV|px`Wja3Iq?tmoRN6B2#=~vfvR1U` zj6>spcRvcyx!gBB2#iGD1IKgC0N{Eonq?46m7uti^gm5P?~MA$FQ=S9$R;epx09pD zeKG8H3Pz@Yf9qWWTkVP)6M^o#E`6y(OXR;_B46^Cx=rNM{ZM6EU-(rSD6~8O E7vw8FZvX%Q literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/c_exp.c b/tools/connec/libf2c/c_exp.c new file mode 100644 index 0000000..f46508d --- /dev/null +++ b/tools/connec/libf2c/c_exp.c @@ -0,0 +1,25 @@ +#include "f2c.h" + +#ifdef KR_headers +extern double exp(), cos(), sin(); + + VOID c_exp(r, z) complex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif + +void c_exp(complex *r, complex *z) +#endif +{ + double expx, zi = z->i; + + expx = exp(z->r); + r->r = expx * cos(zi); + r->i = expx * sin(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_exp.o b/tools/connec/libf2c/c_exp.o new file mode 100644 index 0000000000000000000000000000000000000000..acaeceb9a4730c8bf417e43aa080a8c251f6b857 GIT binary patch literal 1536 zcmbtU-)qxQ6h3LHi&~OY_E4A)L4#Cfmku3@f~4EhMko$k3vNzAS~DiItu!fA5q&6# zdl>j9_-FVi=!5@;;KLpip+gW9^xWiLa~m@s^gw#P^X2^NcauD`8?~Gy0XGS*LlSWo zy_{exf)*6u1hm$i@u#x0``y|7>g+u+OU_RZ~EHwW5=o!_Ua6HRZL`a~EuGW*Ev#;UT!+>+}QYxc=xNxb?>BQnlf()@o~Z(`{Cl8nzovH=Ig54XIH1%ONQGqp literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/c_log.c b/tools/connec/libf2c/c_log.c new file mode 100644 index 0000000..a0ba3f0 --- /dev/null +++ b/tools/connec/libf2c/c_log.c @@ -0,0 +1,23 @@ +#include "f2c.h" + +#ifdef KR_headers +extern double log(), f__cabs(), atan2(); +VOID c_log(r, z) complex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +extern double f__cabs(double, double); + +void c_log(complex *r, complex *z) +#endif +{ + double zi, zr; + r->i = atan2(zi = z->i, zr = z->r); + r->r = log( f__cabs(zr, zi) ); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_log.o b/tools/connec/libf2c/c_log.o new file mode 100644 index 0000000000000000000000000000000000000000..a8acdbbd25c34c4935d3b63e0e508a4c4e39f689 GIT binary patch literal 1568 zcmbu8zi-n(6vv;FKusyJg9<__gNFzes+`i6s#TGY(~=(`i%7H`T2PH+oK|X+NUD@z834j`m<1PR`=@94#Kgaj`-zjq&h-@D7Z^P93&Nht~lQ{X)H7(r2+5h9*qFWmv2Azv{KOKbqS2Pp8_}b@ZRnZ)Z-l++@C~O@GATSzg8H=$P_Q z@a06?8k}l57e%_2SMiz2hcAWV8!C=bF;nY*(4QV*+GMyUfb!}IC^o&Kez>015V(y z=b&lZuG8?ru3Gh#l4aK`m9_G^ycR?BOnq}>TT zR(-rt@B_!)>4ese1p!**0pXe*)$X4V<>3n62 VZ!3o{i, zr = z->r; + r->r = sin(zr) * cosh(zi); + r->i = cos(zr) * sinh(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_sin.o b/tools/connec/libf2c/c_sin.o new file mode 100644 index 0000000000000000000000000000000000000000..2f93d86188d0e9a9f5cde9c295b70b29bd3498f0 GIT binary patch literal 1608 zcmb`G-)qxQ6vt26>Y~mj9X=H1L%<+a>80Bo76nPS{)kXEaUHlh2x-lz%(l>^Fh%sC zFHRWvCkguE+x`R}eCUIsbdL&pPIB*-Whn#k8*a|IpL5Q=xhKh+O1+wpBoLC|J{->k z1u&DxzTvwDOv5EuGl$;_=H4%J@8`Di*tzx$o&320mZ_MpQRe z)P}BMN<&xC-_mpFZ|Pa|%eu@{Hp+SytGc#M;P2mnZr+oCm;QX zf-8Xm>E$Dkc2#M1dP;te2fB)!2I(E$N@;bND5s6YFs+u-GSrrr?`paA=Ai2hv^#8( z74i!Me>V4euE+|vZv>QT&rmY9g8)gq;*^AQaTv4DPvBD%xO|G!yHrn6@K=uGmnY=U zOyD`>GokbPy`}wHJ+}?+vo2aPZLn(f)umG1TCG;sDh;bqTB=tpXjvG<^gPv|QaI=o zzyAb!NDxJwPAzzcAd2_}9D-};lM*;ie8)`@O5|{x`!AeX+l=4?--QIxiB!FeaDMqP?e* rBCprDy@-tdgJ}OmU#TXn$9z#1hUiBhD}yZBJ1QCR`VE?d6s`XYky4WM literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/c_sqrt.c b/tools/connec/libf2c/c_sqrt.c new file mode 100644 index 0000000..1678c53 --- /dev/null +++ b/tools/connec/libf2c/c_sqrt.c @@ -0,0 +1,41 @@ +#include "f2c.h" + +#ifdef KR_headers +extern double sqrt(), f__cabs(); + +VOID c_sqrt(r, z) complex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +extern double f__cabs(double, double); + +void c_sqrt(complex *r, complex *z) +#endif +{ + double mag, t; + double zi = z->i, zr = z->r; + + if( (mag = f__cabs(zr, zi)) == 0.) + r->r = r->i = 0.; + else if(zr > 0) + { + r->r = t = sqrt(0.5 * (mag + zr) ); + t = zi / t; + r->i = 0.5 * t; + } + else + { + t = sqrt(0.5 * (mag - zr) ); + if(zi < 0) + t = -t; + r->i = t; + t = zi / t; + r->r = 0.5 * t; + } + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/c_sqrt.o b/tools/connec/libf2c/c_sqrt.o new file mode 100644 index 0000000000000000000000000000000000000000..aee7a2ab2d53986867e281cf9ea895434c49edc9 GIT binary patch literal 2392 zcmbtV%}*0i5P$7ftq6S!K_#IvJ!}*eHm!V!2-?yXI5ZFi{J@W9TiTFlA#@i(O#BEJ zy?HSq@#3Fgq9^0Q_yu_MFEG)ANm0oX4T&Z=v-=)>Y}<=YvpX}tdGnjud2hFO;)y=D z%SE`j$SG3vI7-Okj-nm5%rK$EM}`L$Rs#bMey>ycoM)ZZjwt>t{jsu6$3B>}HlcVS zZ~$<>0`M1rKLb3j$XVL-_AByascKQryA2K2HY-$ZLHtI}q!(g}Y|@KX+@xnVAhjEL zRv>A4Hf~b64c%`h9s3S7jsg%G4)yg7 z$48PQk={f+34AC$wz75#>;BoaCC+d+Xq+a;M+F>b!SRfMR}1*#3ixY=Nj(SmLjTd5t}%tSJq*K!%6ViHkPx=z&eR4$j91ggm?Bct{Yj<)EAmcGW?`fn8g z27E5(n-m5Ng`YFqv)6JPbt7Cj%P?G`co76yvz4_6Sckuv4GcdB8u2>jb9J8$+j+Km zKG&@k@)ub?YlG8nePK8ru8{wvLVey3*TXCy&zUGsS$?+&g3bHp@E{oF=C{EbI$*Zc{{Mb02xqVW1hL=bFVpX+G>6PNCD4wMCX y9$$-oxup#Z real){ + temp = real; + real = imag; + imag = temp; +} +if((real+imag) == real) + return(real); + +temp = imag/real; +temp = real*sqrt(1.0 + temp*temp); /*overflow!!*/ +return(temp); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/cabs.o b/tools/connec/libf2c/cabs.o new file mode 100644 index 0000000000000000000000000000000000000000..5a76743bca19982260d66b39a9b65a0bee6219b1 GIT binary patch literal 1896 zcmbVLK~ED=5T4R11xvRy9Gc*vhmC@P7pkDdL~X$q4vnCKVl=MX(uPFZYIh4r44Uu< z{0-hsNc;l=9yH+xc=tkriKbpOG0~abH}bmOUYKS(GvCZN^JaG6t86~k6$k)J0ItKa z$0)#I@Yqf}W*VZ<2eaGX5@l`ZOH=C)>1FNvhq5O2*RM%ycRknCVmb!I!CDXIM9>^M zKx}}Fy{5Lbi?O}U;l_CcL;CFY$HYEHewMZS6VwJd5c! zYHGKCW7bPO{J&`&YmHFSsvgGBh<@}IYwjL86~5BHS6;UQKW+?2Ah3A{0voZwV5B?z z1{ae+{H%<qW&j3m`1J?&=k`>ZMgv*rg2{M7_3b+NLO4 zcIvX~O`=0tr4^%GH!CF&ln0_zz&!sFzqA{%+X3HDi!Bgc;) zlYH*SrP*hllYDtxPJ@KxQ+-vK$5;jpzxkKsRpB}58=_mwe8%SyqgLLVm6!c7)FNK^ z9!9C=N%;?vOEt&vQHA?oP(if0KkH=$Q&ZPCK?QwsDb2fkqHIY1ywnlIXoueY(H-~B bju3p3MFlyEc#qYOF+ct@3EB#mOfUZ*Hhi=y literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/close.c b/tools/connec/libf2c/close.c new file mode 100644 index 0000000..e958c71 --- /dev/null +++ b/tools/connec/libf2c/close.c @@ -0,0 +1,101 @@ +#include "f2c.h" +#include "fio.h" +#ifdef KR_headers +integer f_clos(a) cllist *a; +#else +#undef abs +#undef min +#undef max +#include "stdlib.h" +#ifdef NON_UNIX_STDIO +#ifndef unlink +#define unlink remove +#endif +#else +#ifdef MSDOS +#include "io.h" +#else +#ifdef __cplusplus +extern "C" int unlink(const char*); +#else +extern int unlink(const char*); +#endif +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +integer f_clos(cllist *a) +#endif +{ unit *b; + + if(a->cunit >= MXUNIT) return(0); + b= &f__units[a->cunit]; + if(b->ufd==NULL) + goto done; + if (b->uscrtch == 1) + goto Delete; + if (!a->csta) + goto Keep; + switch(*a->csta) { + default: + Keep: + case 'k': + case 'K': + if(b->uwrt == 1) + t_runc((alist *)a); + if(b->ufnm) { + fclose(b->ufd); + free(b->ufnm); + } + break; + case 'd': + case 'D': + Delete: + fclose(b->ufd); + if(b->ufnm) { + unlink(b->ufnm); /*SYSDEP*/ + free(b->ufnm); + } + } + b->ufd=NULL; + done: + b->uend=0; + b->ufnm=NULL; + return(0); + } + void +#ifdef KR_headers +f_exit() +#else +f_exit(void) +#endif +{ int i; + static cllist xx; + if (!xx.cerr) { + xx.cerr=1; + xx.csta=NULL; + for(i=0;i%@fJtwdR{(xpgiZ8Joytv|Hvn!hVuYTKCF(#p8m%r+s(26pez zZ4+Bz5-}`WeGKYbDShaRPZH{bfh`UCP(ojQsc+U46n!ZwtmoXh*Ici&Q0Q4^&bifL>;{sJ*st$mFxtR&_y3ST$+x`tVOtMCPLH$Jiw^S=t-@g!ULlW$F2*>d_}e`5Y8 z1W!L4OUz#qfzKul=GK_SXU$p&+rW3I()G92SnU+t7PV@p?9ed!TWwzxe%TUvtrcuC z#a8=oWP}S1n~Y_#3VyS{IMEQf{+?|%n{074GI0%?VGB+ELrZU%W0G2joas z#qek^SZI>>D&1JUN2tXUHe0+K<_;PbZors-hlR~OXvj469bw2XCtn3v?_fdWGj?E| zZ)3GX)Y@GZ%rfA&MV9qj`twm7bc;KH_3bBMRg>2Cu1)rNY-$(cFH7GMYBC#7o@vX* zQ$egho^HFpIi5l!8@IEag3BcLW6~e!+_|UB#_s?-(aj|{OZu6-RmGJIR6~7z2h+Po zM*R}^)9*U_oZg%az$;0BA=_{rh0|LRh12|_@HboFRG<1$ zqWY!%j><#N5rsq1^{Nvbic@}N+=Zghz}>Q6Du7>_nkY>|u`o4L@xUF*9X*`Qxkm>F zhX;o-e zyYNzVFKal>LE+aVZr1&y1^!sevsug2A-BS;o07Ph|8JN`=V+q?4quFKf(&aA#QIa%36q+r?s{Kn5 zh(hND;gUv>khBDr6d<*VSMY0SMAg41ABfHu5~@$9vx-;s_aR30&69iCYzR3d=JV6} zKsn9$6&bJUP%MdgrezSLoV|GIqT+Y!AljOBcA$wG8?(7%#7 jKQ&jqHrZ$8{(ovXRNo4I2@P|0 +#else /*{*/ +#ifndef My_ctype_DEF +extern char My_ctype[]; +#else /*{*/ +char My_ctype[264] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; +#endif /*}*/ + +#define isdigit(x) (My_ctype[(x)+8] & 1) +#define isspace(x) (My_ctype[(x)+8] & 2) +#endif diff --git a/tools/connec/libf2c/ctype.o b/tools/connec/libf2c/ctype.o new file mode 100644 index 0000000000000000000000000000000000000000..f3644ba642473240b2c62408a3a5c35e40044780 GIT binary patch literal 1200 zcmdT@Jx{|h5WOUPv~1mwSi%HU)Jg>vhyg{aN*REyGfF}vB$Tvj9I090@9;A@H+OY) z^#CKcym!y{&OXQanmj%Do(CKr+=Iox7dlpC=9}QeqLjQ%*qVRMrsMHl zcs@((QrF>)8mVY-Rj;$*=kQiV*B7n&iy;H&7XS!A-eTJ z+dm5@=rBh+5YAZSobni)pCU1uys?-HHgi)R5;B}2F|S_wALT}5kn$z!MvG{jf&G0J z2-(j#LY?_`>Cz=SYE7Bz6|KnsO-&CG%^mX}eoT57QO<6bLTY+Mbqw-YJzQ}4`{bXn Ikx=@70IkI=umAu6 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_abs.c b/tools/connec/libf2c/d_abs.c new file mode 100644 index 0000000..2f7a153 --- /dev/null +++ b/tools/connec/libf2c/d_abs.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double d_abs(x) doublereal *x; +#else +double d_abs(doublereal *x) +#endif +{ +if(*x >= 0) + return(*x); +return(- *x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_abs.o b/tools/connec/libf2c/d_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..7d2aeb4fb45e1b580ecb4e964be956473f4f913e GIT binary patch literal 1616 zcmbtT%}(1u5FW>+f%20S^-uu^pDK!AtYwIv$8ciQ5^k&1(cDWSjiu<+PNJ9*!asc8(!qmm>sv8iP=!h za75TJI)on^!oSM!$=zh@d>LnE>l{aZ+UU1GOSM&X0bdnp9Qn0K4w4G#x~Z!Bhs5Nb zh^MNAcMy{i|Kxw8qVu-)YoH<>CTmMj7@YV@2WJ{o*lqaQSM^A*n@;5edXyEkj+&w0 z4nR>Js9F?(s(0J%po8j8R|jfydv7Vye*HME<9}Zc_mRwVu$#xQKR@=L^o-mrK6DEn zKBkpvKxl5V0No2|W!`U@f5-eZ`?7pvAo;?JFY7V}Xy3H{lm+x%nI^uh8yF-#m)lRh zVzk(25+LUa{TV@C{~m8BeNzAQ^@v{h9pvcz^gsL>xjds>)4rlZdp=ixh+5jy#m6)` zf59XX%lWc449-mbWjY2HolxYbXHT(PPH0J}K@py!4|*6SML}$tAAu#5LYwEcptR13}-I@8#{NB8oSuc~>RF9^C5DnI$?Fkg%pr>u?uBk&1 zh9GnG8h9TL`(FslTs;OJ+#rm$6lmvrpf$tVc+elX!Gj5(;IRnltx$L;6aYvk606ba zLa|YG8qsAIXR-OkhU+a{EUd8D(o75G+~1VXvjYGh{=CEoeO@qT_jkelU2yC}5t?O0 zx{up4Vw4$Ha>=C|df{+nn5CKxMmn3@+{hZaRBAt&H}V^s*`$G-0V1RH;zRc5S4*O3 zlhFD)_R8$Dienam*-pKs%fhN#rzUf(rUT41t+H`kH!BvfBhxW~6>S?>saC02RZOYY z9E+uQ3-h*PmQLJa|L}_P`>Gqz`PpKQ-0kcQ!Etl1i26crV^G*~-kt17wwg=6I(tgL=bSgL2T{|%QJo*{RqdT9x4h6KIg+ULM=<8a N|KN#-5|>Ps{|&;yQPcnc literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_asin.c b/tools/connec/libf2c/d_asin.c new file mode 100644 index 0000000..d5196ab --- /dev/null +++ b/tools/connec/libf2c/d_asin.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double asin(); +double d_asin(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_asin(doublereal *x) +#endif +{ +return( asin(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_asin.o b/tools/connec/libf2c/d_asin.o new file mode 100644 index 0000000000000000000000000000000000000000..4f2b1ed16dcc0609186a15f92e505f0784a50676 GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;scGrLWoEz@qtT%21P+GiAfZqf+nEVaY;@hngntePzx<=Ed3eQ zR`y!>Gb}AE#L7a@nai$jmWzcrVQ*%>nQvxyc5{)=Wx6yCglMn|Kb}AV_PTy--8FR> zgaKH;d9wKY=1>42n@TN5 zrV7Po&1ps!S)4`Z=9{h;JC7}~=)!ah<=o$t&+`NTKKyx!4|=>{%ZUl*&6ZkC0 zrDyLl_S`Q(lxv{`U-*+~c=dns=udA!@J0VPVw9@B*ek@mgqQset)N9U|H{{qOEuMV zivBYglST9wdIN*Pmh*09N3zvi^3~Z>`W@%Ia@~)b{*CJV=w8*c6Xk|Cnjl9Kwf_jl Py!h`tabMz+sq()7(J@ij literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_atan.c b/tools/connec/libf2c/d_atan.c new file mode 100644 index 0000000..d8856f8 --- /dev/null +++ b/tools/connec/libf2c/d_atan.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double atan(); +double d_atan(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_atan(doublereal *x) +#endif +{ +return( atan(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_atan.o b/tools/connec/libf2c/d_atan.o new file mode 100644 index 0000000000000000000000000000000000000000..8b3b277971f2cdc50aec6d1beb74d93bc3c16026 GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;sZU!LWoEz@qtT3gQ6hkBM%`eXaZUt7d;U)7sy>eEwo5u>CdpX zve&|&VQFC@Ru+QJTz1X6tQO*gy_xxDzM0+G%|$w&X)z2CV!$FaJ%Ix3v@~riG%e_c zF38oNW3Rnt^og)s{XTXV24SF~z&P6i*Od`cPO^_t;^9dlCQ(P500~s5)gA*goz7SjqQ+?N!QU*TWRA z61Xh8QJnMxXYVL%_79%~->-TD7OySl$ldQ}LokkuW?|uy<$(`jkb^Wgg2c@Ue1hZB zvkw_N;TIsuwNQdD{1G&C{U0^`=`9Gp=$}H2Qq>oGiI`4!*{{$7T2%9|d<(f$Q$45X zKaMe3M1P^zFeq#}??!ecTg@e3ojs-Ba?T6aov7*GsLqe>RXsaVu6d(jawJjv_hC%O Nf8&X}5|>Ps{|UE+QPBVZ literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_atn2.c b/tools/connec/libf2c/d_atn2.c new file mode 100644 index 0000000..5611385 --- /dev/null +++ b/tools/connec/libf2c/d_atn2.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double atan2(); +double d_atn2(x,y) doublereal *x, *y; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_atn2(doublereal *x, doublereal *y) +#endif +{ +return( atan2(*x,*y) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_atn2.o b/tools/connec/libf2c/d_atn2.o new file mode 100644 index 0000000000000000000000000000000000000000..439d83f9b6010fe63fdc5264f175636117bdfd59 GIT binary patch literal 1376 zcmbtSJ4*vW5S~la#8*5;M9?CIh!3*F7m9+Mk3586@Db4Jyy%IbiICfXT4-To>CdpX zvezHr&q!e*)`HGlc6GCy7COh?H}ma$JG--cmCB_`zoS0+D>CrkXw7)?(@B{#1{DLeD%|SF~xBS3Ie&F#Ono%!J zjiZoO=u!6R_X4>Xj-Y&SxKo~l1KZ&Ub|#l!Udq||bb2ebZEr6v=TbH*0XqFZKocU> zc>kzdT<~;_4fo5u^AdN8z&u{5;QKItmt{b_D@SC zw~Q&}Q|_|NdLiL)Xa87~`!~eJe)XHM#LBX7B5XVxk^?xX7ZwiHo<$S-1=)&7l)OR7 zj|*OT{=QQ{`ZLH;s{V3skP9-g?AO!+dbH+W^%iPr zP5qp*{us`wChJRF!%69@dG~6d_i; + r->r = z->r; + r->i = -zi; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_cnjg.o b/tools/connec/libf2c/d_cnjg.o new file mode 100644 index 0000000000000000000000000000000000000000..cdc03bb061fc01dd1ba2f74e887abfb68a9944af GIT binary patch literal 1440 zcmbtT%`O8`6h5P9{kFtH!lEld^rnsaT}YFLM$%YF#FA-E3EE2MHYp1{f(P&*_7d?J z9zm=uB%CvIPJ4~11*hqp^L^)c&YgR+S={QeED*6^13E}pfWw}So%75bjKDCw#S>dG ze2l)u$KsXvejoYJF2o+aD1O`um|(-Y+6AkXu%?Eiu{&&-Kz^EiQxaUr=hu_7d!=Sg zH0(wXMpo&MYG$hjVgJY1mZ<6uCf^To+WiUadMcOsLhhqY68FDOcO&Gj9G5Mf20# z!OiE8BWdr$hsLISg8X!vIUly4&%BIDW(H9cB_}5Q4D;h0C+d(5`fg1TEP4%{RM)sZ zUibwkEwC0P{RL;y2%G;UWPXa1e3?Iw9EAqItb63bgv+*F+h|eEzvk~?F4auq-xTRT zZ<1(Bf6@B}XNEqRz_2AxD8j+rlkb@WURe*Jrdt`@A92BVr<4b7G(y0TV1K%oVfpVI K=w04l^1lG7yHe5s literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_cos.c b/tools/connec/libf2c/d_cos.c new file mode 100644 index 0000000..12def9a --- /dev/null +++ b/tools/connec/libf2c/d_cos.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double cos(); +double d_cos(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_cos(doublereal *x) +#endif +{ +return( cos(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_cos.o b/tools/connec/libf2c/d_cos.o new file mode 100644 index 0000000000000000000000000000000000000000..aa150ae553b04ffcda68c813cf0962829a77ec14 GIT binary patch literal 1368 zcmb_b%}YW-5TBQoR#GM%0t-AvAGjzbML|3@wZIDc06RUN`a&obd{3|rb@0-$KcjP} z?se$T=-8n{bm|b)%yYN4<<%h?c{?+|ncvLr?0TLpglMn|U!Fh#ialSp?wUFT zVF=bcPl1<_kpGde_0C=3)(yf~SAllA16n(zMS}joB^D-pg2%$7*M>uz!vTPNCbJx! z-Y>Q4PAj^|k}MvZZ@FILEV0Dm3o~7mbAMAl&l3Rn@aH8y=<|XxyZ;B={{xQaP=sa~ zmiFVG88O;PNXaFaDtqBjG0F`ajC^4`ohlgHx!i7c&)7?)3t5AB1GJ#@;zzr9d+$mV zZ4$b^Z}-aVlbU0efZ0y7tE<9lTE`}HthNKpHLa>~*feVvu!`xJz)H3atlX&8tU9LD z8;-^DTl+EFG0R78vwv8ke81`q=)AU=BX_@_4Z#S0Gz%R+S?>7|#yLoHBS_qwz~?wF zJ$si?bXR~l*Fp)t@Tbu5>i^);pWcGti~dQ(C{=y27l?TYFZ&r6So$-p zt?ae%XINTTh?Rw)GnZZ6EEfxLj=h=rX1em%!U_*#At}X6qqv?*?J4tw1~91?@DfMS}joH5Mj(g2zTlZ-m0zp#VTOm0FHY z9~7H4rx{&jNfwXIH(f7rkyv8!g_$QL5V&FtWM)`dZG&XEJ-~ePe%ZJ(o6+Gk}Yv7Z>gBs!*R(3eQNyfSz{;j$0xQ}!uu{ERwQ87B zt2-9U?i|Ey$1EMY&HmvR<@;4{K^MD_=)0)l| *b ? *a - *b : 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_dim.o b/tools/connec/libf2c/d_dim.o new file mode 100644 index 0000000000000000000000000000000000000000..33a34c228d392ac5ab615d2740416f1c8fbbe735 GIT binary patch literal 1192 zcmbtU%}&BV5S~&I{E0>5!2}O@F=}K3@i&^7Ca7GD2P26G6H=fAq6I@2gC6wa1NbDy zM}Y7$-b{D`cVM=zE4}C@+i&LUd^5AtpXZaa(}-b!Tm~G$w|vEF@jU|sk6RqM0cUnHsVcmYNyVI*f`@mG-}A^2sww?qi}T<##XRw%U_yq(%( zJ1mplY7f2aQ+A(aw%13jj1NI`Z07(bM8+yimqT`Go6-i%uCOrYU-gGVi#f3mb; tDfIQ(FV{{G-(9IP>xxcAU;0*vm_ytJ_T7qEAZf$^v8{l{kMF!E2 zDj2!c;~=~r@m}ftevgP?X7h#QQr;|NG8^elb8{(~Pn)o7+O=Z}x6y*qj6a?3{i7~A z+9Wi-A9H2yiQ`#CV6IoG>wRHW>_dxrcFhCkoA$oBSFs!$*skSSz>2O5taRi!b{SL3 zN1n~HYg=*Gvq}ekv42=}eqMC~2H*RuFWmoeH^gH2Q!fnsWqII<101Bj5hNxj@ClAf z&)#Qj`zt_#YoP>R_#4SIqybxBwNiTU+q1m-*V0i*X^k3y{rABxvF<3$~7-EOpYXK{T_@3 O@!xpjj>IKX<$nSIYEhj4 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_imag.c b/tools/connec/libf2c/d_imag.c new file mode 100644 index 0000000..d17b9dd --- /dev/null +++ b/tools/connec/libf2c/d_imag.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double d_imag(z) doublecomplex *z; +#else +double d_imag(doublecomplex *z) +#endif +{ +return(z->i); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_imag.o b/tools/connec/libf2c/d_imag.o new file mode 100644 index 0000000000000000000000000000000000000000..6a3ca57ce1c62799b6d8cb4608395a07b6663de6 GIT binary patch literal 1176 zcmbtS%}T>S5S}z@>knAPgHR9kA}V%i@fQUNRILZ`Aog6-Hrk?Tq1i(9pgw|6AU=xV zOZXfI6FI8gbWjXo>+ zW6&NsDS!=$kqR3o#_*G4_-NvxeH)TPF$Huzi^e>WvR-NW?j2+)35_N*t`a~6kG^)R zh`Q6qhIrcRX;2;S!Bt+Pa@%oz4^-XNE~sh{fU329-)mt?tF1j%x-91c?bhzYKL1@Z zJZE$cF6c1E`Jppm&KiEi#b4r_^;?VrDRCHA5$UxYjs+UrXqgGpQ4i4zpGS^TZTw8r zW?=YSHe&YBqndx!AEB0N(j2Bq|4oxbU-}E47@V2e|DM(JNU@j6rumbm^G;1xM; literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_int.c b/tools/connec/libf2c/d_int.c new file mode 100644 index 0000000..6da4ce3 --- /dev/null +++ b/tools/connec/libf2c/d_int.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double floor(); +double d_int(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_int(doublereal *x) +#endif +{ +return( (*x>0) ? floor(*x) : -floor(- *x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_int.o b/tools/connec/libf2c/d_int.o new file mode 100644 index 0000000000000000000000000000000000000000..6157c5d3a5b31ecff0fa224880c4cbe00ec80abe GIT binary patch literal 2072 zcmbu9&1(};5Wpu*ZKJk*v8aeu$VI88eQZqC;z1+9)!Mfx0VQ4qo!NbpOg0HZov?3aesAW@`^@h3)#Z^$1Xv<)1-c$n zfS03PJMEikn1V@YtGIHMo+Pw$$5FFQB&W$k`;(*Azo366@b!1~>=l~r8*0Aks2`uv znEQxvdu_GX9P0+IziX>|euty7-yF5kYB_4tuko)6JE?t)j)NbdDgJ6vE5ynK&d;k1 z{{*tjzR^$FKWdD~quUT^#3M5kgD=Oy36%Udd!GCuXzxdc~_JF6j%}T1eG> zFZm?7q^-qs0p<81Iy&&g0HXLCBvBBDDFUM4?}8wK8HMpaMj#5YA^hMFeyEQJcddV( zV}4}+JP-T4zcTGF%_z{m<2T3rcC?S5L_RI{t#c-NHDdub=c!3jlcHu3id*+9UT4K4 zm`|(xZ7#%dzYYL#S|#(dg45iY-x7R6@NL2A!gG8>a5?^S!R7dG1()N$7hH~?5WMI8 zYxiN<%jH44UMOm4 z?a;L00Zc;e^iSq|%1oaTc0RRpmvrs)d*&M%0NLO3508KTdNmulV0?H7#-VAYzOr5Dyhy)o#@f%ROhirn(bAoTJl`GUwjTZ~Y}{hvxDP6Uv` zUy`KYP7;jS<0J6&2ps1~kQCe-LZh7z_d^xUp=^NrBXA4xnb^GHPKhs^QV!a^18}R( zdU4Hh*DIBc@}|4FR&>fP?78iOd=4%0Pei!q*J?V?; z+xl`Kz2^I{^6maC)wlj;ZFTJB{*-@hM#SdupDS#M#G?RehTxD&JWT=MnZQ~D3Zu@qqfefpmC{Sl_m bPSi8SdrD4B^!oH&Ch@mbQ~NP4nL7U;*g#~n literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_log.c b/tools/connec/libf2c/d_log.c new file mode 100644 index 0000000..e74be02 --- /dev/null +++ b/tools/connec/libf2c/d_log.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double log(); +double d_log(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_log(doublereal *x) +#endif +{ +return( log(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_log.o b/tools/connec/libf2c/d_log.o new file mode 100644 index 0000000000000000000000000000000000000000..2e7a6711ff56d5a8210e58e2533e412fba8379dd GIT binary patch literal 1368 zcmb_a&o2W}5S~@EXsAYll%yx|BVH;rghaNjwj@P@CUx3uStPVgy4$22IP~J^&v15f z=itw9bZ`(S2MIIV_w;#L4q`U@X6Bpu-n=*SF4DP7o2G#f4VIzh2^65v*0Oci)FB8x zu-bSIy!M6sPlT;D?gMvj5C)nGw6iVH>LD!>^arkRW5P#xEKGW(H?-ax0LZ3Ni_!6X zu~v3!(RmhUvFX{G>&=|cEU?(zL=)xQ-;~eu1^_<%yu=3`UNB~N{($>`!0{f645J@X zFmkEKUicv5Vd?yCkBDGobDPOT&e+Ukw$nStP9m908?bMjR1PWJMGHzh{&c$ckETS? zCZX|tn=7+VOO9CtW;@lUJ`z^dIx(4J)g552X&o5{RkLIP+czB(SkbnD?Nv%8tBfh- zies_tMt<6M%)Mi`*gq^$eqMC~I^X-NFWmojH^d_NQ!jMOXqar&lTXqJA7PN>yL%C1PH}xBUt&p+$TCm9Hb0_EhgF z>Q7=!7Exd5H4F+{&byHv$yRg8S9?$Cx196BbvJ5y?`r>OuIk;1a?J~kk|T*)zaL{> N{5PJsD{;wG`JdSNQIY@v literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_mod.c b/tools/connec/libf2c/d_mod.c new file mode 100644 index 0000000..3766d9f --- /dev/null +++ b/tools/connec/libf2c/d_mod.c @@ -0,0 +1,46 @@ +#include "f2c.h" + +#ifdef KR_headers +#ifdef IEEE_drem +double drem(); +#else +double floor(); +#endif +double d_mod(x,y) doublereal *x, *y; +#else +#ifdef IEEE_drem +double drem(double, double); +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif +double d_mod(doublereal *x, doublereal *y) +#endif +{ +#ifdef IEEE_drem + double xa, ya, z; + if ((ya = *y) < 0.) + ya = -ya; + z = drem(xa = *x, ya); + if (xa > 0) { + if (z < 0) + z += ya; + } + else if (z > 0) + z -= ya; + return z; +#else + double quotient; + if( (quotient = *x / *y) >= 0) + quotient = floor(quotient); + else + quotient = -floor(-quotient); + return(*x - (*y) * quotient ); +#endif +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_mod.o b/tools/connec/libf2c/d_mod.o new file mode 100644 index 0000000000000000000000000000000000000000..4e81344912391ba033b01b77be84660010e38030 GIT binary patch literal 2088 zcmbtU&1(};5TA6lsoM6%qEM_z@F1}?kECg}c+g0&^-x5lsYu0|k6i+q1d@%k9;_EV zdGO-Jzreph#GCaZcq(e~=;uK^D8ZwkGrMoPlTC_HXL)aCe)IL_eeBw~`Psfm1ehXl z8Ul?`fG4{GIqQj87=|Het5_7r5l1CnwbixPj?zP9ZY&|PftDm`D1UU+!dKL%eO>=j z_aCF!KCdQTIO@k26vjWG-`loY-{=n<7dG4K>L)TdD*w$`B#ZsnH{9Z z$gpg9W>V7Kj!^ z14T#{3TVCTU93l%Z(~%FESy8TfqrFrK>nZ7#%7uNna1)FtDS0;jbzz9jHLfv*aj z?mYY76S&O(NZ>O6bAikJn*x{l;{xyaAL!<4)h!f3H{FKMD=anan+5IKD=z3py?^?8hP23Wv5Z7+Mvk~bg|h4U8+~Bb`7Izb=TH&7xKxbTPWQyEBQZ0{ZJqN zJqmJVjktB*M(^kuu`wKU`?5GBWzAK6Z$R2}ishFuYVczQA2B+!gek;+jB`Bm%r@~^ z6CdY5!})$QpEdDxA0=Hk@e>k6nd>rq7KL8@kD4dR>!<$dufg$*Uqp;bgtz3rxB`Wd{lN@FlnK-c!gk6JIf$-sUil@cz-i eCEPng5I10)6hYx-?MGX$_>?(6SHzMSj{gh4lJ1oN literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_nint.c b/tools/connec/libf2c/d_nint.c new file mode 100644 index 0000000..66f2dd0 --- /dev/null +++ b/tools/connec/libf2c/d_nint.c @@ -0,0 +1,20 @@ +#include "f2c.h" + +#ifdef KR_headers +double floor(); +double d_nint(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_nint(doublereal *x) +#endif +{ +return( (*x)>=0 ? + floor(*x + .5) : -floor(.5 - *x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_nint.o b/tools/connec/libf2c/d_nint.o new file mode 100644 index 0000000000000000000000000000000000000000..23640b991e63f4570550c75e432d9a2abb88fc67 GIT binary patch literal 2144 zcmbu9&1(}u6u@7)wW->6Vo?z5M=nY%?U0yOg9jT4wjPQUZCXL0-6Xq2GzladsUB<( z9zA&QZxOwj#6wUIejuo);y+-?Soo$YJOi$kFhu!P_W zbbCwzc89xq+Evpq0prjSk+3b~0YcSWN8ENbTg2Kpa*8PGA8oPv1^Z{czWn(x*|{!e z-q_;TXH=$fJoc_5n(dLU(dvhexci9)Y?1wDi?#QtH(F>gPP5=(n}8Mtjr&Du=uw&& zrJ+Z8ixW}!CPw*=QChZGcel`@D1O;p@JKx4wR;PHJlXbH?r{I8QbLb!LTD=zni>m_ zKF0%&AU~o?Ch^bz)Wd=KUuayP|Fy>T`M+v>0(FiX z)p*Z4B5RLIj+p~lbE;ljWUXpFFr{N{IUuW*g6WttUvpA=Cvg#bWMvgM?5bI^K$0EE zT&)H&Un!L=JZ)L7IF?+xk)5qMX8yif$^SL9AKHhPf8Dv#O5M)~)$iFevMDT-ooOt( zY^oIBQ;_bOd^uk@KhG)7`J&7rsscqBsFwY?O(G{#zkhmwKmRY>E-HV@BV9I?|BMb% z=eUfoqS9~wE9#f!ebWBvwPAneE66C6|3!GF;^R<{`0*N!(wzV5e+PYO&NvobIR3N_ zQRn#F7Br@tzGMR(_OT^1|JjqvE9JkVTKZ=N7XSIto8#X*B1kDn`K610Sx0cNpMO!^ LAHOp^hu{A%9o+Lv literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_prod.c b/tools/connec/libf2c/d_prod.c new file mode 100644 index 0000000..f9f348b --- /dev/null +++ b/tools/connec/libf2c/d_prod.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double d_prod(x,y) real *x, *y; +#else +double d_prod(real *x, real *y) +#endif +{ +return( (*x) * (*y) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_prod.o b/tools/connec/libf2c/d_prod.o new file mode 100644 index 0000000000000000000000000000000000000000..c9a519f80b01d325719182e59bb04c87dfd86e48 GIT binary patch literal 1184 zcmbu7-AV#c5XWcTQu{)SE&{u-o2bZx(kBJ6VC79jL|)X5thyo8s_Y)YBI>rwo+5e- zp%>{L_63^JIeOaMn>w)mXMQ{XGw00ua&mSWGYnA6fFl@XiUNFT(CT9gW?&kER5}r) zuH!-KruT__kuApKB^cebk(o^--_V;zzRd6DSfNxb9%R?b)lO4(vU_4jY@CK=aEsV ziI2XX^hAq!+acM-i1z%e{}8>jC!IrIs{e)#F;@MR9&1c5eb*B$Rz8I&56_<7eQ-gK mbqbaK&EfeG58s_E4Q{0BiO~x8pGP*%|H_3|eb?wG?EeP+COsek literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_sign.c b/tools/connec/libf2c/d_sign.c new file mode 100644 index 0000000..d06e0d1 --- /dev/null +++ b/tools/connec/libf2c/d_sign.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double d_sign(a,b) doublereal *a, *b; +#else +double d_sign(doublereal *a, doublereal *b) +#endif +{ +double x; +x = (*a >= 0 ? *a : - *a); +return( *b >= 0 ? x : -x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_sign.o b/tools/connec/libf2c/d_sign.o new file mode 100644 index 0000000000000000000000000000000000000000..490906bd643e5ece80e9bae29a17de93613b2433 GIT binary patch literal 1680 zcmbtTO>fgc5FOXFNom@+6{?WR!QxN>BCDhyP;o#(5$&a_P^FdwhvFm-MUX_YH&WmL z`3XJpW4Q5ODg-yUBEgJ3lWf=ag^p$Kyf^c9XLh}xpC9heISz<9@Dyf9SOCwR`OU;_ z!U`tY>WBJB_kT85 zlilflGrrO@avS*4sWtI6&8LkH<2D9pURyt5 z0o_B>1k1ROLDF-%)6@(0%+yO07{2I)B5dzH#lCZb&w>hK+CzK)=#JaH YleEl}+W&>U{%V2#3+pvaW|*!22Pa5%6951J literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_sin.c b/tools/connec/libf2c/d_sin.c new file mode 100644 index 0000000..ebd4eec --- /dev/null +++ b/tools/connec/libf2c/d_sin.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double sin(); +double d_sin(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_sin(doublereal *x) +#endif +{ +return( sin(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_sin.o b/tools/connec/libf2c/d_sin.o new file mode 100644 index 0000000000000000000000000000000000000000..2063d02e79c5b5a4ca6e43faf3a29a5d48a3b00b GIT binary patch literal 1368 zcmb_aJ4*vW5S~la#0MIKpb~{t;)5&^4T^%CiFpW7K@*78anTb+lR)kQ(LxIwOMiy7 zmAw}J3`+|Ov9b_!=CZ5na$1OU+|JB5^X=@;>{&XW@o5?e(O?O_Jb?m~d|$TinmY7A zH{{Nrf-ilcz$0O~^Sj`!8-#(D0_|iIv}Q<)^aO&JxG~`)JQgOs(i>Xq4FY6SsfFlx zvD~OSjp!Upuy|~y;d;}j)AKAoJJCWp_c!JDya9k8KQHk^yBCbv9Y5fKA8@>fBE#s1 z6pUQzu@^pwcvw2W+an?v+5ARwId5!aGF$0_QCLpq(+2Ds_Cb}xowT5|;ZLV~dv8e; zZ4w&ax4AO=xZ;>)V760l>3w0qKf~F{ zor6Ea(ZNBS93;$a-{W~%4q}?OGxMAI&Ad17^(>vwv}hU#(O?0-Jb?o2w0zlCU|JA^ zF36of=`TG-^pUXK`JH|n1fj2~Ks(t0?a0s)v8aBDg$WKEI*5$Yii>Kzy*I@~ zn}n|K+r2XHxZ*nnV4h!Z>awuv?xDkc_s9npm~PqLt2-4JSjq7nU;DkapWcGti~iGyQL6f4FAxh8UiLFIj~3PZE8jvc)l|&fadsWX)lq=q7kQ_kuW;NnQ=^>C(_8?*_86r)vD99!;iG@&U8xNkAP23>ZB$}OI?4cg= z2mBHJA%%L-i}(|IEVQ&GrydISz0FJ=*UhE)mbdS{Z{9a==FQAWsalR`8c5M#9d06t z0vtqce9Lz&n1(oP4!$RcMj|#eUSAE3+1k9`G=5$*4R(GMM|@*m-yEDJKYu04w;uqH zd@g|Y{tamTgqE6)>8DsQiTGnN#>j5WnDwa{Js(HEQY@~Ti`(^HoA=BWmSdUp^PV3q ze^`FOGTEmiRPe`{Xz0!WqWFbL6ds1bm_0EDkB!0gJ2+KL+(EG~h|MYM^m~CA%@CFk zyS8`OhmTGn_U#OOB#g%<-f@dNbzmOv zj_jWFy6!uNaktNb`L4TXH@i;D1-9#O2Uy+nfHgX;mfOaZc89yH@@hNnai_8G7rTd_ zDb^c20ZYs+`z6BLdqXgVO1-d9Rrw;CK=+Vj5|to%auQz>xbhqj!S~_+0kXnMBl$93 zKqsvJ?~wX*MZKYezT`=W;$ZJ->`Em35_SqL-S=Ss=v;$)C(0*L=m`ai1nbY@SQtMc7PX^r$qn-V E0?*H0O#lD@ literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_tan.c b/tools/connec/libf2c/d_tan.c new file mode 100644 index 0000000..7d252c4 --- /dev/null +++ b/tools/connec/libf2c/d_tan.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double tan(); +double d_tan(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_tan(doublereal *x) +#endif +{ +return( tan(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_tan.o b/tools/connec/libf2c/d_tan.o new file mode 100644 index 0000000000000000000000000000000000000000..a23f4632d9db0c3ed14863515ed60a8902554641 GIT binary patch literal 1368 zcmb_aJ4*vW5S}w?;scGrLQo-<_#jJyilQLrBM%`eXacc1F3Cwi6Ct;OXrYCTr9Z>k z%3ce9hNXptSXl@M#tDV!#TtJ&6JoI@-4BnI`l@ zA7n0`L$8D3;1gk)i~G=>7lh%K0^@WSjAqyv?GJ{ourT3cA{HUNF%aGw2mz$m*O#J` z`C_BS8_@+e&*HJ!hUX>D5{oQ8H`PJ~_cs;rJpn)fKR*dTmmiGT-9O;LA8!ACI{x3PQ^N?+f@fx+2%H|qU!=H9apPP4O42z z++peMe9Yx`>CkKT4_j3HuYLojs4eFu-0x>Ya1#u9dM^3;>?!?La9)J&MNRKrpC8?;es-c$*D5Cct!k8cb MO(gCsTrze3Cs7npZ2$lO literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/d_tanh.c b/tools/connec/libf2c/d_tanh.c new file mode 100644 index 0000000..415b585 --- /dev/null +++ b/tools/connec/libf2c/d_tanh.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double tanh(); +double d_tanh(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double d_tanh(doublereal *x) +#endif +{ +return( tanh(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/d_tanh.o b/tools/connec/libf2c/d_tanh.o new file mode 100644 index 0000000000000000000000000000000000000000..0b65463eb5b47f7fcaa9bfe08ea616d50b021f40 GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;scGrLWoEz@qtT3MNyFRk%tfsXaZUtmv|D;M96I*T4<5R(w|{% zWv_)l!_vY+tSkhbx$K(Fa$1NJ_Gadr`DS)!Hmu!8FXE1s6iP6bmc zr`%zwo&1c;?c%Z5>>oZcv0wcLOi^3TQMm1ALokYqW?|w|`ak*fr?(*avi|~Nl&ZhjE5!Unl>H8^phY$R$~TcqHT84K z{!D^KMl~vGrW?_1RPUo#4C*-HV$3jr#oPUiGsRonf(1D2X!)k^n$Qn@ zkiUM_-v?vS7vl2QPx_;ugy8@{yVwS;8Pi7lqxvl_O#B$n#R=C3Vw(dxKyGbq*_hlb zHELeNSY!((v817GB*swVCHMJz&1;99u_qyXpX|*q#lnOQNAsjvnE03NnHP?5lIBK~xIw|sa9(=; zzGC110wg#J5PA_$pcB^rC8R&SPN5h57m%Y;_2u3m7iN6f@6-xfe}Iwec;2WC<5b5Jw8@743McBql{H}jjXoq2Ds)45DQ(?Ey@tMFq97T_rGqwB7!Lj?L^ ztMwXwABcrsh}&vCg&$of40{0DSJi@uS=~M7SA^?L@->*^Q0m#ALD5 ztUJxbB3odo4H&MThFBpAfH#P*8}K6B>m&llLY7K z7~9U5*%vj(ECI8fhKE(5HLO#UIo7!Y%vG(bQE8Yp3)r#gn7~T54Xk`tt66mnsh>F( z%kCDFwqur0c)Nc?g1@hN5<0Ie_Q}om*^rFmL%Y!Nk>!~$VT6;kE26{+3Vw$3()D*U z4%~l$6h{FfU)U3<`1ODB=})&)k#4M|sH$yRqy;SW6Ljbk4oeU<9|=v>v=Ddmng8Ye>%wf`Xc{PM+1 K9ZI>Rs`+0Nf>N&l literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/dfe.c b/tools/connec/libf2c/dfe.c new file mode 100644 index 0000000..c6b10d0 --- /dev/null +++ b/tools/connec/libf2c/dfe.c @@ -0,0 +1,151 @@ +#include "f2c.h" +#include "fio.h" +#include "fmt.h" +#ifdef __cplusplus +extern "C" { +#endif + + int +y_rsk(Void) +{ + if(f__curunit->uend || f__curunit->url <= f__recpos + || f__curunit->url == 1) return 0; + do { + getc(f__cf); + } while(++f__recpos < f__curunit->url); + return 0; +} + + int +y_getc(Void) +{ + int ch; + if(f__curunit->uend) return(-1); + if((ch=getc(f__cf))!=EOF) + { + f__recpos++; + if(f__curunit->url>=f__recpos || + f__curunit->url==1) + return(ch); + else return(' '); + } + if(feof(f__cf)) + { + f__curunit->uend=1; + errno=0; + return(-1); + } + err(f__elist->cierr,errno,"readingd"); +} + + static int +y_rev(Void) +{ + if (f__recpos < f__hiwater) + f__recpos = f__hiwater; + if (f__curunit->url > 1) + while(f__recpos < f__curunit->url) + (*f__putn)(' '); + if (f__recpos) + f__putbuf(0); + f__recpos = 0; + return(0); +} + + static int +y_err(Void) +{ + err(f__elist->cierr, 110, "dfe"); +} + + static int +y_newrec(Void) +{ + y_rev(); + f__hiwater = f__cursor = 0; + return(1); +} + + int +#ifdef KR_headers +c_dfe(a) cilist *a; +#else +c_dfe(cilist *a) +#endif +{ + f__sequential=0; + f__formatted=f__external=1; + f__elist=a; + f__cursor=f__scale=f__recpos=0; + f__curunit = &f__units[a->ciunit]; + if(a->ciunit>MXUNIT || a->ciunit<0) + err(a->cierr,101,"startchk"); + if(f__curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit)) + err(a->cierr,104,"dfe"); + f__cf=f__curunit->ufd; + if(!f__curunit->ufmt) err(a->cierr,102,"dfe") + if(!f__curunit->useek) err(a->cierr,104,"dfe") + f__fmtbuf=a->cifmt; + if(a->cirec <= 0) + err(a->cierr,130,"dfe") + FSEEK(f__cf,(OFF_T)f__curunit->url * (a->cirec-1),SEEK_SET); + f__curunit->uend = 0; + return(0); +} +#ifdef KR_headers +integer s_rdfe(a) cilist *a; +#else +integer s_rdfe(cilist *a) +#endif +{ + int n; + if(!f__init) f_init(); + f__reading=1; + if(n=c_dfe(a))return(n); + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr,errno,"read start"); + f__getn = y_getc; + f__doed = rd_ed; + f__doned = rd_ned; + f__dorevert = f__donewrec = y_err; + f__doend = y_rsk; + if(pars_f(f__fmtbuf)<0) + err(a->cierr,100,"read start"); + fmt_bg(); + return(0); +} +#ifdef KR_headers +integer s_wdfe(a) cilist *a; +#else +integer s_wdfe(cilist *a) +#endif +{ + int n; + if(!f__init) f_init(); + f__reading=0; + if(n=c_dfe(a)) return(n); + if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr,errno,"startwrt"); + f__putn = x_putc; + f__doed = w_ed; + f__doned= w_ned; + f__dorevert = y_err; + f__donewrec = y_newrec; + f__doend = y_rev; + if(pars_f(f__fmtbuf)<0) + err(a->cierr,100,"startwrt"); + fmt_bg(); + return(0); +} +integer e_rdfe(Void) +{ + en_fio(); + return 0; +} +integer e_wdfe(Void) +{ + return en_fio(); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/dfe.o b/tools/connec/libf2c/dfe.o new file mode 100644 index 0000000000000000000000000000000000000000..3ecf3afb7cce8e2176ddf767400a70a299b4c9ed GIT binary patch literal 8080 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 DPsH(U literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/dolio.c b/tools/connec/libf2c/dolio.c new file mode 100644 index 0000000..4070d87 --- /dev/null +++ b/tools/connec/libf2c/dolio.c @@ -0,0 +1,26 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef KR_headers +extern int (*f__lioproc)(); + +integer do_lio(type,number,ptr,len) ftnint *number,*type; char *ptr; ftnlen len; +#else +extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint); + +integer do_lio(ftnint *type, ftnint *number, char *ptr, ftnlen len) +#endif +{ + return((*f__lioproc)(number,ptr,len,*type)); +} +#ifdef __cplusplus + } +#endif +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/dolio.o b/tools/connec/libf2c/dolio.o new file mode 100644 index 0000000000000000000000000000000000000000..29a280335a3c2102c1dc364be69bed1289d34b74 GIT binary patch literal 1344 zcmb_bJ4*vW5S~kXL=7>%K+xhU@qtT3MNyCgUnhu#U?CRq5-&tda+14%T4<3f*rfDl zSX&7Sia$Us{Q(yK06}N&c6GB{EW`=B^UXK&?c6?cvAVey(KHaI!4mvLf(0-l68511 zap(fG`W7>5?`G}UtUZ~R-Dd6KbAa;Zm07)y-Su;scD4=LNm3h%x5w((fcRma)5)(S zl6#35!20s?f(6! zP5AaEJnlm=I@4b1dvu@TO79m{+X+J&#(-D&q-*A7- zJuP}x2AJ!W1D_YDY!@u%*(V+_AKLkJu51-;UHv=j|)@{TU#| zy>LP=;t>R4{U1a6)2kDD(SH^>Dpg-(9l0>$%YLU85z(4|)f=d#HPwBJ{^OXFP4pLj z1Cs*FbvJS#VYQZG_3WwqmL{~9z(FT^`nRd)NB64kog`PhQ6B}8sr`E}7p8yZg}aiL HpsN1@t*KVs literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/dtime_.c b/tools/connec/libf2c/dtime_.c new file mode 100644 index 0000000..6a09b3e --- /dev/null +++ b/tools/connec/libf2c/dtime_.c @@ -0,0 +1,63 @@ +#include "time.h" + +#ifdef MSDOS +#undef USE_CLOCK +#define USE_CLOCK +#endif + +#ifndef REAL +#define REAL double +#endif + +#ifndef USE_CLOCK +#define _INCLUDE_POSIX_SOURCE /* for HP-UX */ +#define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ +#include "sys/types.h" +#include "sys/times.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif + +#undef Hz +#ifdef CLK_TCK +#define Hz CLK_TCK +#else +#ifdef HZ +#define Hz HZ +#else +#define Hz 60 +#endif +#endif + + REAL +#ifdef KR_headers +dtime_(tarray) float *tarray; +#else +dtime_(float *tarray) +#endif +{ +#ifdef USE_CLOCK +#ifndef CLOCKS_PER_SECOND +#define CLOCKS_PER_SECOND Hz +#endif + static double t0; + double t = clock(); + tarray[1] = 0; + tarray[0] = (t - t0) / CLOCKS_PER_SECOND; + t0 = t; + return tarray[0]; +#else + struct tms t; + static struct tms t0; + + times(&t); + tarray[0] = (double)(t.tms_utime - t0.tms_utime) / Hz; + tarray[1] = (double)(t.tms_stime - t0.tms_stime) / Hz; + t0 = t; + return tarray[0] + tarray[1]; +#endif + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/dtime_.o b/tools/connec/libf2c/dtime_.o new file mode 100644 index 0000000000000000000000000000000000000000..3eb1f1a8faafae319675ac4a5f38a1c247441044 GIT binary patch literal 1952 zcmbtU&rcIk5T15XDq^>wCM0<1p=!nOQi8^Y7}G+5O{`!9jM2npX}5tuA?a=nny3d( zmBe`Q|M2L+L;Z08{{oNR^k8CAE+(4j%c%q|#$eqw(!K(GX44~!hwDgA`TKfIwfj*!ayM420+7KC($5uX(56J$3tFVYS0@vAxnc;$O}vjP6Up${M|X)51p7e!Uo(R zfWgpvc{4`rbQgZA3l5?v9HYCBLSWrArsu2ot$ORMW<#ai0{bGA4?nJ=32Gcya* zi{@f}vN&yGJrcfSni##+pTE9bq##NZA6h%cvjn0LPSauhHi0P2=NowB!-qKYpDH-> zUn)4wiR87f4(ssVzLhxT(?)Xrq{OM8w(nXvkE^b=0>W`?zFuXkW^Y)+wYOamwXL${ zTB78*S#$`uSItVzs@fnZ0%FB+K$NzsReKZpn_I3eX6Kehz0u3F|3@Wd-|EKZWKrH1 z>9)Tkg2VXGOmg^yB_>z&iv;^n(|mZ-ha`SM;)BvZRC1WiXPkZ3v?oNR`G+MY^RI_N zv^kIAaWp#h|5f(SeNz9#<9x;^5u>BjFR~!d$55N7uz^vkspcciunit]; + if(a->ciunit>=MXUNIT || a->ciunit<0) + err(a->cierr,101,"startio"); + f__elist=a; + if(f__curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due"); + f__cf=f__curunit->ufd; + if(f__curunit->ufmt) err(a->cierr,102,"cdue") + if(!f__curunit->useek) err(a->cierr,104,"cdue") + if(f__curunit->ufd==NULL) err(a->cierr,114,"cdue") + if(a->cirec <= 0) + err(a->cierr,130,"due") + FSEEK(f__cf,(OFF_T)(a->cirec-1)*f__curunit->url,SEEK_SET); + f__curunit->uend = 0; + return(0); +} +#ifdef KR_headers +integer s_rdue(a) cilist *a; +#else +integer s_rdue(cilist *a) +#endif +{ + int n; + f__reading=1; + if(n=c_due(a)) return(n); + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr,errno,"read start"); + return(0); +} +#ifdef KR_headers +integer s_wdue(a) cilist *a; +#else +integer s_wdue(cilist *a) +#endif +{ + int n; + f__reading=0; + if(n=c_due(a)) return(n); + if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr,errno,"write start"); + return(0); +} +integer e_rdue(Void) +{ + if(f__curunit->url==1 || f__recpos==f__curunit->url) + return(0); + FSEEK(f__cf,(OFF_T)(f__curunit->url-f__recpos),SEEK_CUR); + if(FTELL(f__cf)%f__curunit->url) + err(f__elist->cierr,200,"syserr"); + return(0); +} +integer e_wdue(Void) +{ +#ifdef ALWAYS_FLUSH + if (fflush(f__cf)) + err(f__elist->cierr,errno,"write end"); +#endif + return(e_rdue()); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/due.o b/tools/connec/libf2c/due.o new file mode 100644 index 0000000000000000000000000000000000000000..42ff6a7c927b084c1cfd3d7de5ab650e092651f7 GIT binary patch literal 4976 zcmbuCU2GIp6vyv&5h|8#t%4#&S40Iv*OpSKh`QyY9k2?qkf3PBWjjk(w!1hxOA8W9 zT>DTqB*+UjG0KyP(L|#@RH8t{q>V2cVt6x>7^AiL{eg<1p8x$Q$LS6+ayIv4e&^hC z&fI(F&TRj>j<$+WNEiu;`^BXzLxpIlxzvx#Zd}X~Rie`xykHgYlf>IGa+R^NF4si> ztJGO(9h`R9I#{*ZIw;4{<)}5Ny2ZbeyH{Andxbam8~7X%4%Ne`ww;n>oQ5_-bplW# zsUH8r8k`UA_g-8zD!c}(qym&$tU;N!RqR_NynQm(HXSQP!-r9gA3i>vniJEglDdJD z-Urfjwl?jCDXOuqiHQl55`Z*Ns`X3-w@QWHSPZISUsM#92l%aGgMEH~x`@Fo!dpnw z8MOvZ_h+P&2W5Z}@f<}MMm07fEonMU-Y!(A#@>KRPbGj#PO4sDD!5T9>2SAHxf51$ zQ=L`)=Fi7St@LJwN8)j?VN_%7WG?rL+85XX(%HbtLX%aJ3n2}yV!tK41yVQop+p0x zy;^x!5lOA27_YE~^e)hems+H5{BsrqaRXz7t{{fK!P2fenP2f@sQUTmDOhPXLf&)6 z+iMliRW3ebC4WDrwz|AOmA$%G-IoKbZY69qX=bI_S(wYSuCEvrStl~$N zr_6!@NM}+t{^c*H5L*&ym-iB`m(GcX{EKHTKz?m^s!eYi$NF*%iKFUZ~Ts?(iKVgJlRK%&C zur{!-@(obOd01TQ<8numeVvcrB(K9_k&oX(*R?cnhp;C|8lcf?LR@r8=2{ zk<;fnZk9}_kApCs-GOde8)b97I1?2$&~=i#a(S4g5*`h8R4#UV$HvvI9rnhyw$62% z?ai&LJJ#8PLbz@=XJ>NB1Rc9sIV|V)Bs|aQ5~-bbZkHn=@{&#|=42*$$JvS7BQYlh zmUS+b3-l2HF>?rxXY>z+C+1Nf0)8tM!|@zKz^|iXcq1SQ_zhGHw*X1NZ=>?J_TLFe z0**7naPz$5B#bh?oB9xN&(9HN&+|XZIM4re#(DnlGyixu zo4BVL=lP!v;9oQU_(m{(zGwD4|MSeA=M&NIZK!cB89#S2&Y!y_n)}ziDZsvk+2af} z{vTlWJfBAy=jTQj^Alx$o?-U07$0Evd>)Q4`QVM literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/ef1asc_.c b/tools/connec/libf2c/ef1asc_.c new file mode 100644 index 0000000..70be0bc --- /dev/null +++ b/tools/connec/libf2c/ef1asc_.c @@ -0,0 +1,25 @@ +/* EFL support routine to copy string b to string a */ + +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + + +#define M ( (long) (sizeof(long) - 1) ) +#define EVEN(x) ( ( (x)+ M) & (~M) ) + +#ifdef KR_headers +extern VOID s_copy(); +ef1asc_(a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb; +#else +extern void s_copy(char*,char*,ftnlen,ftnlen); +int ef1asc_(ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) +#endif +{ +s_copy( (char *)a, (char *)b, EVEN(*la), *lb ); +return 0; /* ignored return value */ +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/ef1asc_.o b/tools/connec/libf2c/ef1asc_.o new file mode 100644 index 0000000000000000000000000000000000000000..3416fdcfcc62062ea10668594cf62bdf90ba3e8c GIT binary patch literal 1392 zcmb_bJ4*vW5S}w?;sc2yK2R`~PqHLvP!!~RBsn1{_$aK7OFRi^63Ja4T4<3f3u=BIuLQSijAiIfn(;$^vuTa^2>ISGM;p=Gs*k znCIGgbGK|2Y+yTjpi(b%R9PN)6Z$wvy&_0VP~a0BmwpG2k@r@B7`MU*zKDm>@vHypQ=h(0!58%t zh*7HgC;ZsYtvU4Q%)jz==Gr7j^|Vg)iq_$${jnxfH9tr}R6{ odEvGdE&Y{h|7fo2-HCF^3(qp$Km0E8D^$N&HU literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/ef1cmc_.c b/tools/connec/libf2c/ef1cmc_.c new file mode 100644 index 0000000..4b420ae --- /dev/null +++ b/tools/connec/libf2c/ef1cmc_.c @@ -0,0 +1,20 @@ +/* EFL support routine to compare two character strings */ + +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +integer ef1cmc_(a, la, b, lb) ftnint *a, *b; ftnlen *la, *lb; +#else +extern integer s_cmp(char*,char*,ftnlen,ftnlen); +integer ef1cmc_(ftnint *a, ftnlen *la, ftnint *b, ftnlen *lb) +#endif +{ +return( s_cmp( (char *)a, (char *)b, *la, *lb) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/ef1cmc_.o b/tools/connec/libf2c/ef1cmc_.o new file mode 100644 index 0000000000000000000000000000000000000000..e8d5c208b8d592b13c55288bc38fcb4fd0d6dfdd GIT binary patch literal 1384 zcmb_bOD_aL5U#Nv;}MpK2o8H89?{tiLP%shc6THj670cg%#M*wm?b;22@V{b#Kli> zc9IZhM?b;A!4Hs7HPcP&3Ea=b%ucQcOXSYYJ~Yl{m7Yb}@C$ZlGj3yX!U zg`v<%6QUjm<#>CKkV2h6?flkf<{x{3T>|C@)kv0wR(1Dn7Pv3@og*ZHBgq*zkb_zy|?SD^p^ literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/endfile.c b/tools/connec/libf2c/endfile.c new file mode 100644 index 0000000..04020d3 --- /dev/null +++ b/tools/connec/libf2c/endfile.c @@ -0,0 +1,160 @@ +#include "f2c.h" +#include "fio.h" + +/* Compile this with -DNO_TRUNCATE if unistd.h does not exist or */ +/* if it does not define int truncate(const char *name, off_t). */ + +#ifdef MSDOS +#undef NO_TRUNCATE +#define NO_TRUNCATE +#endif + +#ifndef NO_TRUNCATE +#include "unistd.h" +#endif + +#ifdef KR_headers +extern char *strcpy(); +extern FILE *tmpfile(); +#else +#undef abs +#undef min +#undef max +#include "stdlib.h" +#include "string.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif + +extern char *f__r_mode[], *f__w_mode[]; + +#ifdef KR_headers +integer f_end(a) alist *a; +#else +integer f_end(alist *a) +#endif +{ + unit *b; + FILE *tf; + + if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile"); + b = &f__units[a->aunit]; + if(b->ufd==NULL) { + char nbuf[10]; + sprintf(nbuf,"fort.%ld",(long)a->aunit); + if (tf = FOPEN(nbuf, f__w_mode[0])) + fclose(tf); + return(0); + } + b->uend=1; + return(b->useek ? t_runc(a) : 0); +} + +#ifdef NO_TRUNCATE + static int +#ifdef KR_headers +copy(from, len, to) FILE *from, *to; register long len; +#else +copy(FILE *from, register long len, FILE *to) +#endif +{ + int len1; + char buf[BUFSIZ]; + + while(fread(buf, len1 = len > BUFSIZ ? BUFSIZ : (int)len, 1, from)) { + if (!fwrite(buf, len1, 1, to)) + return 1; + if ((len -= len1) <= 0) + break; + } + return 0; + } +#endif /* NO_TRUNCATE */ + + int +#ifdef KR_headers +t_runc(a) alist *a; +#else +t_runc(alist *a) +#endif +{ + OFF_T loc, len; + unit *b; + int rc; + FILE *bf; +#ifdef NO_TRUNCATE + FILE *tf; +#endif + + b = &f__units[a->aunit]; + if(b->url) + return(0); /*don't truncate direct files*/ + loc=FTELL(bf = b->ufd); + FSEEK(bf,(OFF_T)0,SEEK_END); + len=FTELL(bf); + if (loc >= len || b->useek == 0) + return(0); +#ifdef NO_TRUNCATE + if (b->ufnm == NULL) + return 0; + rc = 0; + fclose(b->ufd); + if (!loc) { + if (!(bf = FOPEN(b->ufnm, f__w_mode[b->ufmt]))) + rc = 1; + if (b->uwrt) + b->uwrt = 1; + goto done; + } + if (!(bf = FOPEN(b->ufnm, f__r_mode[0])) + || !(tf = tmpfile())) { +#ifdef NON_UNIX_STDIO + bad: +#endif + rc = 1; + goto done; + } + if (copy(bf, (long)loc, tf)) { + bad1: + rc = 1; + goto done1; + } + if (!(bf = FREOPEN(b->ufnm, f__w_mode[0], bf))) + goto bad1; + rewind(tf); + if (copy(tf, (long)loc, bf)) + goto bad1; + b->uwrt = 1; + b->urw = 2; +#ifdef NON_UNIX_STDIO + if (b->ufmt) { + fclose(bf); + if (!(bf = FOPEN(b->ufnm, f__w_mode[3]))) + goto bad; + FSEEK(bf,(OFF_T)0,SEEK_END); + b->urw = 3; + } +#endif +done1: + fclose(tf); +done: + f__cf = b->ufd = bf; +#else /* NO_TRUNCATE */ + if (b->urw & 2) + fflush(b->ufd); /* necessary on some Linux systems */ +#ifndef FTRUNCATE +#define FTRUNCATE ftruncate +#endif + rc = FTRUNCATE(fileno(b->ufd), loc); + /* The following FSEEK is unnecessary on some systems, */ + /* but should be harmless. */ + FSEEK(b->ufd, (OFF_T)0, SEEK_END); +#endif /* NO_TRUNCATE */ + if (rc) + err(a->aerr,111,"endfile"); + return 0; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/endfile.o b/tools/connec/libf2c/endfile.o new file mode 100644 index 0000000000000000000000000000000000000000..ba366338960ef98f334424e9ee6fdc4d6ce835d0 GIT binary patch literal 3280 zcmbW3Urbw79LG;v7!}zaI-HoXq>0QSvYS>m#RX??DR7EaG67vO=1pnuwGE}0w6_k8 zQ)9*1bl0)BC5sUsjfqbhmnEAdnU(VDQ_xM%H-4pt^66JH8n`B zrmNKI7@}4)>T3CV*W$W);08{r_i5#J@XT3dS~;t{t*EyW)lEm2to7BC)xYkeEK$94 z-4FduoN&nd#7lS1|L96WD<9ND#9Ve_J&f1G{_;%HdYJ{V`mVm_TTfW=LnKifTxBVe z)rVDkRQ);WTiZzoihE44xW4bx)%0<~>WK2aRR-(Cj8N+d&=FjuzLhbnjnLKj z-6%flYq$U>co$A^iAADU)-F(Mx?7^wUR=E13e8Q_(&{}Xw`Dcii-QlR{QgOzOGVtVrR{_9)Uor6n#!^;T&BfFkvP0EFNWlY+{lgoMC7>%`i`UXj`> z{N`^#(=`7kmdhmSpLQzy>9b%BPJLr4Jr z8d-oeHNv3YBLmf@LfsKPoi|E20hO7`6LmB> z9#fL)_{hk_@T5Aa#FE1*Mw>6@3Z{6Do>3IwaSU|^7PA!n9|UedH# zwi#nyE8wO~OrA0|7=s99RA96@3Yk|P!pyt^kSSZ1-O0}X<8%ld?S$Loi0eWhWJz=UKbM`TaxW(tC4eY6g0}3D{T?kz9`?%jAQDA6Cob#|}|NQRA@czcLjlxH?(@wx;#~*7B^YHftJ`1#G;Dh{m zoCx-g`O<^Y3~? z?gAhJfRj4eSB;=lyBGd@M?P|6_jib)P-P v2|NDt&LZATc!uut!`g0?YPlH}z<#j1?bf|l{Cza?@4>)eS-abA-Tr?A*ib5} literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/erf_.c b/tools/connec/libf2c/erf_.c new file mode 100644 index 0000000..532fec6 --- /dev/null +++ b/tools/connec/libf2c/erf_.c @@ -0,0 +1,22 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef REAL +#define REAL double +#endif + +#ifdef KR_headers +double erf(); +REAL erf_(x) real *x; +#else +extern double erf(double); +REAL erf_(real *x) +#endif +{ +return( erf((double)*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/erf_.o b/tools/connec/libf2c/erf_.o new file mode 100644 index 0000000000000000000000000000000000000000..33628b07c6acd97c276f3d8e379a827ae842828b GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;ya3n5R0qC2QCo}ih`Vpc?d!A1!{9#;)Q@Ff!qb6g%&oJ{tRm? zOF;{NhNXp|U}GWZ%w<>C<+Knd?9I%#^UdtcZcdWfRFkHG5DgaK%M&QTcGH(_c%}iJ z&;gm#$55f?>H4K-H~2t!=JYmn1JLiq0BA?+pw+`#q%#;g$HasW@x1}kOWonM?hrsa zk(kp*wsN(yThnJ)j72A=YMwWFJUPpv)1wWPbAM9--wpr*`16whwD`do-TDI_`~k;4 z6rov$6^vY}*e9LSn+0O+xcuV5t`=ySV5YOH@x`pUno4aXH_gq(cs6N57xGA&anb4C z-W#H$O+wfA?OvI4SaPi#FvqPnbWvDU`@mwZU3Y1(RjXtJ+p}B?Sk7^P>oZlKd*WN2G1?##oh0{AsE3$voLVUa>s`-$iX($1c{py z_&CRR_`_)U)xYNR3GHwc6j=Pi{$yQ^@S7%S*SDf?AHT_@cy{q%1dsTZU$^|c^lOu^* SzZduX_^&*0N8*yH@;?CSR#eLX literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/erfc_.c b/tools/connec/libf2c/erfc_.c new file mode 100644 index 0000000..6f6c9f1 --- /dev/null +++ b/tools/connec/libf2c/erfc_.c @@ -0,0 +1,22 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef REAL +#define REAL double +#endif + +#ifdef KR_headers +double erfc(); +REAL erfc_(x) real *x; +#else +extern double erfc(double); +REAL erfc_(real *x) +#endif +{ +return( erfc((double)*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/erfc_.o b/tools/connec/libf2c/erfc_.o new file mode 100644 index 0000000000000000000000000000000000000000..be4d4940d901e2d8cbc7e891ea2a441403686434 GIT binary patch literal 1376 zcmbtT%`XE{5T8}FzDqlkjVOIOVSWu2`+0}+em07-ED#c2Ny?whO?8S zgg?Na;UFP#l`ylN$MdpvV4ByN`OVjxnYZVObh64YK#~D7@U2M{V7Ka9Hhs~AMreS= zi|0tL<>l_JWheYZ_~OMw|Y*T6WA8eNUy$Q33gyqj$u#21>QtIZLB)cpKZ ztba38DtM*Xgcuj`;n9+>jhu~4iul+-8RgjDSSYXqfDrzIC_a1( zWt(yzzh}fKLsau6wWk6OPBE9Yz)Gc8=4R8@N;0{g*swNc=h6www{fl}=GDmS@VtMN zDaJUh@yC9Jdy@C;3<%dNmifMviq4@eJm=U0;fv0`l`GnL2gIK3*&s5m3nF`z&pQQl zDI9r@NG)#;yPlmr;Bx)$c}C6j}ErU7tO<-*U_=^Lpg;P3iNaz3RPF$Tb)0B}E~_)kgQRLcMW literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/err.c b/tools/connec/libf2c/err.c new file mode 100644 index 0000000..80a3b74 --- /dev/null +++ b/tools/connec/libf2c/err.c @@ -0,0 +1,293 @@ +#include "sysdep1.h" /* here to get stat64 on some badly designed Linux systems */ +#include "f2c.h" +#ifdef KR_headers +#define Const /*nothing*/ +extern char *malloc(); +#else +#define Const const +#undef abs +#undef min +#undef max +#include "stdlib.h" +#endif +#include "fio.h" +#include "fmt.h" /* for struct syl */ + +/* Compile this with -DNO_ISATTY if unistd.h does not exist or */ +/* if it does not define int isatty(int). */ +#ifdef NO_ISATTY +#define isatty(x) 0 +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/*global definitions*/ +unit f__units[MXUNIT]; /*unit table*/ +flag f__init; /*0 on entry, 1 after initializations*/ +cilist *f__elist; /*active external io list*/ +icilist *f__svic; /*active internal io list*/ +flag f__reading; /*1 if reading, 0 if writing*/ +flag f__cplus,f__cblank; +Const char *f__fmtbuf; +flag f__external; /*1 if external io, 0 if internal */ +#ifdef KR_headers +int (*f__doed)(),(*f__doned)(); +int (*f__doend)(),(*f__donewrec)(),(*f__dorevert)(); +int (*f__getn)(); /* for formatted input */ +void (*f__putn)(); /* for formatted output */ +#else +int (*f__getn)(void); /* for formatted input */ +void (*f__putn)(int); /* for formatted output */ +int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*); +int (*f__dorevert)(void),(*f__donewrec)(void),(*f__doend)(void); +#endif +flag f__sequential; /*1 if sequential io, 0 if direct*/ +flag f__formatted; /*1 if formatted io, 0 if unformatted*/ +FILE *f__cf; /*current file*/ +unit *f__curunit; /*current unit*/ +int f__recpos; /*place in current record*/ +OFF_T f__cursor, f__hiwater; +int f__scale; +char *f__icptr; + +/*error messages*/ +Const char *F_err[] = +{ + "error in format", /* 100 */ + "illegal unit number", /* 101 */ + "formatted io not allowed", /* 102 */ + "unformatted io not allowed", /* 103 */ + "direct io not allowed", /* 104 */ + "sequential io not allowed", /* 105 */ + "can't backspace file", /* 106 */ + "null file name", /* 107 */ + "can't stat file", /* 108 */ + "unit not connected", /* 109 */ + "off end of record", /* 110 */ + "truncation failed in endfile", /* 111 */ + "incomprehensible list input", /* 112 */ + "out of free space", /* 113 */ + "unit not connected", /* 114 */ + "read unexpected character", /* 115 */ + "bad logical input field", /* 116 */ + "bad variable type", /* 117 */ + "bad namelist name", /* 118 */ + "variable not in namelist", /* 119 */ + "no end record", /* 120 */ + "variable count incorrect", /* 121 */ + "subscript for scalar variable", /* 122 */ + "invalid array section", /* 123 */ + "substring out of bounds", /* 124 */ + "subscript out of bounds", /* 125 */ + "can't read file", /* 126 */ + "can't write file", /* 127 */ + "'new' file exists", /* 128 */ + "can't append to file", /* 129 */ + "non-positive record number", /* 130 */ + "nmLbuf overflow" /* 131 */ +}; +#define MAXERR (sizeof(F_err)/sizeof(char *)+100) + + int +#ifdef KR_headers +f__canseek(f) FILE *f; /*SYSDEP*/ +#else +f__canseek(FILE *f) /*SYSDEP*/ +#endif +{ +#ifdef NON_UNIX_STDIO + return !isatty(fileno(f)); +#else + struct STAT_ST x; + + if (FSTAT(fileno(f),&x) < 0) + return(0); +#ifdef S_IFMT + switch(x.st_mode & S_IFMT) { + case S_IFDIR: + case S_IFREG: + if(x.st_nlink > 0) /* !pipe */ + return(1); + else + return(0); + case S_IFCHR: + if(isatty(fileno(f))) + return(0); + return(1); +#ifdef S_IFBLK + case S_IFBLK: + return(1); +#endif + } +#else +#ifdef S_ISDIR + /* POSIX version */ + if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) { + if(x.st_nlink > 0) /* !pipe */ + return(1); + else + return(0); + } + if (S_ISCHR(x.st_mode)) { + if(isatty(fileno(f))) + return(0); + return(1); + } + if (S_ISBLK(x.st_mode)) + return(1); +#else + Help! How does fstat work on this system? +#endif +#endif + return(0); /* who knows what it is? */ +#endif +} + + void +#ifdef KR_headers +f__fatal(n,s) char *s; +#else +f__fatal(int n, const char *s) +#endif +{ + if(n<100 && n>=0) perror(s); /*SYSDEP*/ + else if(n >= (int)MAXERR || n < -1) + { fprintf(stderr,"%s: illegal error number %d\n",s,n); + } + else if(n == -1) fprintf(stderr,"%s: end of file\n",s); + else + fprintf(stderr,"%s: %s\n",s,F_err[n-100]); + if (f__curunit) { + fprintf(stderr,"apparent state: unit %d ", + (int)(f__curunit-f__units)); + fprintf(stderr, f__curunit->ufnm ? "named %s\n" : "(unnamed)\n", + f__curunit->ufnm); + } + else + fprintf(stderr,"apparent state: internal I/O\n"); + if (f__fmtbuf) + fprintf(stderr,"last format: %s\n",f__fmtbuf); + fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing", + f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted", + f__external?"external":"internal"); + sig_die(" IO", 1); +} +/*initialization routine*/ + VOID +f_init(Void) +{ unit *p; + + f__init=1; + p= &f__units[0]; + p->ufd=stderr; + p->useek=f__canseek(stderr); + p->ufmt=1; + p->uwrt=1; + p = &f__units[5]; + p->ufd=stdin; + p->useek=f__canseek(stdin); + p->ufmt=1; + p->uwrt=0; + p= &f__units[6]; + p->ufd=stdout; + p->useek=f__canseek(stdout); + p->ufmt=1; + p->uwrt=1; +} + + int +#ifdef KR_headers +f__nowreading(x) unit *x; +#else +f__nowreading(unit *x) +#endif +{ + OFF_T loc; + int ufmt, urw; + extern char *f__r_mode[], *f__w_mode[]; + + if (x->urw & 1) + goto done; + if (!x->ufnm) + goto cantread; + ufmt = x->url ? 0 : x->ufmt; + loc = FTELL(x->ufd); + urw = 3; + if (!FREOPEN(x->ufnm, f__w_mode[ufmt|2], x->ufd)) { + urw = 1; + if(!FREOPEN(x->ufnm, f__r_mode[ufmt], x->ufd)) { + cantread: + errno = 126; + return 1; + } + } + FSEEK(x->ufd,loc,SEEK_SET); + x->urw = urw; + done: + x->uwrt = 0; + return 0; +} + + int +#ifdef KR_headers +f__nowwriting(x) unit *x; +#else +f__nowwriting(unit *x) +#endif +{ + OFF_T loc; + int ufmt; + extern char *f__w_mode[]; + + if (x->urw & 2) { + if (x->urw & 1) + FSEEK(x->ufd, (OFF_T)0, SEEK_CUR); + goto done; + } + if (!x->ufnm) + goto cantwrite; + ufmt = x->url ? 0 : x->ufmt; + if (x->uwrt == 3) { /* just did write, rewind */ + if (!(f__cf = x->ufd = + FREOPEN(x->ufnm,f__w_mode[ufmt],x->ufd))) + goto cantwrite; + x->urw = 2; + } + else { + loc=FTELL(x->ufd); + if (!(f__cf = x->ufd = + FREOPEN(x->ufnm, f__w_mode[ufmt | 2], x->ufd))) + { + x->ufd = NULL; + cantwrite: + errno = 127; + return(1); + } + x->urw = 3; + FSEEK(x->ufd,loc,SEEK_SET); + } + done: + x->uwrt = 1; + return 0; +} + + int +#ifdef KR_headers +err__fl(f, m, s) int f, m; char *s; +#else +err__fl(int f, int m, const char *s) +#endif +{ + if (!f) + f__fatal(m, s); + if (f__doend) + (*f__doend)(); + return errno = m; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/err.o b/tools/connec/libf2c/err.o new file mode 100644 index 0000000000000000000000000000000000000000..3e129ff88931039149f039801b05f2aac41b95c5 GIT binary patch literal 9512 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 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/exit_.c b/tools/connec/libf2c/exit_.c new file mode 100644 index 0000000..08e9d07 --- /dev/null +++ b/tools/connec/libf2c/exit_.c @@ -0,0 +1,43 @@ +/* This gives the effect of + + subroutine exit(rc) + integer*4 rc + stop + end + + * with the added side effect of supplying rc as the program's exit code. + */ + +#include "f2c.h" +#undef abs +#undef min +#undef max +#ifndef KR_headers +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +extern "C" { +#endif +extern void f_exit(void); +#endif + + void +#ifdef KR_headers +exit_(rc) integer *rc; +#else +exit_(integer *rc) +#endif +{ +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(*rc); + } +#ifdef __cplusplus +} +#endif +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/exit_.o b/tools/connec/libf2c/exit_.o new file mode 100644 index 0000000000000000000000000000000000000000..ad7cf80ecfec0cefbece813b3dc964df39d87cf9 GIT binary patch literal 1360 zcmbtT&n|OO5TC1jibhH-BuE+y@%N;H5E8CGZAlvB`&d}r+}0IBE9pH=N`!@_jio0L zkKr*qf`x?#kT7#Q!*ShieAArH%x~s5bIzP|uQK^;lVyR31&i?I2@0^?^kv(DX+r`! zVEy_fzJ9axEYTh|tnY_R%^)lT z2t?uF)sD0SPA+QWRDUQ>%eY;QPpOv&* z0OjjST_1{7@lIT&y_yCUnBJjtP;pBhsC`$vpbEYZs(4x|d1Xu~pK4F#Hg_j{?G}%@ z-G8eT?>BrCHdmH;vitpP2=?KkS=hKtdE_DVGDx!`NaiQ_7~{rs4;b6QKfpL^QNkC0 z2#u)zPZ9m;bqZhl&mcyr;g@@XSd?(t&(H!|RP(od8@W_7jms42KWc(#OMlTD24<$- zn~q@%PayKcv!~btC%m$5M@`>Ucz$%R;j= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/tools/connec/libf2c/f2c.h0 b/tools/connec/libf2c/f2c.h0 new file mode 100644 index 0000000..b94ee7c --- /dev/null +++ b/tools/connec/libf2c/f2c.h0 @@ -0,0 +1,223 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef long int integer; +typedef unsigned long int uinteger; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; +#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ +typedef long long longint; /* system-dependent */ +typedef unsigned long long ulongint; /* system-dependent */ +#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) +#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) +#endif + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long int flag; +typedef long int ftnlen; +typedef long int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + integer1 g; + shortint h; + integer i; + /* longint j; */ + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/tools/connec/libf2c/f2ch.add b/tools/connec/libf2c/f2ch.add new file mode 100644 index 0000000..a2acc17 --- /dev/null +++ b/tools/connec/libf2c/f2ch.add @@ -0,0 +1,162 @@ +/* If you are using a C++ compiler, append the following to f2c.h + for compiling libF77 and libI77. */ + +#ifdef __cplusplus +extern "C" { +extern int abort_(void); +extern double c_abs(complex *); +extern void c_cos(complex *, complex *); +extern void c_div(complex *, complex *, complex *); +extern void c_exp(complex *, complex *); +extern void c_log(complex *, complex *); +extern void c_sin(complex *, complex *); +extern void c_sqrt(complex *, complex *); +extern double d_abs(double *); +extern double d_acos(double *); +extern double d_asin(double *); +extern double d_atan(double *); +extern double d_atn2(double *, double *); +extern void d_cnjg(doublecomplex *, doublecomplex *); +extern double d_cos(double *); +extern double d_cosh(double *); +extern double d_dim(double *, double *); +extern double d_exp(double *); +extern double d_imag(doublecomplex *); +extern double d_int(double *); +extern double d_lg10(double *); +extern double d_log(double *); +extern double d_mod(double *, double *); +extern double d_nint(double *); +extern double d_prod(float *, float *); +extern double d_sign(double *, double *); +extern double d_sin(double *); +extern double d_sinh(double *); +extern double d_sqrt(double *); +extern double d_tan(double *); +extern double d_tanh(double *); +extern double derf_(double *); +extern double derfc_(double *); +extern integer do_fio(ftnint *, char *, ftnlen); +extern integer do_lio(ftnint *, ftnint *, char *, ftnlen); +extern integer do_uio(ftnint *, char *, ftnlen); +extern integer e_rdfe(void); +extern integer e_rdue(void); +extern integer e_rsfe(void); +extern integer e_rsfi(void); +extern integer e_rsle(void); +extern integer e_rsli(void); +extern integer e_rsue(void); +extern integer e_wdfe(void); +extern integer e_wdue(void); +extern integer e_wsfe(void); +extern integer e_wsfi(void); +extern integer e_wsle(void); +extern integer e_wsli(void); +extern integer e_wsue(void); +extern int ef1asc_(ftnint *, ftnlen *, ftnint *, ftnlen *); +extern integer ef1cmc_(ftnint *, ftnlen *, ftnint *, ftnlen *); +extern double erf(double); +extern double erf_(float *); +extern double erfc(double); +extern double erfc_(float *); +extern integer f_back(alist *); +extern integer f_clos(cllist *); +extern integer f_end(alist *); +extern void f_exit(void); +extern integer f_inqu(inlist *); +extern integer f_open(olist *); +extern integer f_rew(alist *); +extern int flush_(void); +extern void getarg_(integer *, char *, ftnlen); +extern void getenv_(char *, char *, ftnlen, ftnlen); +extern short h_abs(short *); +extern short h_dim(short *, short *); +extern short h_dnnt(double *); +extern short h_indx(char *, char *, ftnlen, ftnlen); +extern short h_len(char *, ftnlen); +extern short h_mod(short *, short *); +extern short h_nint(float *); +extern short h_sign(short *, short *); +extern short hl_ge(char *, char *, ftnlen, ftnlen); +extern short hl_gt(char *, char *, ftnlen, ftnlen); +extern short hl_le(char *, char *, ftnlen, ftnlen); +extern short hl_lt(char *, char *, ftnlen, ftnlen); +extern integer i_abs(integer *); +extern integer i_dim(integer *, integer *); +extern integer i_dnnt(double *); +extern integer i_indx(char *, char *, ftnlen, ftnlen); +extern integer i_len(char *, ftnlen); +extern integer i_mod(integer *, integer *); +extern integer i_nint(float *); +extern integer i_sign(integer *, integer *); +extern integer iargc_(void); +extern ftnlen l_ge(char *, char *, ftnlen, ftnlen); +extern ftnlen l_gt(char *, char *, ftnlen, ftnlen); +extern ftnlen l_le(char *, char *, ftnlen, ftnlen); +extern ftnlen l_lt(char *, char *, ftnlen, ftnlen); +extern void pow_ci(complex *, complex *, integer *); +extern double pow_dd(double *, double *); +extern double pow_di(double *, integer *); +extern short pow_hh(short *, shortint *); +extern integer pow_ii(integer *, integer *); +extern double pow_ri(float *, integer *); +extern void pow_zi(doublecomplex *, doublecomplex *, integer *); +extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *); +extern double r_abs(float *); +extern double r_acos(float *); +extern double r_asin(float *); +extern double r_atan(float *); +extern double r_atn2(float *, float *); +extern void r_cnjg(complex *, complex *); +extern double r_cos(float *); +extern double r_cosh(float *); +extern double r_dim(float *, float *); +extern double r_exp(float *); +extern double r_imag(complex *); +extern double r_int(float *); +extern double r_lg10(float *); +extern double r_log(float *); +extern double r_mod(float *, float *); +extern double r_nint(float *); +extern double r_sign(float *, float *); +extern double r_sin(float *); +extern double r_sinh(float *); +extern double r_sqrt(float *); +extern double r_tan(float *); +extern double r_tanh(float *); +extern void s_cat(char *, char **, integer *, integer *, ftnlen); +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +extern void s_copy(char *, char *, ftnlen, ftnlen); +extern int s_paus(char *, ftnlen); +extern integer s_rdfe(cilist *); +extern integer s_rdue(cilist *); +extern integer s_rnge(char *, integer, char *, integer); +extern integer s_rsfe(cilist *); +extern integer s_rsfi(icilist *); +extern integer s_rsle(cilist *); +extern integer s_rsli(icilist *); +extern integer s_rsne(cilist *); +extern integer s_rsni(icilist *); +extern integer s_rsue(cilist *); +extern int s_stop(char *, ftnlen); +extern integer s_wdfe(cilist *); +extern integer s_wdue(cilist *); +extern integer s_wsfe(cilist *); +extern integer s_wsfi(icilist *); +extern integer s_wsle(cilist *); +extern integer s_wsli(icilist *); +extern integer s_wsne(cilist *); +extern integer s_wsni(icilist *); +extern integer s_wsue(cilist *); +extern void sig_die(char *, int); +extern integer signal_(integer *, void (*)(int)); +extern integer system_(char *, ftnlen); +extern double z_abs(doublecomplex *); +extern void z_cos(doublecomplex *, doublecomplex *); +extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *); +extern void z_exp(doublecomplex *, doublecomplex *); +extern void z_log(doublecomplex *, doublecomplex *); +extern void z_sin(doublecomplex *, doublecomplex *); +extern void z_sqrt(doublecomplex *, doublecomplex *); + } +#endif diff --git a/tools/connec/libf2c/f77_aloc.c b/tools/connec/libf2c/f77_aloc.c new file mode 100644 index 0000000..f536099 --- /dev/null +++ b/tools/connec/libf2c/f77_aloc.c @@ -0,0 +1,44 @@ +#include "f2c.h" +#undef abs +#undef min +#undef max +#include "stdio.h" + +static integer memfailure = 3; + +#ifdef KR_headers +extern char *malloc(); +extern void exit_(); + + char * +F77_aloc(Len, whence) integer Len; char *whence; +#else +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +extern "C" { +#endif +extern void exit_(integer*); +#ifdef __cplusplus + } +#endif + + char * +F77_aloc(integer Len, const char *whence) +#endif +{ + char *rv; + unsigned int uLen = (unsigned int) Len; /* for K&R C */ + + if (!(rv = (char*)malloc(uLen))) { + fprintf(stderr, "malloc(%u) failure in %s\n", + uLen, whence); + exit_(&memfailure); + } + return rv; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/f77_aloc.o b/tools/connec/libf2c/f77_aloc.o new file mode 100644 index 0000000000000000000000000000000000000000..b2ef44e937a3351687b3dcd78229a86a9fa9aba4 GIT binary patch literal 1840 zcmbW0&1(};5WpwhVq=XVibAjod$7_L`bg9gDX7`he5lc)O+ZmuHtB|h=A-OxpnA}Q zC@xy4H~$Qeo3r#y*K;bvurUp5eflI2(G|^ z#}wd)a$u)>W*Uw{1hi6lt>FH-?*4T5zalTVyM-5@oN&SY^5Bv7aQBwG=YA_}pTyWl z>|A(#8SM}F=T&U?K+pdExn(q)o$B0dcV4X-jb_&})ka&LwWl#3;Do0j^yDstwql`~ z$W(Yoww;swG{x?q&O~ExCbVe$rJ_aE=acuRqj4=7%S6N45e)Z_lV4d`R_Dr)Z$K`U z(hYezz`G-0ZZ#YoY-ioHEYS1C)r?luS97_wY)LO^nPOH4c}G3LN#lqAz3<69@d>GM zdd!!69BY|hC60Y?s?2l5u@AU59Eg-1PXRu6oDbjZIPr7D&y&yUEg7d6kmeb)UX~nf zTCSh{o~&zq;u*X?W4s@u_PTG8E4DykY+a|12u%<+Or+(pj*7szPZGYavC^#Y)(*|dceG*h(Cyj3v-x<$?=Z9?Q?2^5s Zrg>@mWpG=^WN=jdD}r@@v9t&4{{mlFuFC)b literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/f77vers.c b/tools/connec/libf2c/f77vers.c new file mode 100644 index 0000000..70cd6fe --- /dev/null +++ b/tools/connec/libf2c/f77vers.c @@ -0,0 +1,97 @@ + char +_libf77_version_f2c[] = "\n@(#) LIBF77 VERSION (f2c) 20051004\n"; + +/* +2.00 11 June 1980. File version.c added to library. +2.01 31 May 1988. s_paus() flushes stderr; names of hl_* fixed + [ d]erf[c ] added + 8 Aug. 1989: #ifdefs for f2c -i2 added to s_cat.c + 29 Nov. 1989: s_cmp returns long (for f2c) + 30 Nov. 1989: arg types from f2c.h + 12 Dec. 1989: s_rnge allows long names + 19 Dec. 1989: getenv_ allows unsorted environment + 28 Mar. 1990: add exit(0) to end of main() + 2 Oct. 1990: test signal(...) == SIG_IGN rather than & 01 in main + 17 Oct. 1990: abort() calls changed to sig_die(...,1) + 22 Oct. 1990: separate sig_die from main + 25 Apr. 1991: minor, theoretically invisible tweaks to s_cat, sig_die + 31 May 1991: make system_ return status + 18 Dec. 1991: change long to ftnlen (for -i2) many places + 28 Feb. 1992: repair z_sqrt.c (scribbled on input, gave wrong answer) + 18 July 1992: for n < 0, repair handling of 0**n in pow_[dr]i.c + and m**n in pow_hh.c and pow_ii.c; + catch SIGTRAP in main() for error msg before abort + 23 July 1992: switch to ANSI prototypes unless KR_headers is #defined + 23 Oct. 1992: fix botch in signal_.c (erroneous deref of 2nd arg); + change Cabs to f__cabs. + 12 March 1993: various tweaks for C++ + 2 June 1994: adjust so abnormal terminations invoke f_exit just once + 16 Sept. 1994: s_cmp: treat characters as unsigned in comparisons. + 19 Sept. 1994: s_paus: flush after end of PAUSE; add -DMSDOS + 12 Jan. 1995: pow_[dhiqrz][hiq]: adjust x**i to work on machines + that sign-extend right shifts when i is the most + negative integer. + 26 Jan. 1995: adjust s_cat.c, s_copy.c to permit the left-hand side + of character assignments to appear on the right-hand + side (unless compiled with -DNO_OVERWRITE). + 27 Jan. 1995: minor tweak to s_copy.c: copy forward whenever + possible (for better cache behavior). + 30 May 1995: added subroutine exit(rc) integer rc. Version not changed. + 29 Aug. 1995: add F77_aloc.c; use it in s_cat.c and system_.c. + 6 Sept. 1995: fix return type of system_ under -DKR_headers. + 19 Dec. 1995: s_cat.c: fix bug when 2nd or later arg overlaps lhs. + 19 Mar. 1996: s_cat.c: supply missing break after overlap detection. + 13 May 1996: add [lq]bitbits.c and [lq]bitshft.c (f90 bit intrinsics). + 19 June 1996: add casts to unsigned in [lq]bitshft.c. + 26 Feb. 1997: adjust functions with a complex output argument + to permit aliasing it with input arguments. + (For now, at least, this is just for possible + benefit of g77.) + 4 April 1997: [cz]_div.c: tweaks invisible on most systems (that may + affect systems using gratuitous extra precision). + 19 Sept. 1997: [de]time_.c (Unix systems only): change return + type to double. + 2 May 1999: getenv_.c: omit environ in favor of getenv(). + c_cos.c, c_exp.c, c_sin.c, d_cnjg.c, r_cnjg.c, + z_cos.c, z_exp.c, z_log.c, z_sin.c: cope fully with + overlapping arguments caused by equivalence. + 3 May 1999: "invisible" tweaks to omit compiler warnings in + abort_.c, ef1asc_.c, s_rnge.c, s_stop.c. + + 7 Sept. 1999: [cz]_div.c: arrange for compilation under + -DIEEE_COMPLEX_DIVIDE to make these routines + avoid calling sig_die when the denominator + vanishes; instead, they return pairs of NaNs + or Infinities, depending whether the numerator + also vanishes or not. VERSION not changed. + 15 Nov. 1999: s_rnge.c: add casts for the case of + sizeof(ftnint) == sizeof(int) < sizeof(long). + 10 March 2000: z_log.c: improve accuracy of Real(log(z)) for, e.g., + z near (+-1,eps) with |eps| small. For the old + evaluation, compile with -DPre20000310 . + 20 April 2000: s_cat.c: tweak argument types to accord with + calls by f2c when ftnint and ftnlen are of + different sizes (different numbers of bits). + 4 July 2000: adjustments to permit compilation by C++ compilers; + VERSION string remains unchanged. + 29 Sept. 2000: dtime_.c, etime_.c: use floating-point divide. + dtime_.d, erf_.c, erfc_.c, etime.c: for use with + "f2c -R", compile with -DREAL=float. + 23 June 2001: add uninit.c; [fi]77vers.c: make version strings + visible as extern char _lib[fi]77_version_f2c[]. + 5 July 2001: modify uninit.c for __mc68k__ under Linux. + 16 Nov. 2001: uninit.c: Linux Power PC logic supplied by Alan Bain. + 18 Jan. 2002: fix glitches in qbit_bits(): wrong return type, + missing ~ on y in return value. + 14 March 2002: z_log.c: add code to cope with buggy compilers + (e.g., some versions of gcc under -O2 or -O3) + that do floating-point comparisons against values + computed into extended-precision registers on some + systems (such as Intel IA32 systems). Compile with + -DNO_DOUBLE_EXTENDED to omit the new logic. + 4 Oct. 2002: uninit.c: on IRIX systems, omit use of shell variables. + 10 Oct 2005: uninit.c: on IA32 Linux systems, leave the rounding + precision alone rather than forcing it to 53 bits; + compile with -DUNINIT_F2C_PRECISION_53 to get the + former behavior. +*/ diff --git a/tools/connec/libf2c/f77vers.o b/tools/connec/libf2c/f77vers.o new file mode 100644 index 0000000000000000000000000000000000000000..9b8dfb92805c7137b18d1d16ff97469f6c4fc31b GIT binary patch literal 1016 zcmbtTO;5r=5FI{L#1l6Y53VsrFtS+?Qscoi5+Ec5jRvozttAp|o6yDRMSp_+9FP7b ze}V3n9U%jpY_fg(-n`dor|ny_+e)WWfJX|>Va8Ae_?#2%M7CiQa*(%+`z6-xT(m5U z-8QdpI+s0G99F#&s|r!C2vN%ev>S~xR_wczP)?Y|>s*viCJC#&R!+I7m8R;fAKmHp zS@`~;y5^ascdYgFGP}|EGb$5klDQ@qEW^q(d0J4ZUe-8csBMM2<)N(&?D^LDRaj-}&0V5fiKj!Ns9u9K_S zgd?4M{fV@v&RV0Bw38~p-#iRw1`!U`CZ`t7`)D9Y`yZ>i)&%ik{)p(9N35GXvB5hP z496UnHDC61eHg=+!3~9a>1Wl)_7v2=v-s?~bY&Xt8Xp4fUr+@)JME2(v57&0H2(`Q CH9q+O literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/fio.h b/tools/connec/libf2c/fio.h new file mode 100644 index 0000000..ebf7696 --- /dev/null +++ b/tools/connec/libf2c/fio.h @@ -0,0 +1,141 @@ +#ifndef SYSDEP_H_INCLUDED +#include "sysdep1.h" +#endif +#include "stdio.h" +#include "errno.h" +#ifndef NULL +/* ANSI C */ +#include "stddef.h" +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +#ifndef FOPEN +#define FOPEN fopen +#endif + +#ifndef FREOPEN +#define FREOPEN freopen +#endif + +#ifndef FSEEK +#define FSEEK fseek +#endif + +#ifndef FSTAT +#define FSTAT fstat +#endif + +#ifndef FTELL +#define FTELL ftell +#endif + +#ifndef OFF_T +#define OFF_T long +#endif + +#ifndef STAT_ST +#define STAT_ST stat +#endif + +#ifndef STAT +#define STAT stat +#endif + +#ifdef MSDOS +#ifndef NON_UNIX_STDIO +#define NON_UNIX_STDIO +#endif +#endif + +#ifdef UIOLEN_int +typedef int uiolen; +#else +typedef long uiolen; +#endif + +/*units*/ +typedef struct +{ FILE *ufd; /*0=unconnected*/ + char *ufnm; +#ifndef MSDOS + long uinode; + int udev; +#endif + int url; /*0=sequential*/ + flag useek; /*true=can backspace, use dir, ...*/ + flag ufmt; + flag urw; /* (1 for can read) | (2 for can write) */ + flag ublnk; + flag uend; + flag uwrt; /*last io was write*/ + flag uscrtch; +} unit; + +#undef Void +#ifdef KR_headers +#define Void /*void*/ +extern int (*f__getn)(); /* for formatted input */ +extern void (*f__putn)(); /* for formatted output */ +extern void x_putc(); +extern long f__inode(); +extern VOID sig_die(); +extern int (*f__donewrec)(), t_putc(), x_wSL(); +extern int c_sfe(), err__fl(), xrd_SL(), f__putbuf(); +#else +#define Void void +#ifdef __cplusplus +extern "C" { +#endif +extern int (*f__getn)(void); /* for formatted input */ +extern void (*f__putn)(int); /* for formatted output */ +extern void x_putc(int); +extern long f__inode(char*,int*); +extern void sig_die(const char*,int); +extern void f__fatal(int, const char*); +extern int t_runc(alist*); +extern int f__nowreading(unit*), f__nowwriting(unit*); +extern int fk_open(int,int,ftnint); +extern int en_fio(void); +extern void f_init(void); +extern int (*f__donewrec)(void), t_putc(int), x_wSL(void); +extern void b_char(const char*,char*,ftnlen), g_char(const char*,ftnlen,char*); +extern int c_sfe(cilist*), z_rnew(void); +extern int err__fl(int,int,const char*); +extern int xrd_SL(void); +extern int f__putbuf(int); +#endif +extern flag f__init; +extern cilist *f__elist; /*active external io list*/ +extern flag f__reading,f__external,f__sequential,f__formatted; +extern int (*f__doend)(Void); +extern FILE *f__cf; /*current file*/ +extern unit *f__curunit; /*current unit*/ +extern unit f__units[]; +#define err(f,m,s) {if(f) errno= m; else f__fatal(m,s); return(m);} +#define errfl(f,m,s) return err__fl((int)f,m,s) + +/*Table sizes*/ +#define MXUNIT 100 + +extern int f__recpos; /*position in current record*/ +extern OFF_T f__cursor; /* offset to move to */ +extern OFF_T f__hiwater; /* so TL doesn't confuse us */ +#ifdef __cplusplus + } +#endif + +#define WRITE 1 +#define READ 2 +#define SEQ 3 +#define DIR 4 +#define FMT 5 +#define UNF 6 +#define EXT 7 +#define INT 8 + +#define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ) diff --git a/tools/connec/libf2c/fmt.c b/tools/connec/libf2c/fmt.c new file mode 100644 index 0000000..286c98f --- /dev/null +++ b/tools/connec/libf2c/fmt.c @@ -0,0 +1,530 @@ +#include "f2c.h" +#include "fio.h" +#include "fmt.h" +#ifdef __cplusplus +extern "C" { +#endif +#define skip(s) while(*s==' ') s++ +#ifdef interdata +#define SYLMX 300 +#endif +#ifdef pdp11 +#define SYLMX 300 +#endif +#ifdef vax +#define SYLMX 300 +#endif +#ifndef SYLMX +#define SYLMX 300 +#endif +#define GLITCH '\2' + /* special quote character for stu */ +extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/ +static struct syl f__syl[SYLMX]; +int f__parenlvl,f__pc,f__revloc; +#ifdef KR_headers +#define Const /*nothing*/ +#else +#define Const const +#endif + + static +#ifdef KR_headers +char *ap_end(s) char *s; +#else +const char *ap_end(const char *s) +#endif +{ char quote; + quote= *s++; + for(;*s;s++) + { if(*s!=quote) continue; + if(*++s!=quote) return(s); + } + if(f__elist->cierr) { + errno = 100; + return(NULL); + } + f__fatal(100, "bad string"); + /*NOTREACHED*/ return 0; +} + static int +#ifdef KR_headers +op_gen(a,b,c,d) +#else +op_gen(int a, int b, int c, int d) +#endif +{ struct syl *p= &f__syl[f__pc]; + if(f__pc>=SYLMX) + { fprintf(stderr,"format too complicated:\n"); + sig_die(f__fmtbuf, 1); + } + p->op=a; + p->p1=b; + p->p2.i[0]=c; + p->p2.i[1]=d; + return(f__pc++); +} +#ifdef KR_headers +static char *f_list(); +static char *gt_num(s,n,n1) char *s; int *n, n1; +#else +static const char *f_list(const char*); +static const char *gt_num(const char *s, int *n, int n1) +#endif +{ int m=0,f__cnt=0; + char c; + for(c= *s;;c = *s) + { if(c==' ') + { s++; + continue; + } + if(c>'9' || c<'0') break; + m=10*m+c-'0'; + f__cnt++; + s++; + } + if(f__cnt==0) { + if (!n1) + s = 0; + *n=n1; + } + else *n=m; + return(s); +} + + static +#ifdef KR_headers +char *f_s(s,curloc) char *s; +#else +const char *f_s(const char *s, int curloc) +#endif +{ + skip(s); + if(*s++!='(') + { + return(NULL); + } + if(f__parenlvl++ ==1) f__revloc=curloc; + if(op_gen(RET1,curloc,0,0)<0 || + (s=f_list(s))==NULL) + { + return(NULL); + } + skip(s); + return(s); +} + + static int +#ifdef KR_headers +ne_d(s,p) char *s,**p; +#else +ne_d(const char *s, const char **p) +#endif +{ int n,x,sign=0; + struct syl *sp; + switch(*s) + { + default: + return(0); + case ':': (void) op_gen(COLON,0,0,0); break; + case '$': + (void) op_gen(NONL, 0, 0, 0); break; + case 'B': + case 'b': + if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0); + else (void) op_gen(BN,0,0,0); + break; + case 'S': + case 's': + if(*(s+1)=='s' || *(s+1) == 'S') + { x=SS; + s++; + } + else if(*(s+1)=='p' || *(s+1) == 'P') + { x=SP; + s++; + } + else x=S; + (void) op_gen(x,0,0,0); + break; + case '/': (void) op_gen(SLASH,0,0,0); break; + case '-': sign=1; + case '+': s++; /*OUTRAGEOUS CODING TRICK*/ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + if (!(s=gt_num(s,&n,0))) { + bad: *p = 0; + return 1; + } + switch(*s) + { + default: + return(0); + case 'P': + case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break; + case 'X': + case 'x': (void) op_gen(X,n,0,0); break; + case 'H': + case 'h': + sp = &f__syl[op_gen(H,n,0,0)]; + sp->p2.s = (char*)s + 1; + s+=n; + break; + } + break; + case GLITCH: + case '"': + case '\'': + sp = &f__syl[op_gen(APOS,0,0,0)]; + sp->p2.s = (char*)s; + if((*p = ap_end(s)) == NULL) + return(0); + return(1); + case 'T': + case 't': + if(*(s+1)=='l' || *(s+1) == 'L') + { x=TL; + s++; + } + else if(*(s+1)=='r'|| *(s+1) == 'R') + { x=TR; + s++; + } + else x=T; + if (!(s=gt_num(s+1,&n,0))) + goto bad; + s--; + (void) op_gen(x,n,0,0); + break; + case 'X': + case 'x': (void) op_gen(X,1,0,0); break; + case 'P': + case 'p': (void) op_gen(P,1,0,0); break; + } + s++; + *p=s; + return(1); +} + + static int +#ifdef KR_headers +e_d(s,p) char *s,**p; +#else +e_d(const char *s, const char **p) +#endif +{ int i,im,n,w,d,e,found=0,x=0; + Const char *sv=s; + s=gt_num(s,&n,1); + (void) op_gen(STACK,n,0,0); + switch(*s++) + { + default: break; + case 'E': + case 'e': x=1; + case 'G': + case 'g': + found=1; + if (!(s=gt_num(s,&w,0))) { + bad: + *p = 0; + return 1; + } + if(w==0) break; + if(*s=='.') { + if (!(s=gt_num(s+1,&d,0))) + goto bad; + } + else d=0; + if(*s!='E' && *s != 'e') + (void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */ + else { + if (!(s=gt_num(s+1,&e,0))) + goto bad; + (void) op_gen(x==1?EE:GE,w,d,e); + } + break; + case 'O': + case 'o': + i = O; + im = OM; + goto finish_I; + case 'Z': + case 'z': + i = Z; + im = ZM; + goto finish_I; + case 'L': + case 'l': + found=1; + if (!(s=gt_num(s,&w,0))) + goto bad; + if(w==0) break; + (void) op_gen(L,w,0,0); + break; + case 'A': + case 'a': + found=1; + skip(s); + if(*s>='0' && *s<='9') + { s=gt_num(s,&w,1); + if(w==0) break; + (void) op_gen(AW,w,0,0); + break; + } + (void) op_gen(A,0,0,0); + break; + case 'F': + case 'f': + if (!(s=gt_num(s,&w,0))) + goto bad; + found=1; + if(w==0) break; + if(*s=='.') { + if (!(s=gt_num(s+1,&d,0))) + goto bad; + } + else d=0; + (void) op_gen(F,w,d,0); + break; + case 'D': + case 'd': + found=1; + if (!(s=gt_num(s,&w,0))) + goto bad; + if(w==0) break; + if(*s=='.') { + if (!(s=gt_num(s+1,&d,0))) + goto bad; + } + else d=0; + (void) op_gen(D,w,d,0); + break; + case 'I': + case 'i': + i = I; + im = IM; + finish_I: + if (!(s=gt_num(s,&w,0))) + goto bad; + found=1; + if(w==0) break; + if(*s!='.') + { (void) op_gen(i,w,0,0); + break; + } + if (!(s=gt_num(s+1,&d,0))) + goto bad; + (void) op_gen(im,w,d,0); + break; + } + if(found==0) + { f__pc--; /*unSTACK*/ + *p=sv; + return(0); + } + *p=s; + return(1); +} + static +#ifdef KR_headers +char *i_tem(s) char *s; +#else +const char *i_tem(const char *s) +#endif +{ const char *t; + int n,curloc; + if(*s==')') return(s); + if(ne_d(s,&t)) return(t); + if(e_d(s,&t)) return(t); + s=gt_num(s,&n,1); + if((curloc=op_gen(STACK,n,0,0))<0) return(NULL); + return(f_s(s,curloc)); +} + + static +#ifdef KR_headers +char *f_list(s) char *s; +#else +const char *f_list(const char *s) +#endif +{ + for(;*s!=0;) + { skip(s); + if((s=i_tem(s))==NULL) return(NULL); + skip(s); + if(*s==',') s++; + else if(*s==')') + { if(--f__parenlvl==0) + { + (void) op_gen(REVERT,f__revloc,0,0); + return(++s); + } + (void) op_gen(GOTO,0,0,0); + return(++s); + } + } + return(NULL); +} + + int +#ifdef KR_headers +pars_f(s) char *s; +#else +pars_f(const char *s) +#endif +{ + f__parenlvl=f__revloc=f__pc=0; + if(f_s(s,0) == NULL) + { + return(-1); + } + return(0); +} +#define STKSZ 10 +int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp; +flag f__workdone, f__nonl; + + static int +#ifdef KR_headers +type_f(n) +#else +type_f(int n) +#endif +{ + switch(n) + { + default: + return(n); + case RET1: + return(RET1); + case REVERT: return(REVERT); + case GOTO: return(GOTO); + case STACK: return(STACK); + case X: + case SLASH: + case APOS: case H: + case T: case TL: case TR: + return(NED); + case F: + case I: + case IM: + case A: case AW: + case O: case OM: + case L: + case E: case EE: case D: + case G: case GE: + case Z: case ZM: + return(ED); + } +} +#ifdef KR_headers +integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr; +#else +integer do_fio(ftnint *number, char *ptr, ftnlen len) +#endif +{ struct syl *p; + int n,i; + for(i=0;i<*number;i++,ptr+=len) + { +loop: switch(type_f((p= &f__syl[f__pc])->op)) + { + default: + fprintf(stderr,"unknown code in do_fio: %d\n%s\n", + p->op,f__fmtbuf); + err(f__elist->cierr,100,"do_fio"); + case NED: + if((*f__doned)(p)) + { f__pc++; + goto loop; + } + f__pc++; + continue; + case ED: + if(f__cnt[f__cp]<=0) + { f__cp--; + f__pc++; + goto loop; + } + if(ptr==NULL) + return((*f__doend)()); + f__cnt[f__cp]--; + f__workdone=1; + if((n=(*f__doed)(p,ptr,len))>0) + errfl(f__elist->cierr,errno,"fmt"); + if(n<0) + err(f__elist->ciend,(EOF),"fmt"); + continue; + case STACK: + f__cnt[++f__cp]=p->p1; + f__pc++; + goto loop; + case RET1: + f__ret[++f__rp]=p->p1; + f__pc++; + goto loop; + case GOTO: + if(--f__cnt[f__cp]<=0) + { f__cp--; + f__rp--; + f__pc++; + goto loop; + } + f__pc=1+f__ret[f__rp--]; + goto loop; + case REVERT: + f__rp=f__cp=0; + f__pc = p->p1; + if(ptr==NULL) + return((*f__doend)()); + if(!f__workdone) return(0); + if((n=(*f__dorevert)()) != 0) return(n); + goto loop; + case COLON: + if(ptr==NULL) + return((*f__doend)()); + f__pc++; + goto loop; + case NONL: + f__nonl = 1; + f__pc++; + goto loop; + case S: + case SS: + f__cplus=0; + f__pc++; + goto loop; + case SP: + f__cplus = 1; + f__pc++; + goto loop; + case P: f__scale=p->p1; + f__pc++; + goto loop; + case BN: + f__cblank=0; + f__pc++; + goto loop; + case BZ: + f__cblank=1; + f__pc++; + goto loop; + } + } + return(0); +} + + int +en_fio(Void) +{ ftnint one=1; + return(do_fio(&one,(char *)NULL,(ftnint)0)); +} + + VOID +fmt_bg(Void) +{ + f__workdone=f__cp=f__rp=f__pc=f__cursor=0; + f__cnt[0]=f__ret[0]=0; +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/fmt.h b/tools/connec/libf2c/fmt.h new file mode 100644 index 0000000..ddfa551 --- /dev/null +++ b/tools/connec/libf2c/fmt.h @@ -0,0 +1,105 @@ +struct syl +{ int op; + int p1; + union { int i[2]; char *s;} p2; + }; +#define RET1 1 +#define REVERT 2 +#define GOTO 3 +#define X 4 +#define SLASH 5 +#define STACK 6 +#define I 7 +#define ED 8 +#define NED 9 +#define IM 10 +#define APOS 11 +#define H 12 +#define TL 13 +#define TR 14 +#define T 15 +#define COLON 16 +#define S 17 +#define SP 18 +#define SS 19 +#define P 20 +#define BN 21 +#define BZ 22 +#define F 23 +#define E 24 +#define EE 25 +#define D 26 +#define G 27 +#define GE 28 +#define L 29 +#define A 30 +#define AW 31 +#define O 32 +#define NONL 33 +#define OM 34 +#define Z 35 +#define ZM 36 +typedef union +{ real pf; + doublereal pd; +} ufloat; +typedef union +{ short is; +#ifndef KR_headers + signed +#endif + char ic; + integer il; +#ifdef Allow_TYQUAD + longint ili; +#endif +} Uint; +#ifdef KR_headers +extern int (*f__doed)(),(*f__doned)(); +extern int (*f__dorevert)(); +extern int rd_ed(),rd_ned(); +extern int w_ed(),w_ned(); +extern int signbit_f2c(); +extern char *f__fmtbuf; +#else +#ifdef __cplusplus +extern "C" { +#define Cextern extern "C" +#else +#define Cextern extern +#endif +extern const char *f__fmtbuf; +extern int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*); +extern int (*f__dorevert)(void); +extern void fmt_bg(void); +extern int pars_f(const char*); +extern int rd_ed(struct syl*, char*, ftnlen),rd_ned(struct syl*); +extern int signbit_f2c(double*); +extern int w_ed(struct syl*, char*, ftnlen),w_ned(struct syl*); +extern int wrt_E(ufloat*, int, int, int, ftnlen); +extern int wrt_F(ufloat*, int, int, ftnlen); +extern int wrt_L(Uint*, int, ftnlen); +#endif +extern int f__pc,f__parenlvl,f__revloc; +extern flag f__cblank,f__cplus,f__workdone, f__nonl; +extern int f__scale; +#ifdef __cplusplus + } +#endif +#define GET(x) if((x=(*f__getn)())<0) return(x) +#define VAL(x) (x!='\n'?x:' ') +#define PUT(x) (*f__putn)(x) + +#undef TYQUAD +#ifndef Allow_TYQUAD +#undef longint +#define longint long +#else +#define TYQUAD 14 +#endif + +#ifdef KR_headers +extern char *f__icvt(); +#else +Cextern char *f__icvt(longint, int*, int*, int); +#endif diff --git a/tools/connec/libf2c/fmt.o b/tools/connec/libf2c/fmt.o new file mode 100644 index 0000000000000000000000000000000000000000..4e3d258a0013f1e6ac024656dd7939d4794d4bfb GIT binary patch literal 17744 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 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/fmtlib.c b/tools/connec/libf2c/fmtlib.c new file mode 100644 index 0000000..279f66f --- /dev/null +++ b/tools/connec/libf2c/fmtlib.c @@ -0,0 +1,51 @@ +/* @(#)fmtlib.c 1.2 */ +#define MAXINTLENGTH 23 + +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifndef Allow_TYQUAD +#undef longint +#define longint long +#undef ulongint +#define ulongint unsigned long +#endif + +#ifdef KR_headers +char *f__icvt(value,ndigit,sign, base) longint value; int *ndigit,*sign; + register int base; +#else +char *f__icvt(longint value, int *ndigit, int *sign, int base) +#endif +{ + static char buf[MAXINTLENGTH+1]; + register int i; + ulongint uvalue; + + if(value > 0) { + uvalue = value; + *sign = 0; + } + else if (value < 0) { + uvalue = -value; + *sign = 1; + } + else { + *sign = 0; + *ndigit = 1; + buf[MAXINTLENGTH-1] = '0'; + return &buf[MAXINTLENGTH-1]; + } + i = MAXINTLENGTH; + do { + buf[--i] = (uvalue%base) + '0'; + uvalue /= base; + } + while(uvalue > 0); + *ndigit = MAXINTLENGTH - i; + return &buf[i]; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/fmtlib.o b/tools/connec/libf2c/fmtlib.o new file mode 100644 index 0000000000000000000000000000000000000000..8bfba656b6309c0cce13f406b483dbe51ca5c8cc GIT binary patch literal 1480 zcmbu8&1(}u6u{qRHLco1Emp;N*ppbb!})NTp5!bGlvwZ(jy**I z2DxL~6Q&1aZ~^@7qs`}i5qz|B83TT}SL#ku#$xB2-}(EMO#kptcf&1ydXV!w{pF88 zEq}Y$+TXc?p~q8$PX1}Q=XcLiX2}}tV$XIV>DkZIX1P;mvH$++*(Dsf6k^ zC)jr8qyTLEWr+>qJ%&OyDytd24;YWy9GEbpYI(I8)FNPS z0v-UX#4)h2QL9CDOsO|`#Fn0|OvgM3*V6u{G#sp_{hBA?AtOoWnYh}d6Hq`!^Yjuo z{XdXHcrD2})P&RtUX}c|Xm;3jjZ)w$cAbiTA#j7Rj>FQGTN8< z<^D#NCGxe>(0#P1r&)g>Gt@e&fbOR*9y-+1)gjud{+7Yj`bsZjT-kc+wJeyCOKIlp tsgEP;d*q;;$A@mEIX^X5%F*SAtf#mx=C= MXUNIT || Unit < 0) + f__fatal(101, who); + return f__units[Unit].ufd; + } + + longint +#ifdef KR_headers +ftell64_(Unit) integer *Unit; +#else +ftell64_(integer *Unit) +#endif +{ + FILE *f; + return (f = unit_chk(*Unit, "ftell")) ? FTELL(f) : -1L; + } + + int +#ifdef KR_headers +fseek64_(Unit, offset, whence) integer *Unit, *whence; longint *offset; +#else +fseek64_(integer *Unit, longint *offset, integer *whence) +#endif +{ + FILE *f; + int w = (int)*whence; +#ifdef SEEK_SET + static int wohin[3] = { SEEK_SET, SEEK_CUR, SEEK_END }; +#endif + if (w < 0 || w > 2) + w = 0; +#ifdef SEEK_SET + w = wohin[w]; +#endif + return !(f = unit_chk(*Unit, "fseek")) + || FSEEK(f, (OFF_T)*offset, w) ? 1 : 0; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/ftell_.c b/tools/connec/libf2c/ftell_.c new file mode 100644 index 0000000..0acd60f --- /dev/null +++ b/tools/connec/libf2c/ftell_.c @@ -0,0 +1,52 @@ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif + + static FILE * +#ifdef KR_headers +unit_chk(Unit, who) integer Unit; char *who; +#else +unit_chk(integer Unit, const char *who) +#endif +{ + if (Unit >= MXUNIT || Unit < 0) + f__fatal(101, who); + return f__units[Unit].ufd; + } + + integer +#ifdef KR_headers +ftell_(Unit) integer *Unit; +#else +ftell_(integer *Unit) +#endif +{ + FILE *f; + return (f = unit_chk(*Unit, "ftell")) ? ftell(f) : -1L; + } + + int +#ifdef KR_headers +fseek_(Unit, offset, whence) integer *Unit, *offset, *whence; +#else +fseek_(integer *Unit, integer *offset, integer *whence) +#endif +{ + FILE *f; + int w = (int)*whence; +#ifdef SEEK_SET + static int wohin[3] = { SEEK_SET, SEEK_CUR, SEEK_END }; +#endif + if (w < 0 || w > 2) + w = 0; +#ifdef SEEK_SET + w = wohin[w]; +#endif + return !(f = unit_chk(*Unit, "fseek")) + || fseek(f, *offset, w) ? 1 : 0; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/ftell_.o b/tools/connec/libf2c/ftell_.o new file mode 100644 index 0000000000000000000000000000000000000000..ac54b0d51f9830fa9d7ae1be97d71dbd188c9c5f GIT binary patch literal 2208 zcmbW1O=uHA6vrpo)YjT=qEv`hXuuCt?2@RhMXF?zrrkrd&<_-=Y}0mQrAaEu2CEbm zLxmCpUKGK*6i+>fiWh?(yopE8JqbMvfen}r7(}KxQ+6%3=ADyACTzekz( zSTJgJ4Xtiy)v`VRNfx&wTy44;rgPyDJJek`eSq!RF7YnQ{MPe6?E zk!13GXO02!n;gNmU{$0;5YdpYg-$=v0?W5 z2!sT5_?{;GXcMk9;X_S0Q_{&O{$lop((T(t&bnUws_A+*V`g$pA4!iU)U-Z2JUpJ7 z&?nSHIz>`lFBfi^B`U$J7lAzP>0WAo@aB*mrWl4Dl&J}hy9k3Gry+PhAQ|*QYJyKw z41*p`@MSh>qa<--o6Vq7<6%Qo=hp-&6}AS@@CQY z^CBu5xr|~OOD0o_i*vNG!b2NVV$_AgnAfw#Ox|FMt(hs6m@>PV&l?5GEG(LaGIDvc zw`68!7x*f6?jn?m=W^fUI5C*@wX;L(-?;|>-PEvWacWLm=#l8koC&m<#71a+p}ZKo=nU&3XvP#SZZ8;{W-=G=0 && *n; zxUbsL>%Q`TtJ0^|tm^ax`fNaiUX3s0u(KFBoxV_hUzI*={Mg%mPuahHP1I*hyZLKx z8_{XvDB{I^5Y2HhIhrrL!7}5>&c`bNEu&#+Vc~{zai!d->4q~aXJm2eS|grKx2NZ1 z@%p8Nvi|^`%j^(94u4sagCkiOy^jvy`2oCeh*L*TS^MGtdJH-BAT47EvN)^-+N-av zLKDBw;;&D!BPIbIKjr)rC34QN*+1|T1K+5=e*Ly-P@wHnmWrM9jExpa4BD%76;#FYDQMf;}xrccC0M#6nfW{EG` zq$hC<<8X1<;+S_+G?02ob@(JF48LNy^~~axo>{+YG%Jqh`2{qx>fbX7xenE*Tgvgw zXOPjp(l_`!vMf1pw&*aAgL3|Byo<4vllz2bEL{IG1EaY<>pRHVwq4I=!31~}vmhK&eR80Isnpl#K{|oJqg+TxS literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/getenv_.c b/tools/connec/libf2c/getenv_.c new file mode 100644 index 0000000..b615a37 --- /dev/null +++ b/tools/connec/libf2c/getenv_.c @@ -0,0 +1,62 @@ +#include "f2c.h" +#undef abs +#ifdef KR_headers +extern char *F77_aloc(), *getenv(); +#else +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +extern char *F77_aloc(ftnlen, const char*); +#endif + +/* + * getenv - f77 subroutine to return environment variables + * + * called by: + * call getenv (ENV_NAME, char_var) + * where: + * ENV_NAME is the name of an environment variable + * char_var is a character variable which will receive + * the current value of ENV_NAME, or all blanks + * if ENV_NAME is not defined + */ + +#ifdef KR_headers + VOID +getenv_(fname, value, flen, vlen) char *value, *fname; ftnlen vlen, flen; +#else + void +getenv_(char *fname, char *value, ftnlen flen, ftnlen vlen) +#endif +{ + char buf[256], *ep, *fp; + integer i; + + if (flen <= 0) + goto add_blanks; + for(i = 0; i < sizeof(buf); i++) { + if (i == flen || (buf[i] = fname[i]) == ' ') { + buf[i] = 0; + ep = getenv(buf); + goto have_ep; + } + } + while(i < flen && fname[i] != ' ') + i++; + strncpy(fp = F77_aloc(i+1, "getenv_"), fname, (int)i); + fp[i] = 0; + ep = getenv(fp); + free(fp); + have_ep: + if (ep) + while(*ep && vlen-- > 0) + *value++ = *ep++; + add_blanks: + while(vlen-- > 0) + *value++ = ' '; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/getenv_.o b/tools/connec/libf2c/getenv_.o new file mode 100644 index 0000000000000000000000000000000000000000..62cb9cbff622fd233a69de533b8803161162a840 GIT binary patch literal 2160 zcmbW1QD_ur5P)ZMXL7Z1?-T_gG2MqKF_7(Etz08gvX@-)pPZ)Xr3h-*%VpDu$)&y9 zE83QraEWBGCkmy{zUgBgBric4h{is&FNsh3Bm@*w>VrtZD%Y9a|Ht+2wiE|;XXg87 z{+XTqcP}MU{SA@?LL~Sc-g<%pXj|UeJ&xG}+n^crFZCfkJ#>Q2{29SKX1`3@zmKph z!MzbzDczFxD$A~? z?7x_O-vRn+unki7-;TrV6=81fT%!2ZU@P|fM69y8M^-Gn7?@qQv}8HmUO76qG1cZ& zE!~sm6BTz2`*`u=(1L79FUhA0x@Z;tRd571!FKaE{F6FDSx21_mI*tG+fMC zMJ1*lRJE=HMaPRyML$!uPxrf&*ZMCNpjT5z0uZP}0cp^OH~R1Q@t996XI&2K)O@B+^D&kEap_jOI-f>yTV`6*QoxX}+$w@(btm zrs%u~e$&IZdH8J)-|FGNdU)8w*F4-C{{=rvRJYj^ukd*4^PSVC7A{U$nPE`zkzG9| zth_m%Q7!X=1!{hBBx7YLCaOl!r4@6`7|mxUOi*bJ)Zsz_)a>NMgqg#P+@xiy1ILEC zoXPU)@2?czcl8PH;aiGx$K7|I5n&5nG?N~@yb|J{(k%{YmNXynW$fmBALpNNU#Oq? zFh#uJV#Y!r;`uaxuiW4PXT1>Z>iy{dT(AEH-oNOR`X?mv1@A*frE0$5>V`0eMD*=? z07uZEJ>NHfkngF94Ta|QJB81+s4w(M= 0) + return(*x); +return(- *x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_abs.o b/tools/connec/libf2c/h_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..45d22f1eb9d2b8748a18fe464205b52b94cf3de3 GIT binary patch literal 1184 zcmbu8%}T>S5XUEt+WLX5;z6i~dJ!vjY4H;U2~_PxM8uxUrltfmtu$MxB6`)EPa(d6 zS3h2$kKl87a;KfG>)Kp&A^c~4ng7i0roG)e*pFEjsAa(pd}oRRd}z?=Vh6@y43f|B z`?uQbXR^@AcHRMI$YNa`gVj!1>4|vaL3&e?&(XU{QYaORTbaeO+p3FJW`nJv$P^DDI`4?JL}TyS7+7y_#{g21cGl6pgUtaMn;g@RYl zXwv^AP5U%&z@fJN^HKieOp-0g2buXLj;MZ_R7pYwr1MhoYdMrFxu8L_1ki^wlwa|@ zWLRp;M_<=^qQ%sWLOBpF)_McaQI$ lsNjWkR4V?O&HF=co*gYd4Kn`$=KQG${~Z;cU^8u*{x82)K2rby literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/h_dim.c b/tools/connec/libf2c/h_dim.c new file mode 100644 index 0000000..443427a --- /dev/null +++ b/tools/connec/libf2c/h_dim.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +shortint h_dim(a,b) shortint *a, *b; +#else +shortint h_dim(shortint *a, shortint *b) +#endif +{ +return( *a > *b ? *a - *b : 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_dim.o b/tools/connec/libf2c/h_dim.o new file mode 100644 index 0000000000000000000000000000000000000000..9a65efaf4a0eae0490c736f4ad3cb58597418d0a GIT binary patch literal 1192 zcmbtUJ4*vW5T47ai4V9a5`NL~c8-3xRcDD>zZqH;qIIHcD|X}xyQ}^;X%YOKrRDz;oFlez^6jmJ=%tG7z3+o zS>43l+v0m|>*EPGtisDHz;rJLz_>aBqZ2oh6Vcec$PpL(EbS!-A)m`_rxuFkc7wN5 z8*Ghb(ktzrm%YwzvdrpYpOx_;Xb$Wgz=X&^g$Y9;{BQ_A62eD+@i?w2rJvxe^-}fJ z14xkqJ5xpr!2C;(J7s~q)yKNDxZB~tTJE{S+%8; zyDVQQrhV>I&ZyG=AW41d6R;_5a6a;XoJnx=;zCY;5+@YDOei5H4Z=Br__S>DC3L9J z3=ycq8d5L$jNmZT6qmYgRY$QYZNRJx3v>QezazAm6Z=q?tiPm^!j|= 0. ? floor(*x + .5) : -floor(.5 - *x)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_dnnt.o b/tools/connec/libf2c/h_dnnt.o new file mode 100644 index 0000000000000000000000000000000000000000..de119be7aa449b6bb61bb56d8857096452bf9265 GIT binary patch literal 2160 zcmcJP&1+LZ5WpvWwW->6V^I;S7z8DjbV-_4iwBJa+a8J(X<9*{zI;3anxrHz5d&xy{9=kL9+nJsHdb@vjV|6SP0+tZmf_{rB zKzF=vrj}fXlj)=8;;=wev&~9PxMQwj^#MU=#U-84o75<9I^eOC*tq1il_|O+5RtC9I>Moq_WX`{qp^` zM-mxNcXb=!mnZwahy!k))<)>XeF!xpp}DE>_0+VLr)aI!f%*ZU>vsLV1e2dgLtL|;Q%9G!Q=>jd;~uc z;ND#f&T~R}1~Z&gJUD;aUz(ApRYO&0RBgezK2p|sRgVY!FCm{b_VdqK$&E|`uu4*u zqH2+sLv^M681W|}jVPU>Q5QRAX zB+Q!xQHY!4zfv?f{u_gvE3*E)?Akeyb+_i}5?i(6Q(L;l zrVFxGE!eIt^L2N{Y$UH^i@b`ZU8iQ3iy+AlWUgKZnXi`1Mci#!sk%kEb}ze7ckTQW zJ(GV^v>sZAcmMihrM21VBV`S&8OaW|+X5zqe%>s1|3_sEnz9UnI#+MJj19W;im|FQmMd7ZR=dTltK`6e<- z<$n?0>ipO>Abz}!y)@?E#y`YZ8Z&{#6wW_yLbN$Q>w>{d*H7$V!Xduo=HGh?Y3uj{ nt?8c?Sp54(Z;pTMh+thqx?iUFr*#TDhs8Jb`OzC^ia-80Bcu2a literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/h_indx.c b/tools/connec/libf2c/h_indx.c new file mode 100644 index 0000000..018f2f4 --- /dev/null +++ b/tools/connec/libf2c/h_indx.c @@ -0,0 +1,32 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +shortint h_indx(a, b, la, lb) char *a, *b; ftnlen la, lb; +#else +shortint h_indx(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +ftnlen i, n; +char *s, *t, *bend; + +n = la - lb + 1; +bend = b + lb; + +for(i = 0 ; i < n ; ++i) + { + s = a + i; + t = b; + while(t < bend) + if(*s++ != *t++) + goto no; + return((shortint)i+1); + no: ; + } +return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_indx.o b/tools/connec/libf2c/h_indx.o new file mode 100644 index 0000000000000000000000000000000000000000..fde0c2b79fa6b8fdd0120565a305287573c4062f GIT binary patch literal 1264 zcmbtSO-my|5UqA}{RCYR6|;vdf~?EhMEpzy37e=L5D&7R%|u5cnh2R5h#vG1Jmetw z6Z{oHJOy)*l|}I8fAHi*WG~t^(>>D;deMTJdhboWs-BuTT3B9eA_PP3s**4IPy+Xk%ijv|Ux9HN!+L+DFjUB)BXFx=l@toleBxTdA%qqQl zCn1iA3$^faN>O{lJrzGUz-Q%+-Sx}d`U1a>5!}~)$ e{O)KumxEM2Y8c`9UxoIT|4tVEab3YJ?0*4bFI{H< literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/h_len.c b/tools/connec/libf2c/h_len.c new file mode 100644 index 0000000..8b0aea9 --- /dev/null +++ b/tools/connec/libf2c/h_len.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +shortint h_len(s, n) char *s; ftnlen n; +#else +shortint h_len(char *s, ftnlen n) +#endif +{ +return(n); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_len.o b/tools/connec/libf2c/h_len.o new file mode 100644 index 0000000000000000000000000000000000000000..bd937f1330cb0efd63bbb376bef44922d2067406 GIT binary patch literal 1176 zcmbtT%}T>S5S}z@>(8Nz2caJ7MO5t4;x7sks9F!=LF~DvbtPbvLbHYHLA`qO3B*Sc zdrG#J8dHn;KPjfB}0- z_7#Y(Z2Lk6jq9!-N)T7R@aYjvnJ;S&Q|&pG=0+Kn9Ug6K z4{QEazpu4e6X!6E`>&a#_PIafp~0D{FJ@r)tYZped-r(uiVtmX$rE5wBYw^H{*brt Yj*?4iWd8%~{(<;uphB3;9<2U28m8I z(V2Ms_`H96MLgY|1F)`+!D=V1R6H7cP~N2Cvosecg+e~Rm0l>8TXoq=Z-_OK&8)P# zS?(scDYC1JJ<9bVY7g8ofDMs>4jYC-_;3gx3E|OS9It6g+fVG~dssw-U(e0uwo@g;G+b8QP!ZrWu-&S5+6ZfGH?!Tl%6?1>qU5)9bPkN%o>|=zvdG|Q? mOa(8bqe}5>Ht!F)d3LnasFC>xnEfY1{C8A%f{SUx^nU@== 0 ? floor(*x + .5) : -floor(.5 - *x)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_nint.o b/tools/connec/libf2c/h_nint.o new file mode 100644 index 0000000000000000000000000000000000000000..2093f8294b6ebc7411eec1b2ceafb7869b5bfb99 GIT binary patch literal 2264 zcmbu9&1+LZ5WpvmZK~F8EDFUc#)A?|yCkO7;z0vJ>!B3UrWH}@Ys@2}Ni}(us9^Ob zccIQ`$8dL3BeiY zcuWCC`#W~pHPawq7`8<;BBVQ6wztLAT1#AUJzK<^EfGCLv1os=#lmOwk1AjOxSwiW z5EC_9{Q88(IL^o4wnU>j&2j^s?;Ul&nh>OQF=@J0DqLMcZCByVSk@C zLJu!Ns2UB84Mhewu;EeU2ld=f4xY_qPRHWem9>(y7CR-UWnwb5=6cD;$r+iLI<6?k z_t4?M69ow4FG#|$BM4)(+Y;Yg7zTWdKo|yl@SQ#Qt{!~1kE=WC-@n?4fB$L)|Ng1( zfY0mQ>3+@Cyz98b0e9?o&#OZL4x=+-^tpY8axRkq9FjDoXgEQ`6b;i*ST5ZvIhY&K zi}j(VF8tOPN$mrGI6VXNBWRNlAHqNLBtaD7^oB5BB#1(M82`*45k&E>|6F0;`Y#P` zu3s~_x&AkU3$(dz%-~($8(Dc!bgUJS6{oCpfvs}>jwPLZ)d5*vy=gg?%vBt0WXG8? zo#aXMC?#K5w#!yA50a8Vu2d=@bF0N-9$PO3-w^g$r+VZkbUxSN zb-6z4bdUUtIzPsVTJw9x`m)ZaduhsDoj+khw7D+hc{GChSJe;5`=|cV8F4=I>&U2- z_Y3n%*T<= 0 ? *a : - *a); +return( *b >= 0 ? x : -x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/h_sign.o b/tools/connec/libf2c/h_sign.o new file mode 100644 index 0000000000000000000000000000000000000000..9ba089953d6d81f7aef26c4eafe063b91775eaf4 GIT binary patch literal 1192 zcmbu9y-or_5Xa{{75qp*V_|{?Hb#tWAbv&@atSIH#==NqM-Dv1=pBYz6131l8#`NH z!uSRnd;w~oz&EgU2WHQ8}O_|N=y{yV#S7jCxqb_NUs~(gXWtLMtO1>~L`|cdTgn_;m69z;0PzWCm;gMe)uWM4-PjJ>+ z$v-{uAW06~nR2xN%)fNGT^7n4J*~-zJ1q{Z;hfvdsg5~X^{qAw@nF?M>M}*?ntluAU{p@JDphmJD84kVwgkb&r_@98|uqVN= 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/hl_ge.o b/tools/connec/libf2c/hl_ge.o new file mode 100644 index 0000000000000000000000000000000000000000..920dce849814b77a1d80256c03b14676328191c3 GIT binary patch literal 1376 zcmb_aJ4*vW5S}wW;sc4IAgB-!#0M@B6-7ZWiFpV?#Rq70UgBv$FOl2@qJ~pwUS) z+EnBHqb^~zN$48C-7j;_ZP&~KbKFv0=Y>_WPEF=o6&ILiT6yEBWZD+6L(?^ZWgQ1t zu4vm<0YeH!*J7#l-6_X4b0=Q0e^|o&yy{KpJa=P0-2c`aVuSe8EOh*3sq(-94z{Bv zNZg>nCpj)Xe~+=}tpE|Og%W(>kD}pMzvfe)UZ>!T`g4d;sQPkm5c3nBwz0K@7Ulda zUq>$GRQnY5CvZ;|QD5ja+!VGPcP~4Vt;UkC&Yr>_IOmn?4%GDC)%nrAs=X8Cju#ps UM-sJu5AON##i8~kE}1I-6HE|Q=l}o! literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/hl_gt.c b/tools/connec/libf2c/hl_gt.c new file mode 100644 index 0000000..a448522 --- /dev/null +++ b/tools/connec/libf2c/hl_gt.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +shortlogical hl_gt(a,b,la,lb) char *a, *b; ftnlen la, lb; +#else +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +shortlogical hl_gt(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +return(s_cmp(a,b,la,lb) > 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/hl_gt.o b/tools/connec/libf2c/hl_gt.o new file mode 100644 index 0000000000000000000000000000000000000000..52e7f0ea650b088274bce51e9e21fe872f032aa5 GIT binary patch literal 1376 zcmb<-^>JfjWMqH=Mg}_u1P><4z>vU%U^{@B4h%dD+zcMgZ#Z6n_#UkX_~#$s-*&*G z`3T2h1`)6t1_s8eAO^+?0Y+&ac8&=^gF)glP&siB?ZPJz#K*zF;O^{frJxa-RGL>( zs$i~Xs%M~UTngqH))`vp8JK87M4@`|QOsCi7`=_L%s@yWRb4Ds$h{!WfQ@&0aZ!LA|kA&yQy zuJI7VU_N01azU>7^B)2fAkqw=Xhex$z2eH;lEfqiz2cH02%Q0A6{Y4R>XoEclrZRl znW-7^X+?>-sSJ84i6w~)dP&8_40_4=xw)x%KqYzkC8>JuexbU>C5g$|Q0pkB6rk=! zj|m5;$*}N*a#8&T6qE*HP*^wsF*3LS4Fn0OASaLp3Bh6zCaw(?M@s%+9T8xXfx!Su z!zh@37+(#@z-IpoEcSy^Crm%gep8?rNGW>C?Es2l15jh(Qr18g$V_teI{@{9%tZGm z%ziDP95R5}52HPSk}x*1x=qL&BsRKQ5Fb74LCSYP^?ZQRTtFI>r_jR>6tC!h2WeRW bwMZGnK?3OZ3j*b^>4!Ng5=k$JiLM_2vu0K? literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/hl_le.c b/tools/connec/libf2c/hl_le.c new file mode 100644 index 0000000..31cbc43 --- /dev/null +++ b/tools/connec/libf2c/hl_le.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +shortlogical hl_le(a,b,la,lb) char *a, *b; ftnlen la, lb; +#else +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +shortlogical hl_le(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +return(s_cmp(a,b,la,lb) <= 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/hl_le.o b/tools/connec/libf2c/hl_le.o new file mode 100644 index 0000000000000000000000000000000000000000..6fea3105b74bea985d6674a65502b4becd80219e GIT binary patch literal 1376 zcmb<-^>JfjWMqH=Mg}_u1P><4z>vU%U^{@B4h%dD+zcMgZ#Z6n_#UkX_~#wq-*&*G z`3T2h1`)6t1_s8eAO^+?0Y+&ac8&=^gF)glP&siB?ZPJz#K*zF;O^{frJxa-RGL>( zs$i~Xs%M~UTngqH))`vp8JK87M4@`|QOsCi7`IjIcA@yWRb4Ds$h{!WfQ@&0aZ!LA|kA&yQy zuJI7VU_N01azU>7^B)2fAkqw=Xhex$z2eH;lEfqiz2cH02%Q0A6{Y4R>XoEclrZRl znW-7^X+?>-sSJ84i6w~)dP&8_40_4=xw)x%KqYzkC8>JuexbU>C5g$|Q0pkB6rk=! zj|m5;$*}N*a#8&T6qE*HP*^wsF*3LS4Fn0OASaLp3Bh6zCaw(?M@s%+9T8xXfx!Su z!zh@37+(#@z-IpoEcSy^Crm%gep8?rNGW>C?Es2l15jh(Qr18g$V_teI{@{9%tZGm z%ziDP95R5}52HPSk}x*1x=qL&BsRKQ5Fb74LCSYP^?ZQRTtFI>r_jR>6tC!h2WeRW bwMZGnK?3OZ3j*b^>4!Ng5=k$JiLM_2iCR`B literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/hl_lt.c b/tools/connec/libf2c/hl_lt.c new file mode 100644 index 0000000..7ad3c71 --- /dev/null +++ b/tools/connec/libf2c/hl_lt.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +shortlogical hl_lt(a,b,la,lb) char *a, *b; ftnlen la, lb; +#else +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +shortlogical hl_lt(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +return(s_cmp(a,b,la,lb) < 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/hl_lt.o b/tools/connec/libf2c/hl_lt.o new file mode 100644 index 0000000000000000000000000000000000000000..4c289f538fc59f1ada3c151013384663a55ae9ee GIT binary patch literal 1376 zcmb_a%}OId5Uw%)#9yL#Scr#!AnuAyL`6|pCu)9#xPlu&PqUNkNWe^#Ob6719=v$; zF+6+nD!UKhW8|=heE>nLCSBS#lRYff&{I`k)mPPB-Iv*7uFJB3#e%Q!<}nKJqwCGK zL(_&K7=*&rpLmP>!b5AVaP>R>D-6PTTY+`H3)X4EN)GkKZ?G`o6Dl@FdUGVPJrW1V zZ)~ijruWLtx@@MF#G**g&NoAE?qY6Pq!&K7QN{h2ibb9PAckL*#Goe%#_Zk>cwYw` z&tVA7GGSokQiU;XpW!SJ8^#rt4}nwhPoP?JY7(4$ac4bKbaryN@7a=5%B&Z&4iZuL zB;9CJkEiFhq|hdzYkYUVA~^GB$oP!HwdWr)_QO9wT4`3yXMYNfsQ#^p{`5MT&;1t>qg3o3p3%d&T*y^Z;sl@8 fort.nnn except for STATUS='SCRATCH' +rdfmt.c + use atof(); trust EOF == end-of-file (so don't read past + end-of-file after endfile stmt) +sfe.c + flush stderr, stdout at end of each stmt +wrtfmt.c: + use upper case + put wrt_E and wrt_F into wref.c, use sprintf() + rather than ecvt() and fcvt() [more accurate on VAX] +*/ + +/* 16 Oct. 1988: uwrt = 3 after write, rewind, so close won't zap the file. */ + +/* 10 July 1989: change _bufend to buf_end in fio.h, wsfe.c, wrtfmt.c */ + +/* 28 Nov. 1989: corrections for IEEE and Cray arithmetic */ +/* 29 Nov. 1989: change various int return types to long for f2c */ +/* 30 Nov. 1989: various types from f2c.h */ +/* 6 Dec. 1989: types corrected various places */ +/* 19 Dec. 1989: make iostat= work right for internal I/O */ +/* 8 Jan. 1990: add rsne, wsne -- routines for handling NAMELIST */ +/* 28 Jan. 1990: have NAMELIST read treat $ as &, general white + space as blank */ +/* 27 Mar. 1990: change an = to == in rd_L(rdfmt.c) so formatted reads + of logical values reject letters other than fFtT; + have nowwriting reset cf */ +/* 14 Aug. 1990: adjust lread.c to treat tabs as spaces in list input */ +/* 17 Aug. 1990: adjust open.c to recognize blank='Z...' as well as + blank='z...' when reopening an open file */ +/* 30 Aug. 1990: prevent embedded blanks in list output of complex values; + omit exponent field in list output of values of + magnitude between 10 and 1e8; prevent writing stdin + and reading stdout or stderr; don't close stdin, stdout, + or stderr when reopening units 5, 6, 0. */ +/* 18 Sep. 1990: add component udev to unit and consider old == new file + iff uinode and udev values agree; use stat rather than + access to check existence of file (when STATUS='OLD')*/ +/* 2 Oct. 1990: adjust rewind.c so two successive rewinds after a write + don't clobber the file. */ +/* 9 Oct. 1990: add #include "fcntl.h" to endfile.c, err.c, open.c; + adjust g_char in util.c for segmented memories. */ +/* 17 Oct. 1990: replace abort() and _cleanup() with calls on + sig_die(...,1) (defined in main.c). */ +/* 5 Nov. 1990: changes to open.c: complain if new= is specified and the + file already exists; allow file= to be omitted in open stmts + and allow status='replace' (Fortran 90 extensions). */ +/* 11 Dec. 1990: adjustments for POSIX. */ +/* 15 Jan. 1991: tweak i_ungetc in rsli.c to allow reading from + strings in read-only memory. */ +/* 25 Apr. 1991: adjust namelist stuff to work with f2c -i2 */ +/* 26 Apr. 1991: fix some bugs with NAMELIST read of multi-dim. arrays */ +/* 16 May 1991: increase LEFBL in lio.h to bypass NeXT bug */ +/* 17 Oct. 1991: change type of length field in sequential unformatted + records from int to long (for systems where sizeof(int) + can vary, depending on the compiler or compiler options). */ +/* 14 Nov. 1991: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c. */ +/* 25 Nov. 1991: change uint to Uint in lwrite.c; change sizeof(int) to + sizeof(uioint) in fseeks in sue.c (missed on 17 Oct.). */ +/* 1 Dec. 1991: uio.c: add test for read failure (seq. unformatted reads); + adjust an error return from EOF to off end of record */ +/* 12 Dec. 1991: rsli.c: fix bug with internal list input that caused + the last character of each record to be ignored. + iio.c: adjust error message in internal formatted + input from "end-of-file" to "off end of record" if + the format specifies more characters than the + record contains. */ +/* 17 Jan. 1992: lread.c, rsne.c: in list and namelist input, + treat "r* ," and "r*," alike (where r is a + positive integer constant), and fix a bug in + handling null values following items with repeat + counts (e.g., 2*1,,3); for namelist reading + of a numeric array, allow a new name-value subsequence + to terminate the current one (as though the current + one ended with the right number of null values). + lio.h, lwrite.c: omit insignificant zeros in + list and namelist output. To get the old + behavior, compile with -DOld_list_output . */ +/* 18 Jan. 1992: make list output consistent with F format by + printing .1 rather than 0.1 (introduced yesterday). */ +/* 3 Feb. 1992: rsne.c: fix namelist read bug that caused the + character following a comma to be ignored. */ +/* 19 May 1992: adjust iio.c, ilnw.c, rdfmt.c and rsli.c to make err= + work with internal list and formatted I/O. */ +/* 18 July 1992: adjust rsne.c to allow namelist input to stop at + an & (e.g. &end). */ +/* 23 July 1992: switch to ANSI prototypes unless KR_headers is #defined ; + recognize Z format (assuming 8-bit bytes). */ +/* 14 Aug. 1992: tweak wrt_E in wref.c to avoid -NaN */ +/* 23 Oct. 1992: Supply missing l_eof = 0 assignment to s_rsne() in rsne.c + (so end-of-file on other files won't confuse namelist + reads of external files). Prepend f__ to external + names that are only of internal interest to lib[FI]77. */ +/* 1 Feb. 1993: backspace.c: fix bug that bit when last char of 2nd + buffer == '\n'. + endfile.c: guard against tiny L_tmpnam; close and reopen + files in t_runc(). + lio.h: lengthen LINTW (buffer size in lwrite.c). + err.c, open.c: more prepending of f__ (to [rw]_mode). */ +/* 5 Feb. 1993: tweaks to NAMELIST: rsne.c: ? prints the namelist being + sought; namelists of the wrong name are skipped (after + an error message; xwsne.c: namelist writes have a + newline before each new variable. + open.c: ACCESS='APPEND' positions sequential files + at EOF (nonstandard extension -- that doesn't require + changing data structures). */ +/* 9 Feb. 1993: Change some #ifdef MSDOS lines to #ifdef NON_UNIX_STDIO. + err.c: under NON_UNIX_STDIO, avoid close(creat(name,0666)) + when the unit has another file descriptor for name. */ +/* 4 March 1993: err.c, open.c: take declaration of fdopen from rawio.h; + open.c: always give f__w_mode[] 4 elements for use + in t_runc (in endfile.c -- for change of 1 Feb. 1993). */ +/* 6 March 1993: uio.c: adjust off-end-of-record test for sequential + unformatted reads to respond to err= rather than end=. */ +/* 12 March 1993: various tweaks for C++ */ +/* 6 April 1993: adjust error returns for formatted inputs to flush + the current input line when err=label is specified. + To restore the old behavior (input left mid-line), + either adjust the #definition of errfl in fio.h or + omit the invocation of f__doend in err__fl (in err.c). */ +/* 23 June 1993: iio.c: fix bug in format reversions for internal writes. */ +/* 5 Aug. 1993: lread.c: fix bug in handling repetition counts for + logical data (during list or namelist input). + Change struct f__syl to struct syl (for buggy compilers). */ +/* 7 Aug. 1993: lread.c: fix bug in namelist reading of incomplete + logical arrays. */ +/* 9 Aug. 1993: lread.c: fix bug in namelist reading of an incomplete + array of numeric data followed by another namelist + item whose name starts with 'd', 'D', 'e', or 'E'. */ +/* 8 Sept. 1993: open.c: protect #include "sys/..." with + #ifndef NON_UNIX_STDIO; Version date not changed. */ +/* 10 Nov. 1993: backspace.c: add nonsense for #ifdef MSDOS */ +/* 8 Dec. 1993: iio.c: adjust internal formatted reads to treat + short records as though padded with blanks + (rather than causing an "off end of record" error). */ +/* 22 Feb. 1994: lread.c: check that realloc did not return NULL. */ +/* 6 June 1994: Under NON_UNIX_STDIO, use binary mode for direct + formatted files (avoiding any confusion regarding \n). */ +/* 5 July 1994: Fix bug (introduced 6 June 1994?) in reopening files + under NON_UNIX_STDIO. */ +/* 6 July 1994: wref.c: protect with #ifdef GOOD_SPRINTF_EXPONENT an + optimization that requires exponents to have 2 digits + when 2 digits suffice. + lwrite.c wsfe.c (list and formatted external output): + omit ' ' carriage-control when compiled with + -DOMIT_BLANK_CC . Off-by-one bug fixed in character + count for list output of character strings. + Omit '.' in list-directed printing of Nan, Infinity. */ +/* 12 July 1994: wrtfmt.c: under G11.4, write 0. as " .0000 " rather + than " .0000E+00". */ +/* 3 Aug. 1994: lwrite.c: do not insert a newline when appending an + oversize item to an empty line. */ +/* 12 Aug. 1994: rsli.c rsne.c: fix glitch (reset nml_read) that kept + ERR= (in list- or format-directed input) from working + after a NAMELIST READ. */ +/* 7 Sept. 1994: typesize.c: adjust to allow types LOGICAL*1, LOGICAL*2, + INTEGER*1, and (under -DAllow_TYQUAD) INTEGER*8 + in NAMELISTs. */ +/* 6 Oct. 1994: util.c: omit f__mvgbt, as it is never used. */ +/* 2 Nov. 1994: add #ifdef ALWAYS_FLUSH logic. */ +/* 26 Jan. 1995: wref.c: fix glitch in printing the exponent of 0 when + GOOD_SPRINTF_EXPONENT is not #defined. */ +/* 24 Feb. 1995: iio.c: z_getc: insert (unsigned char *) to allow + internal reading of characters with high-bit set + (on machines that sign-extend characters). */ +/* 14 March 1995:lread.c and rsfe.c: adjust s_rsle and s_rsfe to + check for end-of-file (to prevent infinite loops + with empty read statements). */ +/* 26 May 1995: iio.c: z_wnew: fix bug in handling T format items + in internal writes whose last item is written to + an earlier position than some previous item. */ +/* 29 Aug. 1995: backspace.c: adjust MSDOS logic. */ +/* 6 Sept. 1995: Adjust namelist input to treat a subscripted name + whose subscripts do not involve colons similarly + to the name without a subscript: accept several + values, stored in successive elements starting at + the indicated subscript. Adjust namelist output + to quote character strings (avoiding confusion with + arrays of character strings). Adjust f_init calls + for people who don't use libF77's main(); now open and + namelist read statements invoke f_init if needed. */ +/* 7 Sept. 1995: Fix some bugs with -DAllow_TYQUAD (for integer*8). + Add -DNo_Namelist_Comments lines to rsne.c. */ +/* 5 Oct. 1995: wrtfmt.c: fix bug with t editing (f__cursor was not + always zeroed in mv_cur). */ +/* 11 Oct. 1995: move defs of f__hiwater, f__svic, f__icptr from wrtfmt.c + to err.c */ +/* 15 Mar. 1996: lread.c, rsfe.c: honor END= in READ stmt with empty iolist */ + +/* 13 May 1996: add ftell_.c and fseek_.c */ +/* 9 June 1996: Adjust rsli.c and lread.c so internal list input with + too few items in the input string will honor end= . */ +/* 12 Sept. 1995:fmtlib.c: fix glitch in printing the most negative integer. */ +/* 25 Sept. 1995:fmt.h: for formatted writes of negative integer*1 values, + make ic signed on ANSI systems. If formatted writes of + integer*1 values trouble you when using a K&R C compiler, + switch to an ANSI compiler or use a compiler flag that + makes characters signed. */ +/* 9 Dec. 1996: d[fu]e.c, err.c: complain about non-positive rec= + in direct read and write statements. + ftell_.c: change param "unit" to "Unit" for -DKR_headers. */ +/* 26 Feb. 1997: ftell_.c: on systems that define SEEK_SET, etc., use + SEEK_SET, SEEK_CUR, SEEK_END for *whence = 0, 1, 2. */ +/* 7 Apr. 1997: fmt.c: adjust to complain at missing numbers in formats + (but still treat missing ".nnn" as ".0"). */ +/* 11 Apr. 1997: err.c: attempt to make stderr line buffered rather + than fully buffered. (Buffering is needed for format + items T and TR.) */ +/* 27 May 1997: ftell_.c: fix typo (that caused the third argument to be + treated as 2 on some systems). */ +/* 5 Aug. 1997: lread.c: adjust to accord with a change to the Fortran 8X + draft (in 1990 or 1991) that rescinded permission to elide + quote marks in namelist input of character data; compile + with -DF8X_NML_ELIDE_QUOTES to get the old behavior. + wrtfmt.o: wrt_G: tweak to print the right number of 0's + for zero under G format. */ +/* 16 Aug. 1997: iio.c: fix bug in internal writes to an array of character + strings that sometimes caused one more array element than + required by the format to be blank-filled. Example: + format(1x). */ +/* 16 Sept. 1997:fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines + with 64-bit pointers and 32-bit ints that did not 64-bit + align struct syl (e.g., Linux on the DEC Alpha). */ +/* 19 Jan. 1998: backspace.c: for b->ufmt==0, change sizeof(int) to + sizeof(uiolen). On machines where this would make a + difference, it is best for portability to compile libI77 with + -DUIOLEN_int (which will render the change invisible). */ +/* 4 March 1998: open.c: fix glitch in comparing file names under + -DNON_UNIX_STDIO */ +/* 17 March 1998: endfile.c, open.c: acquire temporary files from tmpfile(), + unless compiled with -DNON_ANSI_STDIO, which uses mktemp(). + New buffering scheme independent of NON_UNIX_STDIO for + handling T format items. Now -DNON_UNIX_STDIO is no + longer be necessary for Linux, and libf2c no longer + causes stderr to be buffered -- the former setbuf or + setvbuf call for stderr was to make T format items work. + open.c: use the Posix access() function to check existence + or nonexistence of files, except under -DNON_POSIX_STDIO, + where trial fopen calls are used. */ +/* 5 April 1998: wsfe.c: make $ format item work: this was lost in the + changes of 17 March 1998. */ +/* 28 May 1998: backspace.c dfe.c due.c iio.c lread.c rsfe.c sue.c wsfe.c: + set f__curunit sooner so various error messages will + correctly identify the I/O unit involved. */ +/* 17 June 1998: lread.c: unless compiled with + ALLOW_FLOAT_IN_INTEGER_LIST_INPUT #defined, treat + floating-point numbers (containing either a decimal point + or an exponent field) as errors when they appear as list + input for integer data. */ +/* 7 Sept. 1998: move e_wdfe from sfe.c to dfe.c, where it was originally. + Why did it ever move to sfe.c? */ +/* 2 May 1999: open.c: set f__external (to get "external" versus "internal" + right in the error message if we cannot open the file). + err.c: cast a pointer difference to (int) for %d. + rdfmt.c: omit fixed-length buffer that could be overwritten + by formats Inn or Lnn with nn > 83. */ +/* 3 May 1999: open.c: insert two casts for machines with 64-bit longs. */ +/* 18 June 1999: backspace.c: allow for b->ufd changing in t_runc */ +/* 27 June 1999: rsne.c: fix bug in namelist input: a misplaced increment */ +/* could cause wrong array elements to be assigned; e.g., */ +/* "&input k(5)=10*1 &end" assigned k(5) and k(15..23) */ +/* 15 Nov. 1999: endfile.c: set state to writing (b->uwrt = 1) when an */ +/* endfile statement requires copying the file. */ +/* (Otherwise an immediately following rewind statement */ +/* could make the file appear empty.) Also, supply a */ +/* missing (long) cast in the sprintf call. */ +/* sfe.c: add #ifdef ALWAYS_FLUSH logic, for formatted I/O: */ +/* Compiling libf2c with -DALWAYS_FLUSH should prevent losing */ +/* any data in buffers should the program fault. It also */ +/* makes the program run more slowly. */ +/* 20 April 2000: rsne.c, xwsne.c: tweaks that only matter if ftnint and */ +/* ftnlen are of different fundamental types (different numbers */ +/* of bits). Since these files will not compile when this */ +/* change matters, the above VERSION string remains unchanged. */ +/* 4 July 2000: adjustments to permit compilation by C++ compilers; */ +/* VERSION string remains unchanged. */ +/* 5 Dec. 2000: lread.c: under namelist input, when reading a logical array, */ +/* treat Tstuff= and Fstuff= as new assignments rather than as */ +/* logical constants. */ +/* 22 Feb. 2001: endfile.c: adjust to use truncate() unless compiled with */ +/* -DNO_TRUNCATE (or with -DMSDOS). */ +/* 1 March 2001: endfile.c: switch to ftruncate (absent -DNO_TRUNCATE), */ +/* thus permitting truncation of scratch files on true Unix */ +/* systems, where scratch files have no name. Add an fflush() */ +/* (surprisingly) needed on some Linux systems. */ +/* 11 Oct. 2001: backspac.c dfe.c due.c endfile.c err.c fio.h fmt.c fmt.h */ +/* inquire.c open.c rdfmt.c sue.c util.c: change fseek and */ +/* ftell to FSEEK and FTELL (#defined to be fseek and ftell, */ +/* respectively, in fio.h unless otherwise #defined), and use */ +/* type OFF_T (#defined to be long unless otherwise #defined) */ +/* to permit handling files over 2GB long where possible, */ +/* with suitable -D options, provided for some systems in new */ +/* header file sysdep1.h (copied from sysdep1.h0 by default). */ +/* 15 Nov. 2001: endfile.c: add FSEEK after FTRUNCATE. */ +/* 28 Nov. 2001: fmt.h lwrite.c wref.c and (new) signbit.c: on IEEE systems, */ +/* print -0 as -0 when compiled with -DSIGNED_ZEROS. See */ +/* comments in makefile or (better) libf2c/makefile.* . */ +/* 6 Sept. 2002: rsne.c: fix bug with multiple repeat counts in reading */ +/* namelists, e.g., &nl a(2) = 3*1.0, 2*2.0, 3*3.0 / */ +/* 21 March 2003: err.c: before writing to a file after reading from it, */ +/* f_seek(file, 0, SEEK_CUR) to make writing legal in ANSI C. */ diff --git a/tools/connec/libf2c/i77vers.o b/tools/connec/libf2c/i77vers.o new file mode 100644 index 0000000000000000000000000000000000000000..b28d7f766383715ebcb43cf1a3d510336352d91a GIT binary patch literal 1032 zcmbtT%TB^T6umrD#1%Ue7mjfu7?_kIsc~T%2@(>5i3YdWma3?24J|%4@*^(%6qo*v zU!Zr&Tp>eQ*`z&l&ON8Mb2FVZJE!SX3g}9~G0YgL0AF*W8OtWDLk{w0aks=e?US}) zu*>H8Mf1el%tVuXC+Z8^^5r zRz2j}L20VankTHp=VamgC!qwH#2oLyxX9tH=0{{uQ0-sFy3jPm zNBMn4r#xX@<`o;ftAgZ|qq5*hr|Ux+J|(Upid*beT$@wCe`#^=qI4x2ZA%}4+P{DW Pb#}r#k;WzkC93&f=?z3T literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/i_abs.c b/tools/connec/libf2c/i_abs.c new file mode 100644 index 0000000..2b92c4a --- /dev/null +++ b/tools/connec/libf2c/i_abs.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +integer i_abs(x) integer *x; +#else +integer i_abs(integer *x) +#endif +{ +if(*x >= 0) + return(*x); +return(- *x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_abs.o b/tools/connec/libf2c/i_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..50a78c0258ad904fc7b70ab6d6c07398e27631c6 GIT binary patch literal 1192 zcmbtU%}T>S5S}z@>(8NzpimF-B3A6uQvXoUK-K0T9>jvTlGI2=(@L|2>On7F#EVZN zK7!&4^f7z}Pwup{ab25>E+pT~m-%L9XOrCR9qcCz1LQJb8@@fs0(>Z>-J@+7hcR#- zXPmds9p|Cz6q8Q2`%aQ+LgVHLj859fOe9lJB1c;AbM$PI5Xz;}rnOk{+6~^e*4Zk{ z=Zfu~SGX-~u>4B4&&v21GzWGLU_xS`!i1q1emI67iQ$vKcpTT1(oeM4^Q!BG02V2* zGi9^@EW8f5>j~toKGvnh{SF7#@-JQH*Q;kOH}HX-y4(fkg(0w7GYI^K2x&CA&&r3D zT*%$p1y%YVWT;Pl0yd?M_DBAYJqd0>T*&DsaYFISgc4HHAe *b ? *a - *b : 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_dim.o b/tools/connec/libf2c/i_dim.o new file mode 100644 index 0000000000000000000000000000000000000000..834aefcf7e6bea75ea97f193ccb75bdfb767277d GIT binary patch literal 1200 zcmbtTO;5r=5S>yL{767!j0O*QF=Au`@mmwq1eG2P2P0=JPy^AHgf0nsP_G6L9{nZ8 zcrtqNsQ<*D;11ob>q;*=N&9Br&YRhp!qwivenitimG4|#QVlyrC_^&g=29}m&r^TZ=8CYh@L0=a`g A?*IS* literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/i_dnnt.c b/tools/connec/libf2c/i_dnnt.c new file mode 100644 index 0000000..3abc2dc --- /dev/null +++ b/tools/connec/libf2c/i_dnnt.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double floor(); +integer i_dnnt(x) doublereal *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +integer i_dnnt(doublereal *x) +#endif +{ +return (integer)(*x >= 0. ? floor(*x + .5) : -floor(.5 - *x)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_dnnt.o b/tools/connec/libf2c/i_dnnt.o new file mode 100644 index 0000000000000000000000000000000000000000..3cb86600f61d917d519b476ff59894adbe029444 GIT binary patch literal 2160 zcmcJP&1+LZ5WpvWwW->6V^I;S7z9f!?UFRD77rQ;wmlRn(zJp?&BuFIG)YNbB=ul> z_2yOZZxPdqQP3ms}Jlyq%ff&g|@0cK6oG;y@?_EFriK9gitM zYp`Rdl$nAt7=^ZogdHJ|5UM-Yut05!K|IrfaDWl8V7L!I+J_$t zaPKY#=Q*SzgB6Y|9-KezFU`o)%2CZJ)mm_-gOqhvwS$593&_Wf{X9G?xsr|pHVJBy z)XY*dN6kDu+ANexF6Q!%44_TB@JnBq(`b_rr(Ixvksu0jS{w6Of+)mC@MFF~5QRAX zN0{#rL?LdD|3cB=_^%9Zj{nBs=J;O?K87~ejT*e`U6IwDqMOZuthyCXZ?RRepJb(L z*Ikg6av|$xWxnbzm`>sfdK6`EZ90`~(FRFzAam6!$b7k2v~jm(sqETv>2_wO>Sptg z^-TUv(Ryed-u>&0mD1+neb9c_nvqT5N4GPDpDEk=inlbRv!-0WFMK~IH6Pb;tYW%Q zl!4Zq&pL^mLjC!xee(JL!g^8X(>*d}Tjx)k5N)o@_$C^?*8hMY3a^vaPp=K<_? zGxitAvZt^)_;FZR*ux&Zd-Cc*?V422w1Zx>U{bH%yjRs-lW)swD@}}n3I<;wtP~57 zY6@}2hZ*RCPB160t?HG@?##1AW}engEUQ}oi2|#7Z>Ima$)59AYS8=e3%gqBzhZ2; z=e)V!to&x#g>39m+?tgdGb(|Z`+;x9@zqnI|IO*_Ys11UZF97c40pX6Th-;i+AcZEMu{}ZL0T?GID literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/i_len.c b/tools/connec/libf2c/i_len.c new file mode 100644 index 0000000..0f7b188 --- /dev/null +++ b/tools/connec/libf2c/i_len.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +integer i_len(s, n) char *s; ftnlen n; +#else +integer i_len(char *s, ftnlen n) +#endif +{ +return(n); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_len.o b/tools/connec/libf2c/i_len.o new file mode 100644 index 0000000000000000000000000000000000000000..ff789750c029e9ecef5c92d44bbafa26402b840b GIT binary patch literal 1176 zcmbtT%}T>S5S}z@>(8Nz2caJ7MO5t4;x7sksM;RHgV=LTYoub6Lb8SGLA`qO3B*Sc zd7LWz;Ct z#z!})6U|p;6J-}Ys`=OaL(HX`G>2~7e?u41=l+bxnx==o=|uB6k0s*f-P7JXEodL{ k3NVdGU$c3Cq?>1_lq=Q9`~%GX^JDU#Rp2ER)6C5O0a8#oZU6uP literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/i_mod.c b/tools/connec/libf2c/i_mod.c new file mode 100644 index 0000000..4a9b560 --- /dev/null +++ b/tools/connec/libf2c/i_mod.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +integer i_mod(a,b) integer *a, *b; +#else +integer i_mod(integer *a, integer *b) +#endif +{ +return( *a % *b); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_mod.o b/tools/connec/libf2c/i_mod.o new file mode 100644 index 0000000000000000000000000000000000000000..99a710fa70b7ea6c5d9568ea77c68f6763ac3639 GIT binary patch literal 1184 zcmbu8&q~8U5XL8s+NwQN@gUSgy@-lkD*i>G1gbU%5fOVXX&b3%T4}aWMf9q8@#+hR zk0JO1K7w!I)tz>xu4{AAh49V%cD|k6O>(=tzZbJC;9)@?zB8r(9~yMJ*nx2v1NR~B zKDnQH_x}A2@lg_s-)4Bz9=4)vZ3^< zXVmF`lBRu{H{j5+{qs@&<4lUpsRx<)CJw27iIgS50qLw#d|M9XEEm*hngIH+2m6`l z6vI+mJ^HxT6D_7?`(#~3xaME|+scb;;y(1j{TFqpV(!nnqcOeoSx>Z>eT*= 0 ? floor(*x + .5) : -floor(.5 - *x)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_nint.o b/tools/connec/libf2c/i_nint.o new file mode 100644 index 0000000000000000000000000000000000000000..b9073ddeaae7272889faedeaf5c87404267e7b6f GIT binary patch literal 2264 zcmbu9%}-N75WuHYK2&5Y(S(S`deBq?o7RF7589+rJP=|O&=?Jt+GmNj)%Ib~7}1*t z4;(%4$51e)Q4fAx^k8DVc$Ac@iO#&8q3e6E7oDa%GryhL**ClIEuWh_-w}y`NCeJ6 z%M%JP(Alyxo|yp!eXyls-Aa3t)!SR@+FDax^*l!<8ch{DM6qbUchvMJ^p6@}e}9l} zUQokpj{5l#jUk**ylJZSMpr9n`dw39|3DLtn)&Rg*|(HZ-!NrjduS<)XkbL$Duo$g zrRsL6bu3l4OTEH{XbI;_IaMTs=IlNtNP$^5koi$D}YxE}j0KbhaTft;L6@MQa zkw=#xvJ{I9_ICHIV8dg`5Axg(37*JiPsbB8^NVG7F@8#q>EuXy(eqMIQsX)~dfZTn zZ=<83Ckhb7UzkK;M;OLvuOorED0BrFfhhE};XB*#U2XX805^9uxPP;g;Qq}D!TnR; z0iV~u)BViNyytks0dMT|&Z|WM4x`g=^?CaY^<*{)IHYJu({O@@Q5wczVXnMTb}_e` z7wbSxUHHWp$?OAwI6Z^#BWRNl@5R6H6hRc?^nwVVC5S@25C6g+6GZW^|H9zF`l}YV z*RNaLUjM7b71~laZgF##40P>b$<57!uDMmCi(*v^cXQe;EV-bom0LMCr}H%z8`*Nk zZ6|dSJxVDQ=bUP;Q~*s$pyz8f(D_QKRKV8ja>Xs^iK&^9nw!ht;a&WdvB zgN$VRei+xfIR*@(qFbCX?)LbculyzxI(w=k_jiE#G3Nd3i%M{_{cni)qSI~ilbkPg zWL>E*I@2cqBIm~?k+r;MqAznk-Ah~UasIFk(U!V`r_c!N-x5Ed?4SBaXC(Q;Zy=*m z{x8fb*T<>9#E= 0 ? *a : - *a); +return( *b >= 0 ? x : -x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/i_sign.o b/tools/connec/libf2c/i_sign.o new file mode 100644 index 0000000000000000000000000000000000000000..7edd1b3c2087e483efdcf8a5a5c669facf8ef6da GIT binary patch literal 1200 zcmbu7OH0E*5XUEt+WG(=2nrRf7qMcOmij`W2C8-s;z8`WrZw84Nuf!hdQibr(St`n ziFnld1$y>VcoRIi)9j{eY%V&Gota-iO^0c`O`9$H`A%;$Ku2lo4JLUDJCm*$fY=wNqZgTXYOXJf$T1oYkeYF>6Qf)>sp+NxKG)qpHJA1UOMBG{^z26pZ*)rcw6s$JpXYf#^%|B%>N~h7(-ifowr83 z$PMP0!>^^eskh$nLDQU|4rd6x;7P`?RArBB_i`e|ysbx8S%f|Rs^4T!p9> Mg@+wgck%1L0Z1oC2LJ#7 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/iargc_.c b/tools/connec/libf2c/iargc_.c new file mode 100644 index 0000000..2f29da0 --- /dev/null +++ b/tools/connec/libf2c/iargc_.c @@ -0,0 +1,17 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +ftnint iargc_() +#else +ftnint iargc_(void) +#endif +{ +extern int xargc; +return ( xargc - 1 ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/iargc_.o b/tools/connec/libf2c/iargc_.o new file mode 100644 index 0000000000000000000000000000000000000000..ef9578f497b40bb3683ef9bc40df8f59e73a3abb GIT binary patch literal 1312 zcmb_b%}T>S5S}z@s}`x^L8ynE#J?^rS`-Bd6s>}Y2t9a`v_>nM7LpXIhzcIPc=QRR zk0JOHK7tP+=uEO>w`qD2zp|NczMa|Go!#DV@9!iu4Hz11LDypyz({nt8Bi0_Fb+?{ z0eY%Wr`}B|`{A=vB=w*V7nXZo zJApPCoa8o>rJS$t5C(Dr={@%&ylcm|svtby4Q-v7YhPKyx7$95fZFwwGuLu#5T}-J zfv9>Oh+5Ne>;{H3n!YW{2bG-XTeZue*gt#>x!-7KO}RGrN4mXdLothE2#1M71-&W4 zOlV*fElGSMtS?EO`zpiXP?BX9q~&~;=a9tJ@5I!n*T(r=zla)zMqlDBYH^Uu{!VQo zqc#7UZ(=U3na81m>o2Mza<0#IPtnxSSJhEC=dnb7wD&aEkpUmlj-jQ0S+sw2uhFwp a%7ZL4L5_lG{YjjQ%YT!B$4V~IX#Nkcs7RXt literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/iio.c b/tools/connec/libf2c/iio.c new file mode 100644 index 0000000..8553efc --- /dev/null +++ b/tools/connec/libf2c/iio.c @@ -0,0 +1,159 @@ +#include "f2c.h" +#include "fio.h" +#include "fmt.h" +#ifdef __cplusplus +extern "C" { +#endif +extern char *f__icptr; +char *f__icend; +extern icilist *f__svic; +int f__icnum; + + int +z_getc(Void) +{ + if(f__recpos++ < f__svic->icirlen) { + if(f__icptr >= f__icend) err(f__svic->iciend,(EOF),"endfile"); + return(*(unsigned char *)f__icptr++); + } + return '\n'; +} + + void +#ifdef KR_headers +z_putc(c) +#else +z_putc(int c) +#endif +{ + if (f__icptr < f__icend && f__recpos++ < f__svic->icirlen) + *f__icptr++ = c; +} + + int +z_rnew(Void) +{ + f__icptr = f__svic->iciunit + (++f__icnum)*f__svic->icirlen; + f__recpos = 0; + f__cursor = 0; + f__hiwater = 0; + return 1; +} + + static int +z_endp(Void) +{ + (*f__donewrec)(); + return 0; + } + + int +#ifdef KR_headers +c_si(a) icilist *a; +#else +c_si(icilist *a) +#endif +{ + f__elist = (cilist *)a; + f__fmtbuf=a->icifmt; + f__curunit = 0; + f__sequential=f__formatted=1; + f__external=0; + if(pars_f(f__fmtbuf)<0) + err(a->icierr,100,"startint"); + fmt_bg(); + f__cblank=f__cplus=f__scale=0; + f__svic=a; + f__icnum=f__recpos=0; + f__cursor = 0; + f__hiwater = 0; + f__icptr = a->iciunit; + f__icend = f__icptr + a->icirlen*a->icirnum; + f__cf = 0; + return(0); +} + + int +iw_rev(Void) +{ + if(f__workdone) + z_endp(); + f__hiwater = f__recpos = f__cursor = 0; + return(f__workdone=0); + } + +#ifdef KR_headers +integer s_rsfi(a) icilist *a; +#else +integer s_rsfi(icilist *a) +#endif +{ int n; + if(n=c_si(a)) return(n); + f__reading=1; + f__doed=rd_ed; + f__doned=rd_ned; + f__getn=z_getc; + f__dorevert = z_endp; + f__donewrec = z_rnew; + f__doend = z_endp; + return(0); +} + + int +z_wnew(Void) +{ + if (f__recpos < f__hiwater) { + f__icptr += f__hiwater - f__recpos; + f__recpos = f__hiwater; + } + while(f__recpos++ < f__svic->icirlen) + *f__icptr++ = ' '; + f__recpos = 0; + f__cursor = 0; + f__hiwater = 0; + f__icnum++; + return 1; +} +#ifdef KR_headers +integer s_wsfi(a) icilist *a; +#else +integer s_wsfi(icilist *a) +#endif +{ int n; + if(n=c_si(a)) return(n); + f__reading=0; + f__doed=w_ed; + f__doned=w_ned; + f__putn=z_putc; + f__dorevert = iw_rev; + f__donewrec = z_wnew; + f__doend = z_endp; + return(0); +} +integer e_rsfi(Void) +{ int n = en_fio(); + f__fmtbuf = NULL; + return(n); +} +integer e_wsfi(Void) +{ + int n; + n = en_fio(); + f__fmtbuf = NULL; + if(f__svic->icirnum != 1 + && (f__icnum > f__svic->icirnum + || (f__icnum == f__svic->icirnum && (f__recpos | f__hiwater)))) + err(f__svic->icierr,110,"inwrite"); + if (f__recpos < f__hiwater) + f__recpos = f__hiwater; + if (f__recpos >= f__svic->icirlen) + err(f__svic->icierr,110,"recend"); + if (!f__recpos && f__icnum) + return n; + while(f__recpos++ < f__svic->icirlen) + *f__icptr++ = ' '; + return n; +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/iio.o b/tools/connec/libf2c/iio.o new file mode 100644 index 0000000000000000000000000000000000000000..c2ef75876fbdf3574a097c565a3c50859df6f74e GIT binary patch literal 7616 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 UJG@f=)%XY@={LpvH9FS+0-S>=CjbBd literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/ilnw.c b/tools/connec/libf2c/ilnw.c new file mode 100644 index 0000000..e8b3d49 --- /dev/null +++ b/tools/connec/libf2c/ilnw.c @@ -0,0 +1,83 @@ +#include "f2c.h" +#include "fio.h" +#include "lio.h" +#ifdef __cplusplus +extern "C" { +#endif +extern char *f__icptr; +extern char *f__icend; +extern icilist *f__svic; +extern int f__icnum; +#ifdef KR_headers +extern void z_putc(); +#else +extern void z_putc(int); +#endif + + static int +z_wSL(Void) +{ + while(f__recpos < f__svic->icirlen) + z_putc(' '); + return z_rnew(); + } + + static void +#ifdef KR_headers +c_liw(a) icilist *a; +#else +c_liw(icilist *a) +#endif +{ + f__reading = 0; + f__external = 0; + f__formatted = 1; + f__putn = z_putc; + L_len = a->icirlen; + f__donewrec = z_wSL; + f__svic = a; + f__icnum = f__recpos = 0; + f__cursor = 0; + f__cf = 0; + f__curunit = 0; + f__icptr = a->iciunit; + f__icend = f__icptr + a->icirlen*a->icirnum; + f__elist = (cilist *)a; + } + + integer +#ifdef KR_headers +s_wsni(a) icilist *a; +#else +s_wsni(icilist *a) +#endif +{ + cilist ca; + + c_liw(a); + ca.cifmt = a->icifmt; + x_wsne(&ca); + z_wSL(); + return 0; + } + + integer +#ifdef KR_headers +s_wsli(a) icilist *a; +#else +s_wsli(icilist *a) +#endif +{ + f__lioproc = l_write; + c_liw(a); + return(0); + } + +integer e_wsli(Void) +{ + z_wSL(); + return(0); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/ilnw.o b/tools/connec/libf2c/ilnw.o new file mode 100644 index 0000000000000000000000000000000000000000..6dd286489e01e8db7d99684d24cfc9f3de53719b GIT binary patch literal 3240 zcmbuBO>7%Q6vxMLKTK0xQ;H}QiVp!9sv1XapwI$N^Wm*(wWUc_p&pjadW~1L*JiyY zrj&vdBxG4d9Js&@4plFOOOd#>QX+BSQXz5V(gRqCBL^ft!u!w8t0x<;gy2Q9@6B)C z$Lx4!Ht)@q=f@HW!IBU!i(!wc5ZCV;+C^y=#ZECUjBmH{z-AMPjJ|X*dZFr{&lOiT1-b;YPY(r~vUU=%XUrKSBU08JefoF-t0tf^7i1bzt`7|{>)zV>G87+8C+cl zU7W~Oj6-{*e`ov~S!HFdaA7sfyJ1}hHz|>Hk#ilKqzoL9TBXoE2q#HgIx7<0Ok&^8 z?WvDxeKW)!lOsZ0QyRVnWf!4m)0ubDDUl`9K%Zm*kLh$~Wo$NG94qZeXQtDs>2aB_ zjxmx)LM3azuj~h*Dc>o|CrUFjFJ^P+mO5V0$v&T-$`=kE>d4;YmB}Od!r`Yws$%0* za^#K^B1wOvBq{Fgxedcfv28=2J4vyf%?&y!=p7=0ExViMa~1}Pd|%S=#9BvX7lBcH zZw$}I@Emc}{fRV0{ywCir8X-6kr@6;3_laYFU0U_49DIWH6K5QUy0!#636?#pw^l9 z+D9?|pT_VnV)&Oa{OcHgD~A6N!|%rMUt+j$%;k376I}n$EZ9!gvWnVPy+C{T!xpg?y-Db;g%22!GcRV)`WwY*h7_+M~MK^GK z&ywD*?RXWLo@PNFzGGEf?+uu)-3ojdm8Rz``;JXjeX>F~yVYz9vs6BPe7bC&o}XWs zTQnD^kC*36j8~g}!wLeYBI@R{?*{VKXgcjCb_C9FC}X4^ruI8sY>>3ZabGd#eE|Q* zH9n#IpCOIdKf^TZ2NZ|@xW=E;_->8QY8cvbFyt1M-}dTfhiDyqJt zFBY*#SMDABX6&!R#Oo?y3kyzyvw&FsvSRN-4p0MEZa`A5t3sbJP@3ZzKSjo<`gfFL zS2?0S?i`Ni`cuSEiti&br5uY+NO3hS)f3_infile!=NULL) + { byfile=1; + g_char(a->infile,a->infilen,buf); +#ifdef NON_UNIX_STDIO + x = access(buf,0) ? -1 : 0; + for(i=0,p=NULL;iinunitinunit>=0) + { + p= &f__units[a->inunit]; + } + else + { + p=NULL; + } + } + if(a->inex!=NULL) + if(byfile && x != -1 || !byfile && p!=NULL) + *a->inex=1; + else *a->inex=0; + if(a->inopen!=NULL) + if(byfile) *a->inopen=(p!=NULL); + else *a->inopen=(p!=NULL && p->ufd!=NULL); + if(a->innum!=NULL) *a->innum= p-f__units; + if(a->innamed!=NULL) + if(byfile || p!=NULL && p->ufnm!=NULL) + *a->innamed=1; + else *a->innamed=0; + if(a->inname!=NULL) + if(byfile) + b_char(buf,a->inname,a->innamlen); + else if(p!=NULL && p->ufnm!=NULL) + b_char(p->ufnm,a->inname,a->innamlen); + if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL) + if(p->url) + b_char("DIRECT",a->inacc,a->inacclen); + else b_char("SEQUENTIAL",a->inacc,a->inacclen); + if(a->inseq!=NULL) + if(p!=NULL && p->url) + b_char("NO",a->inseq,a->inseqlen); + else b_char("YES",a->inseq,a->inseqlen); + if(a->indir!=NULL) + if(p==NULL || p->url) + b_char("YES",a->indir,a->indirlen); + else b_char("NO",a->indir,a->indirlen); + if(a->infmt!=NULL) + if(p!=NULL && p->ufmt==0) + b_char("UNFORMATTED",a->infmt,a->infmtlen); + else b_char("FORMATTED",a->infmt,a->infmtlen); + if(a->inform!=NULL) + if(p!=NULL && p->ufmt==0) + b_char("NO",a->inform,a->informlen); + else b_char("YES",a->inform,a->informlen); + if(a->inunf) + if(p!=NULL && p->ufmt==0) + b_char("YES",a->inunf,a->inunflen); + else if (p!=NULL) b_char("NO",a->inunf,a->inunflen); + else b_char("UNKNOWN",a->inunf,a->inunflen); + if(a->inrecl!=NULL && p!=NULL) + *a->inrecl=p->url; + if(a->innrec!=NULL && p!=NULL && p->url>0) + *a->innrec=(ftnint)(FTELL(p->ufd)/p->url+1); + if(a->inblank && p!=NULL && p->ufmt) + if(p->ublnk) + b_char("ZERO",a->inblank,a->inblanklen); + else b_char("NULL",a->inblank,a->inblanklen); + return(0); +} diff --git a/tools/connec/libf2c/inquire.o b/tools/connec/libf2c/inquire.o new file mode 100644 index 0000000000000000000000000000000000000000..ba32464a6685b5e8d601ce434ffb624ad1b53671 GIT binary patch literal 4224 zcmbtWZERCj7(QJmt1x;CB2HMO#tjC#%LW4mD%oAv?choWTPqVJrQ143*axh)W(pIq zy<$_VM1voRF;o2EMe66O*T75|X#+=_^9H8!h7W*mq&|ijU=_+Bwuf=wc^&7bgdaYfi|*6u?@y->8T2LK zT}pHyPmiGJCZA0+iGR&ZGHM|vR6yH<#Wd-n@lz)NC#r;~zVf%qnUCQNGq|ZP!>Ll{ zUws6+Y9eXN^)TNfMOX;)MN=QLquW7O7PGS~Y2|sqJ9rik`L^xK^WT~4pWXY<CHIMMzXwn9EsTwY#S_GFchJMsNuvreG2Iv@jk>J^=ffFeu zF5ZD+<4ql9gKO$mni_PlH|8`VaG@^4DoFMi(;z+6@RDmKfMh!+fi#8~TqMJ10w%7U z;Anhr4V?Df%sje7`G!#;wDu+1A7^-@n>_-C?{W2Acu8f=)lv&7c z@Oaj_%YtpOUNz=kBd?Mx%2&piR{2V0wOmoPR7VZp_v-9yU#2tc1m3kAVkhwK<`6rX zkpm^*rN9DrSm5_h!`YtX$VZQ8C+x>Yuwpd=eyM=r(8Y8+nQOvzdpmi`gfB4o<`pb5 z@P|$O5(8gu!j~HO8WS#quIDs$0(rUc^%i&&;B$q2WM>JmXD#^KE$~hYe4hnQWS^%3 zo0ZtC!e#|F)!0;GQ-#fHY}SxYHPYSPx4MeF5NhuV_mfa4s)pNlfwC*q8Q$4VIzu~q z_ryq>KHV7twXY*WLJhvATE!P?s;_VH20{U)*5?fYITY*NsYW3+@+3AOcrtNs;chdb z2!bF!A3lx;5Cnl=1X2Va$KOT}#Ej3^58yPs(ZJC^o+0jMpTNgc&hdj5{7(fwo_@~% z+=74Jg8!2R|F*!NDfnj#0^OYdGAsZHc49uu4cyG%F7Wa0@%-B?_-6%vp}-%v;NKDW z_!pM@w;4~AIiEQOj%H#$^DX#`E%=XH@Yf4`r;v}wg8!nx7xUR`!T(6$i}gQh!9OnW zB_W?v7JU56ih^~U10S#FpMoEJe>grN@Wpe!1Ra22oyB|fo`IY9H`a#47{&KP6;MHw>eH;EvOd3+A9 zfj1-CjAg<|mm5ZWuJfMf&GlzsfIk1LJ^p^8&kFcN;qjM= zAdGo@-nR;vNL^q)5XL08<6P9uwZ}QPVc%*@;@g4u)m%S3Cg!yRL= 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/l_ge.o b/tools/connec/libf2c/l_ge.o new file mode 100644 index 0000000000000000000000000000000000000000..9e7cbf5757c179afeb156702cc14036cde26dc79 GIT binary patch literal 1376 zcmbtTPfHt75T8w|Ni|3;EeLv8dXTF4NU+kAb&QI{llxK=?e20WiMrg3(PIv#CV#7ZxUdPWoPu-kM79 zOeFz|x!gPR)n2XB3_9i;u_`jlE1eK!PqJ@C=JmpWmAU^@@yH1P;`ob_IE+Qn7(G6M zPmJJk4ozs6&y@3oGb2Zp(^@RS)CeAq?awawcHR35cClR9+$h_XLg8b+YF9Tl%XwSY z;z^z$rqf*C48)Xvy2g9=EBtR>;M73)L3^MZY_;8EM+9y+01=vQ!~WEEJQu`~6F4Ah zz7L|_@;tYRANm%@u6K<_^8s8OPG=5 zQ`AK94KlwZdFAyFGxo!OfQ;0vIG^!68d3fG5&h}yE~TD8O<$$HKe|_ac1k&u Xjb0K^MDIV1zNmaY)Pa&qrk;Nbo7+`x literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/l_gt.c b/tools/connec/libf2c/l_gt.c new file mode 100644 index 0000000..ae6950d --- /dev/null +++ b/tools/connec/libf2c/l_gt.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +logical l_gt(a,b,la,lb) char *a, *b; ftnlen la, lb; +#else +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +logical l_gt(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +return(s_cmp(a,b,la,lb) > 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/l_gt.o b/tools/connec/libf2c/l_gt.o new file mode 100644 index 0000000000000000000000000000000000000000..014ced48b62861541560de76bc7c81dad6a73950 GIT binary patch literal 1376 zcmb<-^>JfjWMqH=Mg}_u1P><4z>vU%U^{@B4h%dD+zcMgZ#Z6n_#UkX_~#$s-*&*G z`3T2h1`)6t1_s8eAO^+?0Y+&ac8&=^gF)glP&siB?ZPJz#K*zF;O^{frJxa-RGL>( zs$i~Xs%M~UTngqH))`vp8JK87M4@`|QOsCmdnvbd)c>K2zICTD{!qXMA- zbuW5MI6%#Yg&UNM>NlXEG!TQr!U2ep!3Ag_NI(TSfiy@67K1QxZKya>@(1gP0Fw+1 z22dJC!SuuUYCr}y`(I$OACx*_`eF8)0>wZ|(Nk^*Pz)P@8Vi@Q2C_hAlB?eVs25}= zx<6s|YXRku0nC0F?Fp2Gv60nnLgpZ`(baM d%L=GPN+1prK(}8ID2Giy%u$g@dO=Kd{Qxm#RmK1S literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/l_le.c b/tools/connec/libf2c/l_le.c new file mode 100644 index 0000000..625b49a --- /dev/null +++ b/tools/connec/libf2c/l_le.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern integer s_cmp(); +logical l_le(a,b,la,lb) char *a, *b; ftnlen la, lb; +#else +extern integer s_cmp(char *, char *, ftnlen, ftnlen); +logical l_le(char *a, char *b, ftnlen la, ftnlen lb) +#endif +{ +return(s_cmp(a,b,la,lb) <= 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/l_le.o b/tools/connec/libf2c/l_le.o new file mode 100644 index 0000000000000000000000000000000000000000..f75f184960987f4cc9f643881dee63d77d1e3fb1 GIT binary patch literal 1376 zcmb_a%}OId5Uw%0i5fJDpb!tigX}6c39Ia)AQRpE2tmOgSWmN)>@0!JM9EAbdeB1< zJo*HlJ$sNn2J``Z3=bZB070uJU2EHndyuW6r>efLud1uMk8`Dbk6{3d0n6~>F$(ab z=fySy(}Xw-La}`xyCc7N(iuMQ3}1DM?VH#&j0G_O#^ELyt%Q+`M`LH0nD9xtH%|K7 zP-1f^22faCT}*x4DL3nWGxbF*i1gg&X5eLxGG9e{{!?!<@MN(5gw7=`^DUv4)wmmWe(`tvbFuX|{wEB=L`Q-3Z6B;=(n=);<2P8C@Q*4sPWsDea%VIS zP}tg9PtP2c8#UQTuZk6sSy*a>-s1PgHIZ4K?VyVLnu24|0djVRo~WbC5^E zC;5Oj^>}#fNE&Sty2hUS6~R|ux@8c7tatPUTXnDM3h6Z^h|u&dob$TtdmzqS>4GQ+ z0f@?#?|U^&sa;7=6n2jm0_j#R!)EXBORN2wH({&VJU8X`o(;hiE}DgnOP7CY2$KpN zLQN3gAmj52*PegKI1c{+8Kqe0#9L-p%>Zy_#ny%B^ZN VMUEzB|1pe3@p)4x8kbCy{{%@2Q)d7G literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/lbitbits.c b/tools/connec/libf2c/lbitbits.c new file mode 100644 index 0000000..5b6ccf7 --- /dev/null +++ b/tools/connec/libf2c/lbitbits.c @@ -0,0 +1,68 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LONGBITS +#define LONGBITS 32 +#endif + + integer +#ifdef KR_headers +lbit_bits(a, b, len) integer a, b, len; +#else +lbit_bits(integer a, integer b, integer len) +#endif +{ + /* Assume 2's complement arithmetic */ + + unsigned long x, y; + + x = (unsigned long) a; + y = (unsigned long)-1L; + x >>= b; + y <<= len; + return (integer)(x & ~y); + } + + integer +#ifdef KR_headers +lbit_cshift(a, b, len) integer a, b, len; +#else +lbit_cshift(integer a, integer b, integer len) +#endif +{ + unsigned long x, y, z; + + x = (unsigned long)a; + if (len <= 0) { + if (len == 0) + return 0; + goto full_len; + } + if (len >= LONGBITS) { + full_len: + if (b >= 0) { + b %= LONGBITS; + return (integer)(x << b | x >> LONGBITS -b ); + } + b = -b; + b %= LONGBITS; + return (integer)(x << LONGBITS - b | x >> b); + } + y = z = (unsigned long)-1; + y <<= len; + z &= ~y; + y &= x; + x &= z; + if (b >= 0) { + b %= len; + return (integer)(y | z & (x << b | x >> len - b)); + } + b = -b; + b %= len; + return (integer)(y | z & (x >> b | x << len - b)); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/lbitbits.o b/tools/connec/libf2c/lbitbits.o new file mode 100644 index 0000000000000000000000000000000000000000..3c5f10499249863e8ea2abd447a9513d3a678b0c GIT binary patch literal 1496 zcmbtTL2DCH5T0$+Hr7KG!9s;59>fTJq%>8rpns3$w4Q~mBswW!*(v#$5iwD~xxUmqbEb-pOo+~4tzc>91SyIUNQjra9gzJ5GeFYt|TwG8(T zd9!<)H}~hbvAzCjlBc#`B`{a&h= 0 ? a << b : (integer)((uinteger)a >> -b); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/lbitshft.o b/tools/connec/libf2c/lbitshft.o new file mode 100644 index 0000000000000000000000000000000000000000..e4be4f719dd3e944fe147467503684eebedbf607 GIT binary patch literal 1200 zcmbtSPfG$(5TA7`t%NLs0z23xD)OQ9mx5TZau3lV61vH1D@v}0`vmJy9qQn%W1k}W z2tkKFfTwPKgYr@xd!zI0wdth>9>1C2o8Qd5*}d4_-SKG}NYh{wz9Y#3yeXv7q74{^ zAu#Ko^`_Z)sW(5K&Bm*F{cet!PmeH8QtfOXv|30D2mOH?Q6nVyDY}~=gk&PI9+^#L zswG~Htg>Ymi!N4MQT#l<#$rozZC2*@K)vha06O@(Ds<@U!T0yz2YT@SUp%gBOqr+i z)?%i>({8?y<1I~ulsKWXVgTlzI^4<#Kf;va7k+>AKLdB4aZ)mwZfcn5v7T+Lan8K9%h-E5gH?f7NdYE!M<2RFnPZRZ{q} zzr-ztQ&aEMK=GwcQW$%8k9YT!@IW{y5dUiL{*d>+9VI8!D2Rb#-u|QFuABar5)TwD Hx?cSkqq<0c literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/libf2c.a b/tools/connec/libf2c/libf2c.a new file mode 100644 index 0000000000000000000000000000000000000000..6775a31a1c665fa1d961ad0019bb6f0aa8b4adc1 GIT binary patch literal 395224 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�^dZ#ik(EF2HwV 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 M2S;#Uf=~_Vf1FGBK>z>% literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/lio.h b/tools/connec/libf2c/lio.h new file mode 100644 index 0000000..f9fd1cd --- /dev/null +++ b/tools/connec/libf2c/lio.h @@ -0,0 +1,74 @@ +/* copy of ftypes from the compiler */ +/* variable types + * numeric assumptions: + * int < reals < complexes + * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX + */ + +/* 0-10 retain their old (pre LOGICAL*1, etc.) */ +/* values to allow mixing old and new objects. */ + +#define TYUNKNOWN 0 +#define TYADDR 1 +#define TYSHORT 2 +#define TYLONG 3 +#define TYREAL 4 +#define TYDREAL 5 +#define TYCOMPLEX 6 +#define TYDCOMPLEX 7 +#define TYLOGICAL 8 +#define TYCHAR 9 +#define TYSUBR 10 +#define TYINT1 11 +#define TYLOGICAL1 12 +#define TYLOGICAL2 13 +#ifdef Allow_TYQUAD +#undef TYQUAD +#define TYQUAD 14 +#endif + +#define LINTW 24 +#define LINE 80 +#define LLOGW 2 +#ifdef Old_list_output +#define LLOW 1.0 +#define LHIGH 1.e9 +#define LEFMT " %# .8E" +#define LFFMT " %# .9g" +#else +#define LGFMT "%.9G" +#endif +/* LEFBL 20 should suffice; 24 overcomes a NeXT bug. */ +#define LEFBL 24 + +typedef union +{ + char flchar; + short flshort; + ftnint flint; +#ifdef Allow_TYQUAD + longint fllongint; +#endif + real flreal; + doublereal fldouble; +} flex; +#ifdef KR_headers +extern int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)(); +extern int l_read(), l_write(); +#else +#ifdef __cplusplus +extern "C" { +#endif +extern int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint); +extern int l_write(ftnint*, char*, ftnlen, ftnint); +extern void x_wsne(cilist*); +extern int c_le(cilist*), (*l_getc)(void), (*l_ungetc)(int,FILE*); +extern int l_read(ftnint*,char*,ftnlen,ftnint); +extern integer e_rsle(void), e_wsle(void), s_wsne(cilist*); +extern int z_rnew(void); +#endif +extern ftnint L_len; +extern int f__scale; +#ifdef __cplusplus + } +#endif diff --git a/tools/connec/libf2c/lread.c b/tools/connec/libf2c/lread.c new file mode 100644 index 0000000..699cda1 --- /dev/null +++ b/tools/connec/libf2c/lread.c @@ -0,0 +1,806 @@ +#include "f2c.h" +#include "fio.h" + +/* Compile with -DF8X_NML_ELIDE_QUOTES to permit eliding quotation */ +/* marks in namelist input a la the Fortran 8X Draft published in */ +/* the May 1989 issue of Fortran Forum. */ + + +#ifdef Allow_TYQUAD +static longint f__llx; +#endif + +#ifdef KR_headers +extern double atof(); +extern char *malloc(), *realloc(); +int (*f__lioproc)(), (*l_getc)(), (*l_ungetc)(); +#else +#undef abs +#undef min +#undef max +#include "stdlib.h" +#endif + +#include "fmt.h" +#include "lio.h" +#include "ctype.h" +#include "fp.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern char *f__fmtbuf; +#else +extern const char *f__fmtbuf; +int (*f__lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void), + (*l_ungetc)(int,FILE*); +#endif + +int l_eof; + +#define isblnk(x) (f__ltab[x+1]&B) +#define issep(x) (f__ltab[x+1]&SX) +#define isapos(x) (f__ltab[x+1]&AX) +#define isexp(x) (f__ltab[x+1]&EX) +#define issign(x) (f__ltab[x+1]&SG) +#define iswhit(x) (f__ltab[x+1]&WH) +#define SX 1 +#define B 2 +#define AX 4 +#define EX 8 +#define SG 16 +#define WH 32 +char f__ltab[128+1] = { /* offset one for EOF */ + 0, + 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +#ifdef ungetc + static int +#ifdef KR_headers +un_getc(x,f__cf) int x; FILE *f__cf; +#else +un_getc(int x, FILE *f__cf) +#endif +{ return ungetc(x,f__cf); } +#else +#define un_getc ungetc +#ifdef KR_headers + extern int ungetc(); +#else +extern int ungetc(int, FILE*); /* for systems with a buggy stdio.h */ +#endif +#endif + + int +t_getc(Void) +{ int ch; + if(f__curunit->uend) return(EOF); + if((ch=getc(f__cf))!=EOF) return(ch); + if(feof(f__cf)) + f__curunit->uend = l_eof = 1; + return(EOF); +} +integer e_rsle(Void) +{ + int ch; + if(f__curunit->uend) return(0); + while((ch=t_getc())!='\n') + if (ch == EOF) { + if(feof(f__cf)) + f__curunit->uend = l_eof = 1; + return EOF; + } + return(0); +} + +flag f__lquit; +int f__lcount,f__ltype,nml_read; +char *f__lchar; +double f__lx,f__ly; +#define ERR(x) if(n=(x)) return(n) +#define GETC(x) (x=(*l_getc)()) +#define Ungetc(x,y) (*l_ungetc)(x,y) + + static int +#ifdef KR_headers +l_R(poststar, reqint) int poststar, reqint; +#else +l_R(int poststar, int reqint) +#endif +{ + char s[FMAX+EXPMAXDIGS+4]; + register int ch; + register char *sp, *spe, *sp1; + long e, exp; + int havenum, havestar, se; + + if (!poststar) { + if (f__lcount > 0) + return(0); + f__lcount = 1; + } +#ifdef Allow_TYQUAD + f__llx = 0; +#endif + f__ltype = 0; + exp = 0; + havestar = 0; +retry: + sp1 = sp = s; + spe = sp + FMAX; + havenum = 0; + + switch(GETC(ch)) { + case '-': *sp++ = ch; sp1++; spe++; + case '+': + GETC(ch); + } + while(ch == '0') { + ++havenum; + GETC(ch); + } + while(isdigit(ch)) { + if (sp < spe) *sp++ = ch; + else ++exp; + GETC(ch); + } + if (ch == '*' && !poststar) { + if (sp == sp1 || exp || *s == '-') { + errfl(f__elist->cierr,112,"bad repetition count"); + } + poststar = havestar = 1; + *sp = 0; + f__lcount = atoi(s); + goto retry; + } + if (ch == '.') { +#ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT + if (reqint) + errfl(f__elist->cierr,115,"invalid integer"); +#endif + GETC(ch); + if (sp == sp1) + while(ch == '0') { + ++havenum; + --exp; + GETC(ch); + } + while(isdigit(ch)) { + if (sp < spe) + { *sp++ = ch; --exp; } + GETC(ch); + } + } + havenum += sp - sp1; + se = 0; + if (issign(ch)) + goto signonly; + if (havenum && isexp(ch)) { +#ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT + if (reqint) + errfl(f__elist->cierr,115,"invalid integer"); +#endif + GETC(ch); + if (issign(ch)) { +signonly: + if (ch == '-') se = 1; + GETC(ch); + } + if (!isdigit(ch)) { +bad: + errfl(f__elist->cierr,112,"exponent field"); + } + + e = ch - '0'; + while(isdigit(GETC(ch))) { + e = 10*e + ch - '0'; + if (e > EXPMAX) + goto bad; + } + if (se) + exp -= e; + else + exp += e; + } + (void) Ungetc(ch, f__cf); + if (sp > sp1) { + ++havenum; + while(*--sp == '0') + ++exp; + if (exp) + sprintf(sp+1, "e%ld", exp); + else + sp[1] = 0; + f__lx = atof(s); +#ifdef Allow_TYQUAD + if (reqint&2 && (se = sp - sp1 + exp) > 14 && se < 20) { + /* Assuming 64-bit longint and 32-bit long. */ + if (exp < 0) + sp += exp; + if (sp1 <= sp) { + f__llx = *sp1 - '0'; + while(++sp1 <= sp) + f__llx = 10*f__llx + (*sp1 - '0'); + } + while(--exp >= 0) + f__llx *= 10; + if (*s == '-') + f__llx = -f__llx; + } +#endif + } + else + f__lx = 0.; + if (havenum) + f__ltype = TYLONG; + else + switch(ch) { + case ',': + case '/': + break; + default: + if (havestar && ( ch == ' ' + ||ch == '\t' + ||ch == '\n')) + break; + if (nml_read > 1) { + f__lquit = 2; + return 0; + } + errfl(f__elist->cierr,112,"invalid number"); + } + return 0; + } + + static int +#ifdef KR_headers +rd_count(ch) register int ch; +#else +rd_count(register int ch) +#endif +{ + if (ch < '0' || ch > '9') + return 1; + f__lcount = ch - '0'; + while(GETC(ch) >= '0' && ch <= '9') + f__lcount = 10*f__lcount + ch - '0'; + Ungetc(ch,f__cf); + return f__lcount <= 0; + } + + static int +l_C(Void) +{ int ch, nml_save; + double lz; + if(f__lcount>0) return(0); + f__ltype=0; + GETC(ch); + if(ch!='(') + { + if (nml_read > 1 && (ch < '0' || ch > '9')) { + Ungetc(ch,f__cf); + f__lquit = 2; + return 0; + } + if (rd_count(ch)) + if(!f__cf || !feof(f__cf)) + errfl(f__elist->cierr,112,"complex format"); + else + err(f__elist->cierr,(EOF),"lread"); + if(GETC(ch)!='*') + { + if(!f__cf || !feof(f__cf)) + errfl(f__elist->cierr,112,"no star"); + else + err(f__elist->cierr,(EOF),"lread"); + } + if(GETC(ch)!='(') + { Ungetc(ch,f__cf); + return(0); + } + } + else + f__lcount = 1; + while(iswhit(GETC(ch))); + Ungetc(ch,f__cf); + nml_save = nml_read; + nml_read = 0; + if (ch = l_R(1,0)) + return ch; + if (!f__ltype) + errfl(f__elist->cierr,112,"no real part"); + lz = f__lx; + while(iswhit(GETC(ch))); + if(ch!=',') + { (void) Ungetc(ch,f__cf); + errfl(f__elist->cierr,112,"no comma"); + } + while(iswhit(GETC(ch))); + (void) Ungetc(ch,f__cf); + if (ch = l_R(1,0)) + return ch; + if (!f__ltype) + errfl(f__elist->cierr,112,"no imaginary part"); + while(iswhit(GETC(ch))); + if(ch!=')') errfl(f__elist->cierr,112,"no )"); + f__ly = f__lx; + f__lx = lz; +#ifdef Allow_TYQUAD + f__llx = 0; +#endif + nml_read = nml_save; + return(0); +} + + static char nmLbuf[256], *nmL_next; + static int (*nmL_getc_save)(Void); +#ifdef KR_headers + static int (*nmL_ungetc_save)(/* int, FILE* */); +#else + static int (*nmL_ungetc_save)(int, FILE*); +#endif + + static int +nmL_getc(Void) +{ + int rv; + if (rv = *nmL_next++) + return rv; + l_getc = nmL_getc_save; + l_ungetc = nmL_ungetc_save; + return (*l_getc)(); + } + + static int +#ifdef KR_headers +nmL_ungetc(x, f) int x; FILE *f; +#else +nmL_ungetc(int x, FILE *f) +#endif +{ + f = f; /* banish non-use warning */ + return *--nmL_next = x; + } + + static int +#ifdef KR_headers +Lfinish(ch, dot, rvp) int ch, dot, *rvp; +#else +Lfinish(int ch, int dot, int *rvp) +#endif +{ + char *s, *se; + static char what[] = "namelist input"; + + s = nmLbuf + 2; + se = nmLbuf + sizeof(nmLbuf) - 1; + *s++ = ch; + while(!issep(GETC(ch)) && ch!=EOF) { + if (s >= se) { + nmLbuf_ovfl: + return *rvp = err__fl(f__elist->cierr,131,what); + } + *s++ = ch; + if (ch != '=') + continue; + if (dot) + return *rvp = err__fl(f__elist->cierr,112,what); + got_eq: + *s = 0; + nmL_getc_save = l_getc; + l_getc = nmL_getc; + nmL_ungetc_save = l_ungetc; + l_ungetc = nmL_ungetc; + nmLbuf[1] = *(nmL_next = nmLbuf) = ','; + *rvp = f__lcount = 0; + return 1; + } + if (dot) + goto done; + for(;;) { + if (s >= se) + goto nmLbuf_ovfl; + *s++ = ch; + if (!isblnk(ch)) + break; + if (GETC(ch) == EOF) + goto done; + } + if (ch == '=') + goto got_eq; + done: + Ungetc(ch, f__cf); + return 0; + } + + static int +l_L(Void) +{ + int ch, rv, sawdot; + + if(f__lcount>0) + return(0); + f__lcount = 1; + f__ltype=0; + GETC(ch); + if(isdigit(ch)) + { + rd_count(ch); + if(GETC(ch)!='*') + if(!f__cf || !feof(f__cf)) + errfl(f__elist->cierr,112,"no star"); + else + err(f__elist->cierr,(EOF),"lread"); + GETC(ch); + } + sawdot = 0; + if(ch == '.') { + sawdot = 1; + GETC(ch); + } + switch(ch) + { + case 't': + case 'T': + if (nml_read && Lfinish(ch, sawdot, &rv)) + return rv; + f__lx=1; + break; + case 'f': + case 'F': + if (nml_read && Lfinish(ch, sawdot, &rv)) + return rv; + f__lx=0; + break; + default: + if(isblnk(ch) || issep(ch) || ch==EOF) + { (void) Ungetc(ch,f__cf); + return(0); + } + if (nml_read > 1) { + Ungetc(ch,f__cf); + f__lquit = 2; + return 0; + } + errfl(f__elist->cierr,112,"logical"); + } + f__ltype=TYLONG; + while(!issep(GETC(ch)) && ch!=EOF); + Ungetc(ch, f__cf); + return(0); +} + +#define BUFSIZE 128 + + static int +l_CHAR(Void) +{ int ch,size,i; + static char rafail[] = "realloc failure"; + char quote,*p; + if(f__lcount>0) return(0); + f__ltype=0; + if(f__lchar!=NULL) free(f__lchar); + size=BUFSIZE; + p=f__lchar = (char *)malloc((unsigned int)size); + if(f__lchar == NULL) + errfl(f__elist->cierr,113,"no space"); + + GETC(ch); + if(isdigit(ch)) { + /* allow Fortran 8x-style unquoted string... */ + /* either find a repetition count or the string */ + f__lcount = ch - '0'; + *p++ = ch; + for(i = 1;;) { + switch(GETC(ch)) { + case '*': + if (f__lcount == 0) { + f__lcount = 1; +#ifndef F8X_NML_ELIDE_QUOTES + if (nml_read) + goto no_quote; +#endif + goto noquote; + } + p = f__lchar; + goto have_lcount; + case ',': + case ' ': + case '\t': + case '\n': + case '/': + Ungetc(ch,f__cf); + /* no break */ + case EOF: + f__lcount = 1; + f__ltype = TYCHAR; + return *p = 0; + } + if (!isdigit(ch)) { + f__lcount = 1; +#ifndef F8X_NML_ELIDE_QUOTES + if (nml_read) { + no_quote: + errfl(f__elist->cierr,112, + "undelimited character string"); + } +#endif + goto noquote; + } + *p++ = ch; + f__lcount = 10*f__lcount + ch - '0'; + if (++i == size) { + f__lchar = (char *)realloc(f__lchar, + (unsigned int)(size += BUFSIZE)); + if(f__lchar == NULL) + errfl(f__elist->cierr,113,rafail); + p = f__lchar + i; + } + } + } + else (void) Ungetc(ch,f__cf); + have_lcount: + if(GETC(ch)=='\'' || ch=='"') quote=ch; + else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF) { + Ungetc(ch,f__cf); + return 0; + } +#ifndef F8X_NML_ELIDE_QUOTES + else if (nml_read > 1) { + Ungetc(ch,f__cf); + f__lquit = 2; + return 0; + } +#endif + else { + /* Fortran 8x-style unquoted string */ + *p++ = ch; + for(i = 1;;) { + switch(GETC(ch)) { + case ',': + case ' ': + case '\t': + case '\n': + case '/': + Ungetc(ch,f__cf); + /* no break */ + case EOF: + f__ltype = TYCHAR; + return *p = 0; + } + noquote: + *p++ = ch; + if (++i == size) { + f__lchar = (char *)realloc(f__lchar, + (unsigned int)(size += BUFSIZE)); + if(f__lchar == NULL) + errfl(f__elist->cierr,113,rafail); + p = f__lchar + i; + } + } + } + f__ltype=TYCHAR; + for(i=0;;) + { while(GETC(ch)!=quote && ch!='\n' + && ch!=EOF && ++icierr,113,rafail); + p=f__lchar+i-1; + *p++ = ch; + } + else if(ch==EOF) return(EOF); + else if(ch=='\n') + { if(*(p-1) != '\\') continue; + i--; + p--; + if(++iciunit]; + if(a->ciunit>=MXUNIT || a->ciunit<0) + err(a->cierr,101,"stler"); + f__scale=f__recpos=0; + f__elist=a; + if(f__curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) + err(a->cierr,102,"lio"); + f__cf=f__curunit->ufd; + if(!f__curunit->ufmt) err(a->cierr,103,"lio") + return(0); +} + + int +#ifdef KR_headers +l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len; +#else +l_read(ftnint *number, char *ptr, ftnlen len, ftnint type) +#endif +{ +#define Ptr ((flex *)ptr) + int i,n,ch; + doublereal *yy; + real *xx; + for(i=0;i<*number;i++) + { + if(f__lquit) return(0); + if(l_eof) + err(f__elist->ciend, EOF, "list in") + if(f__lcount == 0) { + f__ltype = 0; + for(;;) { + GETC(ch); + switch(ch) { + case EOF: + err(f__elist->ciend,(EOF),"list in") + case ' ': + case '\t': + case '\n': + continue; + case '/': + f__lquit = 1; + goto loopend; + case ',': + f__lcount = 1; + goto loopend; + default: + (void) Ungetc(ch, f__cf); + goto rddata; + } + } + } + rddata: + switch((int)type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifndef ALLOW_FLOAT_IN_INTEGER_LIST_INPUT + ERR(l_R(0,1)); + break; +#endif + case TYREAL: + case TYDREAL: + ERR(l_R(0,0)); + break; +#ifdef TYQUAD + case TYQUAD: + n = l_R(0,2); + if (n) + return n; + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + ERR(l_C()); + break; + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + ERR(l_L()); + break; + case TYCHAR: + ERR(l_CHAR()); + break; + } + while (GETC(ch) == ' ' || ch == '\t'); + if (ch != ',' || f__lcount > 1) + Ungetc(ch,f__cf); + loopend: + if(f__lquit) return(0); + if(f__cf && ferror(f__cf)) { + clearerr(f__cf); + errfl(f__elist->cierr,errno,"list in"); + } + if(f__ltype==0) goto bump; + switch((int)type) + { + case TYINT1: + case TYLOGICAL1: + Ptr->flchar = (char)f__lx; + break; + case TYLOGICAL2: + case TYSHORT: + Ptr->flshort = (short)f__lx; + break; + case TYLOGICAL: + case TYLONG: + Ptr->flint = (ftnint)f__lx; + break; +#ifdef Allow_TYQUAD + case TYQUAD: + if (!(Ptr->fllongint = f__llx)) + Ptr->fllongint = f__lx; + break; +#endif + case TYREAL: + Ptr->flreal=f__lx; + break; + case TYDREAL: + Ptr->fldouble=f__lx; + break; + case TYCOMPLEX: + xx=(real *)ptr; + *xx++ = f__lx; + *xx = f__ly; + break; + case TYDCOMPLEX: + yy=(doublereal *)ptr; + *yy++ = f__lx; + *yy = f__ly; + break; + case TYCHAR: + b_char(f__lchar,ptr,len); + break; + } + bump: + if(f__lcount>0) f__lcount--; + ptr += len; + if (nml_read) + nml_read++; + } + return(0); +#undef Ptr +} +#ifdef KR_headers +integer s_rsle(a) cilist *a; +#else +integer s_rsle(cilist *a) +#endif +{ + int n; + + f__reading=1; + f__external=1; + f__formatted=1; + if(n=c_le(a)) return(n); + f__lioproc = l_read; + f__lquit = 0; + f__lcount = 0; + l_eof = 0; + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr,errno,"read start"); + if(f__curunit->uend) + err(f__elist->ciend,(EOF),"read start"); + l_getc = t_getc; + l_ungetc = un_getc; + f__doend = xrd_SL; + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/lread.o b/tools/connec/libf2c/lread.o new file mode 100644 index 0000000000000000000000000000000000000000..2fe25f16791d000d5c04647fc03a6842315235af GIT binary patch literal 24832 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 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/lwrite.c b/tools/connec/libf2c/lwrite.c new file mode 100644 index 0000000..9e0d93d --- /dev/null +++ b/tools/connec/libf2c/lwrite.c @@ -0,0 +1,314 @@ +#include "f2c.h" +#include "fio.h" +#include "fmt.h" +#include "lio.h" +#ifdef __cplusplus +extern "C" { +#endif + +ftnint L_len; +int f__Aquote; + + static VOID +donewrec(Void) +{ + if (f__recpos) + (*f__donewrec)(); + } + + static VOID +#ifdef KR_headers +lwrt_I(n) longint n; +#else +lwrt_I(longint n) +#endif +{ + char *p; + int ndigit, sign; + + p = f__icvt(n, &ndigit, &sign, 10); + if(f__recpos + ndigit >= L_len) + donewrec(); + PUT(' '); + if (sign) + PUT('-'); + while(*p) + PUT(*p++); +} + static VOID +#ifdef KR_headers +lwrt_L(n, len) ftnint n; ftnlen len; +#else +lwrt_L(ftnint n, ftnlen len) +#endif +{ + if(f__recpos+LLOGW>=L_len) + donewrec(); + wrt_L((Uint *)&n,LLOGW, len); +} + static VOID +#ifdef KR_headers +lwrt_A(p,len) char *p; ftnlen len; +#else +lwrt_A(char *p, ftnlen len) +#endif +{ + int a; + char *p1, *pe; + + a = 0; + pe = p + len; + if (f__Aquote) { + a = 3; + if (len > 1 && p[len-1] == ' ') { + while(--len > 1 && p[len-1] == ' '); + pe = p + len; + } + p1 = p; + while(p1 < pe) + if (*p1++ == '\'') + a++; + } + if(f__recpos+len+a >= L_len) + donewrec(); + if (a +#ifndef OMIT_BLANK_CC + || !f__recpos +#endif + ) + PUT(' '); + if (a) { + PUT('\''); + while(p < pe) { + if (*p == '\'') + PUT('\''); + PUT(*p++); + } + PUT('\''); + } + else + while(p < pe) + PUT(*p++); +} + + static int +#ifdef KR_headers +l_g(buf, n) char *buf; double n; +#else +l_g(char *buf, double n) +#endif +{ +#ifdef Old_list_output + doublereal absn; + char *fmt; + + absn = n; + if (absn < 0) + absn = -absn; + fmt = LLOW <= absn && absn < LHIGH ? LFFMT : LEFMT; +#ifdef USE_STRLEN + sprintf(buf, fmt, n); + return strlen(buf); +#else + return sprintf(buf, fmt, n); +#endif + +#else + register char *b, c, c1; + + b = buf; + *b++ = ' '; + if (n < 0) { + *b++ = '-'; + n = -n; + } + else + *b++ = ' '; + if (n == 0) { +#ifdef SIGNED_ZEROS + if (signbit_f2c(&n)) + *b++ = '-'; +#endif + *b++ = '0'; + *b++ = '.'; + *b = 0; + goto f__ret; + } + sprintf(b, LGFMT, n); + switch(*b) { +#ifndef WANT_LEAD_0 + case '0': + while(b[0] = b[1]) + b++; + break; +#endif + case 'i': + case 'I': + /* Infinity */ + case 'n': + case 'N': + /* NaN */ + while(*++b); + break; + + default: + /* Fortran 77 insists on having a decimal point... */ + for(;; b++) + switch(*b) { + case 0: + *b++ = '.'; + *b = 0; + goto f__ret; + case '.': + while(*++b); + goto f__ret; + case 'E': + for(c1 = '.', c = 'E'; *b = c1; + c1 = c, c = *++b); + goto f__ret; + } + } + f__ret: + return b - buf; +#endif + } + + static VOID +#ifdef KR_headers +l_put(s) register char *s; +#else +l_put(register char *s) +#endif +{ +#ifdef KR_headers + register void (*pn)() = f__putn; +#else + register void (*pn)(int) = f__putn; +#endif + register int c; + + while(c = *s++) + (*pn)(c); + } + + static VOID +#ifdef KR_headers +lwrt_F(n) double n; +#else +lwrt_F(double n) +#endif +{ + char buf[LEFBL]; + + if(f__recpos + l_g(buf,n) >= L_len) + donewrec(); + l_put(buf); +} + static VOID +#ifdef KR_headers +lwrt_C(a,b) double a,b; +#else +lwrt_C(double a, double b) +#endif +{ + char *ba, *bb, bufa[LEFBL], bufb[LEFBL]; + int al, bl; + + al = l_g(bufa, a); + for(ba = bufa; *ba == ' '; ba++) + --al; + bl = l_g(bufb, b) + 1; /* intentionally high by 1 */ + for(bb = bufb; *bb == ' '; bb++) + --bl; + if(f__recpos + al + bl + 3 >= L_len) + donewrec(); +#ifdef OMIT_BLANK_CC + else +#endif + PUT(' '); + PUT('('); + l_put(ba); + PUT(','); + if (f__recpos + bl >= L_len) { + (*f__donewrec)(); +#ifndef OMIT_BLANK_CC + PUT(' '); +#endif + } + l_put(bb); + PUT(')'); +} + + int +#ifdef KR_headers +l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len; +#else +l_write(ftnint *number, char *ptr, ftnlen len, ftnint type) +#endif +{ +#define Ptr ((flex *)ptr) + int i; + longint x; + double y,z; + real *xx; + doublereal *yy; + for(i=0;i< *number; i++) + { + switch((int)type) + { + default: f__fatal(117,"unknown type in lio"); + case TYINT1: + x = Ptr->flchar; + goto xint; + case TYSHORT: + x=Ptr->flshort; + goto xint; +#ifdef Allow_TYQUAD + case TYQUAD: + x = Ptr->fllongint; + goto xint; +#endif + case TYLONG: + x=Ptr->flint; + xint: lwrt_I(x); + break; + case TYREAL: + y=Ptr->flreal; + goto xfloat; + case TYDREAL: + y=Ptr->fldouble; + xfloat: lwrt_F(y); + break; + case TYCOMPLEX: + xx= &Ptr->flreal; + y = *xx++; + z = *xx; + goto xcomplex; + case TYDCOMPLEX: + yy = &Ptr->fldouble; + y= *yy++; + z = *yy; + xcomplex: + lwrt_C(y,z); + break; + case TYLOGICAL1: + x = Ptr->flchar; + goto xlog; + case TYLOGICAL2: + x = Ptr->flshort; + goto xlog; + case TYLOGICAL: + x = Ptr->flint; + xlog: lwrt_L(Ptr->flint, len); + break; + case TYCHAR: + lwrt_A(ptr,len); + break; + } + ptr += len; + } + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/lwrite.o b/tools/connec/libf2c/lwrite.o new file mode 100644 index 0000000000000000000000000000000000000000..a0259ca84aa311e8b003d9e298d73cf05e73f591 GIT binary patch literal 5560 zcmbuCe{5UD9l-D9C8^iKdk&?LE~E3*$C?7MoTh+70{A6Pb7t-jMnWf`drcf?jhZ?k zd0tAFfHNmuEZ4M?(1tXm?w?KjYeW2zu?;0rQvys|)pa0E>#DIy40}$gnhu7-nD_nO zyGyT5tWE42`Q7(E_x;{|?|b*|UY=_U?AxN%*tzMmQA z-=dkD+1PKKDS*u2v}o$juVR_S27Ov>-eZTG_dFM9_Qk)XPq!*l>cpHrF@csCBqtDN z>JRxBnnU&%_34d?Wv?AbEVtQPCob6A&@P{A?z79AWAVRWEzv~c{{)BJK^S#G^`h@q zh*<$0!X`Ni{077O0i=FSlXEblYsx)wA$~Qt6^)>i8Ys>E=Hq6k*#RjXUwjdRON|iRUKW1xAEN-NHoGNb?-VN!qVnYw)ELZW zprI)AvD=-dHuQ;u&yuOT+erRgb~BLtU$1w8`x86cUB0AOg$>w_qsG4M17KyQ-bjG% z(I@{1^9^TujD2SEiV{kmRm?=Q;jyo>F_v_9(C}ql;F0;70v?0l@d|j*OusRh%qukc zx{??p9{XBQW$#x@CfKA(Sw0EIQkG|HSJE3!y`TN|zY2xfdsdKo2dIQbF488ZjaE51 zmpY)SE7>r5ZC~-qJ^gQy1I$FH3ntrP_;MPghRrPJ1C2$TdmOav(kGC(Z-5p`Lz-br z(KOo=$+@zX$j3J0Hge6BVL<6o!_W3ot`dgIz5@RFcUe14o!_15*+kMT-pPylgcn{~ znp{?%b(x9LO$Cp=ad+dQe*8he;nd|{!TuomEi{>h)P1bjXjB14A3!e^B>#4}@jX1C zFsX%Y@vHd8F4Bl|SSjae|2tOG0iC;n;JXySVfHiJ>JpG(S2sQpGemPeGTB_@hoJ5Zgu4y-U$t8@DVJFl!@GZ=#2sVA9AO+v7N+YhhqaHF^~PsVARtW^Yr%( z{Fg2hqWxB`D964^l%sB?=B9P7Q?Lt=e}T7s9?RXD`w`7W3{ZD+&Tb-8b004=wd$lA z)I2>}HPlV8!#C(DZnp(*h#TyVtrv#o23SpKp5nHr%0X$-+$YOgwCd;87R{3>Z_#Q` zRG6CYc%`ZNlk3{G^NLzszFzYKGqqZ<0bB5C(OlRaA?>ZL4|r-jyW=rC?z!K4uh&=C z5NEaeXY2i5-_Gq09*f*{A;DmXi^ zp^p1xv&4VL^NIGF#4mD=_P0y?9}>S!;tF;Ef(6c3jJsaqw@AE3;_`g!N^tnZW`c!m zKPqul#kj9YT#n~;iOcbH^P>ryW&1&i%l6|Em*Y86f}bwIeI_ewlMm zk$nSSSEGpAoYxldkNCXqDdHP=Jia2{%KH)DVj`Y)&OJr;yh`x?L=pDv+Yagn5rPQb z?o`PMUJ5SmE#e)1=7`vn@iKL2pa(7b-Ey@oHq) z_RE#}`?y>5kkvcXbtFo>j(hj;F!4qPjvR@`pywD|hu-!*optO&zeE@#4oadixhxoeS-Gt+a{VVp_-JD~dW%2WX#JY(#-kqqD zFN3z$_4zn8iH+rp8TVqAd_fU;KpruYB{xgq8ceTBbRzkXmC zKR*sYb7W%mr!#91`4e_SpkSY$)qezhu}>fTWD(=vB}34~_@YcmOg8=L{}?~^Q=EJ3 v=Vk6c#T#)u;;%S=p95ArcR<9?-=FVeMG_IWKzNs|<)7v2cS;!Yve^GWA}D*x literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/main.c b/tools/connec/libf2c/main.c new file mode 100644 index 0000000..d95fdc9 --- /dev/null +++ b/tools/connec/libf2c/main.c @@ -0,0 +1,148 @@ +/* STARTUP PROCEDURE FOR UNIX FORTRAN PROGRAMS */ + +#include "stdio.h" +#include "signal1.h" + +#ifndef SIGIOT +#ifdef SIGABRT +#define SIGIOT SIGABRT +#endif +#endif + +#ifndef KR_headers +#undef VOID +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif + +#ifndef VOID +#define VOID void +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef NO__STDC +#define ONEXIT onexit +extern VOID f_exit(); +#else +#ifndef KR_headers +extern void f_exit(void); +#ifndef NO_ONEXIT +#define ONEXIT atexit +extern int atexit(void (*)(void)); +#endif +#else +#ifndef NO_ONEXIT +#define ONEXIT onexit +extern VOID f_exit(); +#endif +#endif +#endif + +#ifdef KR_headers +extern VOID f_init(), sig_die(); +extern int MAIN__(); +#define Int /* int */ +#else +extern void f_init(void), sig_die(const char*, int); +extern int MAIN__(void); +#define Int int +#endif + +static VOID sigfdie(Sigarg) +{ +Use_Sigarg; +sig_die("Floating Exception", 1); +} + + +static VOID sigidie(Sigarg) +{ +Use_Sigarg; +sig_die("IOT Trap", 1); +} + +#ifdef SIGQUIT +static VOID sigqdie(Sigarg) +{ +Use_Sigarg; +sig_die("Quit signal", 1); +} +#endif + + +static VOID sigindie(Sigarg) +{ +Use_Sigarg; +sig_die("Interrupt", 0); +} + +static VOID sigtdie(Sigarg) +{ +Use_Sigarg; +sig_die("Killed", 0); +} + +#ifdef SIGTRAP +static VOID sigtrdie(Sigarg) +{ +Use_Sigarg; +sig_die("Trace trap", 1); +} +#endif + + +int xargc; +char **xargv; + +#ifdef __cplusplus + } +#endif + + int +#ifdef KR_headers +main(argc, argv) int argc; char **argv; +#else +main(int argc, char **argv) +#endif +{ +xargc = argc; +xargv = argv; +signal1(SIGFPE, sigfdie); /* ignore underflow, enable overflow */ +#ifdef SIGIOT +signal1(SIGIOT, sigidie); +#endif +#ifdef SIGTRAP +signal1(SIGTRAP, sigtrdie); +#endif +#ifdef SIGQUIT +if(signal1(SIGQUIT,sigqdie) == SIG_IGN) + signal1(SIGQUIT, SIG_IGN); +#endif +if(signal1(SIGINT, sigindie) == SIG_IGN) + signal1(SIGINT, SIG_IGN); +signal1(SIGTERM,sigtdie); + +#ifdef pdp11 + ldfps(01200); /* detect overflow as an exception */ +#endif + +f_init(); +#ifndef NO_ONEXIT +ONEXIT(f_exit); +#endif +MAIN__(); +#ifdef NO_ONEXIT +f_exit(); +#endif +exit(0); /* exit(0) rather than return(0) to bypass Cray bug */ +return 0; /* For compilers that complain of missing return values; */ + /* others will complain that this is unreachable code. */ +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/main.o b/tools/connec/libf2c/main.o new file mode 100644 index 0000000000000000000000000000000000000000..a1027a769c74554aa551353e0a8211e6cf84632a GIT binary patch literal 3192 zcmb`J&u<$=6vvL0)#P$~4ni31|M@9c~{o$RPp)fai*%xAtc z@9pf&Y~HKXX7}WBq%21-(4eI#(d7O?y)3F_IzU5I-TbR?8SU!U^KjQiee<`%ueazy zknAycwdbP9s(P^`^4cn0-Pzf>Qs^hTRr&_tUJdjB?$N+mfP5cp{*z0p)veMI;5|3t zX~x_CF@8YdbU8j6ER6tHxI0~`%XrwqoTP)wjG z(W)2p!i4x(dMjZ7kK@_%yv5nsS1Wa|J~dsd zcyxAZe!=rN4Pisl<3_-m{mZuwOucVBCvF?X@m^riV|OY3EFhbyFAJLL@8i1CS0p#} zuW5ShJ*8I(oBBl4<5`scg5;+DV@-cR(|>Bwf34}Ux7GYVXdG*$_|K9fF7}t=e^~gR z7JkFR_ofF}tg}Aigh%m|CkhhFNMe-IyGM9kNgnI{8D~v zCd3+;$~$clo#6`RywmZEa?Wuzq4X*~&aG}LzVhd|Q`L3d)!WP;W3!~!Bs?cQ?r7W} j=KA5=U_Lt|8k76yJQ|vrx#CXE8h=d&TGz&+YL5RO;l$Zt literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/makefile b/tools/connec/libf2c/makefile new file mode 100644 index 0000000..efe7dc0 --- /dev/null +++ b/tools/connec/libf2c/makefile @@ -0,0 +1,219 @@ +# Unix makefile: see README. +# For C++, first "make hadd". +# If your compiler does not recognize ANSI C, add +# -DKR_headers +# to the CFLAGS = line below. +# On Sun and other BSD systems that do not provide an ANSI sprintf, add +# -DUSE_STRLEN +# to the CFLAGS = line below. +# On Linux systems, add +# -DNON_UNIX_STDIO +# to the CFLAGS = line below. For libf2c.so under Linux, also add +# -fPIC +# to the CFLAGS = line below. + +.SUFFIXES: .c .o +CC = cc +SHELL = /bin/sh +CFLAGS = -O + +# compile, then strip unnecessary symbols +.c.o: + $(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c + ld -r -x -o $*.xxx $*.o + mv $*.xxx $*.o +## Under Solaris (and other systems that do not understand ld -x), +## omit -x in the ld line above. +## If your system does not have the ld command, comment out +## or remove both the ld and mv lines above. + +MISC = f77vers.o i77vers.o main.o s_rnge.o abort_.o exit_.o getarg_.o iargc_.o\ + getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o ctype.o\ + derf_.o derfc_.o erf_.o erfc_.o sig_die.o uninit.o +POW = pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o pow_ri.o pow_zi.o pow_zz.o +CX = c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o +DCX = z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o +REAL = r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\ + r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\ + r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\ + r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o +DBL = d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\ + d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\ + d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\ + d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\ + d_sqrt.o d_tan.o d_tanh.o +INT = i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_mod.o i_nint.o i_sign.o\ + lbitbits.o lbitshft.o +HALF = h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o h_nint.o h_sign.o +CMP = l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o +EFL = ef1asc_.o ef1cmc_.o +CHAR = f77_aloc.o s_cat.o s_cmp.o s_copy.o +I77 = backspac.o close.o dfe.o dolio.o due.o endfile.o err.o\ + fmt.o fmtlib.o ftell_.o iio.o ilnw.o inquire.o lread.o lwrite.o\ + open.o rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o\ + typesize.o uio.o util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o +QINT = pow_qq.o qbitbits.o qbitshft.o ftell64_.o +TIME = dtime_.o etime_.o + +# If you get an error compiling dtime_.c or etime_.c, try adding +# -DUSE_CLOCK to the CFLAGS assignment above; if that does not work, +# omit $(TIME) from OFILES = assignment below. + +# To get signed zeros in write statements on IEEE-arithmetic systems, +# add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.o +# to the end of the OFILES = assignment below. + +# For INTEGER*8 support (which requires system-dependent adjustments to +# f2c.h), add $(QINT) to the OFILES = assignment below... + +OFILES = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \ + $(HALF) $(CMP) $(EFL) $(CHAR) $(I77) $(TIME) + +all: f2c.h signal1.h sysdep1.h libf2c.a + +libf2c.a: $(OFILES) + ar r libf2c.a $? + -ranlib libf2c.a + +## Shared-library variant: the following rule works on Linux +## systems. Details are system-dependent. Under Linux, -fPIC +## must appear in the CFLAGS assignment when making libf2c.so. +## Under Solaris, use -Kpic in CFLAGS and use "ld -G" instead +## of "$(CC) -shared". +## For MacOSX 10.4 and 10.5 (and perhaps other versions >= 10.3), use +## "MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -single_module" +## instead of "$(CC) -shared", and when running programs linked against libf2c.so, +## arrange for $DYLD_LIBRARY_PATH to include the directory containing libf2c.so. + +libf2c.so: $(OFILES) + $(CC) -shared -o libf2c.so $(OFILES) + +### If your system lacks ranlib, you don't need it; see README. + +f77vers.o: f77vers.c + $(CC) -c f77vers.c + +i77vers.o: i77vers.c + $(CC) -c i77vers.c + +# To get an "f2c.h" for use with "f2c -C++", first "make hadd" +hadd: f2c.h0 f2ch.add + cat f2c.h0 f2ch.add >f2c.h + +# For use with "f2c" and "f2c -A": +f2c.h: f2c.h0 + cp f2c.h0 f2c.h + +# You may need to adjust signal1.h and sysdep1.h suitably for your system... +signal1.h: signal1.h0 + cp signal1.h0 signal1.h + +sysdep1.h: sysdep1.h0 + cp sysdep1.h0 sysdep1.h + +# If your system lacks onexit() and you are not using an +# ANSI C compiler, then you should uncomment the following +# two lines (for compiling main.o): +#main.o: main.c +# $(CC) -c -DNO_ONEXIT -DSkip_f2c_Undefs main.c +# On at least some Sun systems, it is more appropriate to +# uncomment the following two lines: +#main.o: main.c +# $(CC) -c -Donexit=on_exit -DSkip_f2c_Undefs main.c + +install: libf2c.a + cp libf2c.a $(LIBDIR) + -ranlib $(LIBDIR)/libf2c.a + +clean: + rm -f libf2c.a *.o arith.h signal1.h sysdep1.h + +backspac.o: fio.h +close.o: fio.h +dfe.o: fio.h +dfe.o: fmt.h +due.o: fio.h +endfile.o: fio.h rawio.h +err.o: fio.h rawio.h +fmt.o: fio.h +fmt.o: fmt.h +iio.o: fio.h +iio.o: fmt.h +ilnw.o: fio.h +ilnw.o: lio.h +inquire.o: fio.h +lread.o: fio.h +lread.o: fmt.h +lread.o: lio.h +lread.o: fp.h +lwrite.o: fio.h +lwrite.o: fmt.h +lwrite.o: lio.h +open.o: fio.h rawio.h +rdfmt.o: fio.h +rdfmt.o: fmt.h +rdfmt.o: fp.h +rewind.o: fio.h +rsfe.o: fio.h +rsfe.o: fmt.h +rsli.o: fio.h +rsli.o: lio.h +rsne.o: fio.h +rsne.o: lio.h +sfe.o: fio.h +signbit.o: arith.h +sue.o: fio.h +uio.o: fio.h +uninit.o: arith.h +util.o: fio.h +wref.o: fio.h +wref.o: fmt.h +wref.o: fp.h +wrtfmt.o: fio.h +wrtfmt.o: fmt.h +wsfe.o: fio.h +wsfe.o: fmt.h +wsle.o: fio.h +wsle.o: fmt.h +wsle.o: lio.h +wsne.o: fio.h +wsne.o: lio.h +xwsne.o: fio.h +xwsne.o: lio.h +xwsne.o: fmt.h + +arith.h: arithchk.c + $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\ + $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm + ./a.out >arith.h + rm -f a.out arithchk.o + +check: + xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ + c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ + ctype.c ctype.h \ + d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ + d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ + d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ + d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ + ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ + f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ + fp.h ftell_.c ftell64_.c \ + getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ + h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ + i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c \ + i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ + l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ + lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ + makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ + pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ + qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ + r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ + r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ + r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ + s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c scomptry.bat sfe.c \ + sig_die.c signal1.h0 signal_.c signbit.c sue.c sysdep1.h0 system_.c \ + typesize.c \ + uio.c uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ + z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out diff --git a/tools/connec/libf2c/makefile.sy b/tools/connec/libf2c/makefile.sy new file mode 100644 index 0000000..0e009ef --- /dev/null +++ b/tools/connec/libf2c/makefile.sy @@ -0,0 +1,190 @@ +# For making f2c.lib (here called syf2c.lib) with Symantec C++ . +# Invoke with "make -f makefile.sy" . +# In the CFLAGS line below, "-mn" is for NT and W9x. +# For 32-bit addressing with MSDOS, change "-mn" to "-mx". +# With Symantec, it is necessary to explicitly load main.obj . + +# To get signed zeros in write statements on IEEE-arithmetic systems, +# add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.obj +# to the objects in the "w =" list below. + +CC = sc +CFLAGS = -DMSDOS -D_POSIX_SOURCE -DNO_ONEXIT -s -mn -DUSE_CLOCK -DNO_My_ctype + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +w = \ + abort_.obj \ + backspac.obj \ + c_abs.obj \ + c_cos.obj \ + c_div.obj \ + c_exp.obj \ + c_log.obj \ + c_sin.obj \ + c_sqrt.obj \ + cabs.obj \ + close.obj \ + d_abs.obj \ + d_acos.obj \ + d_asin.obj \ + d_atan.obj \ + d_atn2.obj \ + d_cnjg.obj \ + d_cos.obj \ + d_cosh.obj \ + d_dim.obj \ + d_exp.obj \ + d_imag.obj \ + d_int.obj \ + d_lg10.obj \ + d_log.obj \ + d_mod.obj \ + d_nint.obj \ + d_prod.obj \ + d_sign.obj \ + d_sin.obj \ + d_sinh.obj \ + d_sqrt.obj \ + d_tan.obj \ + d_tanh.obj \ + derf_.obj \ + derfc_.obj \ + dfe.obj \ + dolio.obj \ + dtime_.obj \ + due.obj \ + ef1asc_.obj \ + ef1cmc_.obj \ + endfile.obj \ + erf_.obj \ + erfc_.obj \ + err.obj \ + etime_.obj \ + exit_.obj \ + f77_aloc.obj \ + f77vers.obj \ + fmt.obj \ + fmtlib.obj \ + ftell_.obj \ + getarg_.obj \ + getenv_.obj \ + h_abs.obj \ + h_dim.obj \ + h_dnnt.obj \ + h_indx.obj \ + h_len.obj \ + h_mod.obj \ + h_nint.obj \ + h_sign.obj \ + hl_ge.obj \ + hl_gt.obj \ + hl_le.obj \ + hl_lt.obj \ + i77vers.obj \ + i_abs.obj \ + i_dim.obj \ + i_dnnt.obj \ + i_indx.obj \ + i_len.obj \ + i_mod.obj \ + i_nint.obj \ + i_sign.obj \ + iargc_.obj \ + iio.obj \ + ilnw.obj \ + inquire.obj \ + l_ge.obj \ + l_gt.obj \ + l_le.obj \ + l_lt.obj \ + lbitbits.obj \ + lbitshft.obj \ + lread.obj \ + lwrite.obj \ + main.obj \ + open.obj \ + pow_ci.obj \ + pow_dd.obj \ + pow_di.obj \ + pow_hh.obj \ + pow_ii.obj \ + pow_ri.obj \ + pow_zi.obj \ + pow_zz.obj \ + r_abs.obj \ + r_acos.obj \ + r_asin.obj \ + r_atan.obj \ + r_atn2.obj \ + r_cnjg.obj \ + r_cos.obj \ + r_cosh.obj \ + r_dim.obj \ + r_exp.obj \ + r_imag.obj \ + r_int.obj \ + r_lg10.obj \ + r_log.obj \ + r_mod.obj \ + r_nint.obj \ + r_sign.obj \ + r_sin.obj \ + r_sinh.obj \ + r_sqrt.obj \ + r_tan.obj \ + r_tanh.obj \ + rdfmt.obj \ + rewind.obj \ + rsfe.obj \ + rsli.obj \ + rsne.obj \ + s_cat.obj \ + s_cmp.obj \ + s_copy.obj \ + s_paus.obj \ + s_rnge.obj \ + s_stop.obj \ + sfe.obj \ + sig_die.obj \ + signal_.obj \ + sue.obj \ + system_.obj \ + typesize.obj \ + uio.obj \ + util.obj \ + uninit.obj \ + wref.obj \ + wrtfmt.obj \ + wsfe.obj \ + wsle.obj \ + wsne.obj \ + xwsne.obj \ + z_abs.obj \ + z_cos.obj \ + z_div.obj \ + z_exp.obj \ + z_log.obj \ + z_sin.obj \ + z_sqrt.obj + +syf2c.lib: f2c.h signal1.h sysdep1.h $w + lib /B /C syf2c.lib @libf2c.sy + +f2c.h: f2c.h0 + copy f2c.h0 f2c.h + +signal1.h: signal1.h0 + copy signal1.h0 signal1.h + +sysdep1.h: sysdep1.h0 + copy sysdep1.h0 sysdep1.h + +signbit.obj uninit.obj: arith.h + +arith.h: arithchk.c + scomptry.bat $(CC) $(CFLAGS) arithchk.c + arithchk + del arithchk.exe + del arithchk.obj diff --git a/tools/connec/libf2c/makefile.u b/tools/connec/libf2c/makefile.u new file mode 100644 index 0000000..efe7dc0 --- /dev/null +++ b/tools/connec/libf2c/makefile.u @@ -0,0 +1,219 @@ +# Unix makefile: see README. +# For C++, first "make hadd". +# If your compiler does not recognize ANSI C, add +# -DKR_headers +# to the CFLAGS = line below. +# On Sun and other BSD systems that do not provide an ANSI sprintf, add +# -DUSE_STRLEN +# to the CFLAGS = line below. +# On Linux systems, add +# -DNON_UNIX_STDIO +# to the CFLAGS = line below. For libf2c.so under Linux, also add +# -fPIC +# to the CFLAGS = line below. + +.SUFFIXES: .c .o +CC = cc +SHELL = /bin/sh +CFLAGS = -O + +# compile, then strip unnecessary symbols +.c.o: + $(CC) -c -DSkip_f2c_Undefs $(CFLAGS) $*.c + ld -r -x -o $*.xxx $*.o + mv $*.xxx $*.o +## Under Solaris (and other systems that do not understand ld -x), +## omit -x in the ld line above. +## If your system does not have the ld command, comment out +## or remove both the ld and mv lines above. + +MISC = f77vers.o i77vers.o main.o s_rnge.o abort_.o exit_.o getarg_.o iargc_.o\ + getenv_.o signal_.o s_stop.o s_paus.o system_.o cabs.o ctype.o\ + derf_.o derfc_.o erf_.o erfc_.o sig_die.o uninit.o +POW = pow_ci.o pow_dd.o pow_di.o pow_hh.o pow_ii.o pow_ri.o pow_zi.o pow_zz.o +CX = c_abs.o c_cos.o c_div.o c_exp.o c_log.o c_sin.o c_sqrt.o +DCX = z_abs.o z_cos.o z_div.o z_exp.o z_log.o z_sin.o z_sqrt.o +REAL = r_abs.o r_acos.o r_asin.o r_atan.o r_atn2.o r_cnjg.o r_cos.o\ + r_cosh.o r_dim.o r_exp.o r_imag.o r_int.o\ + r_lg10.o r_log.o r_mod.o r_nint.o r_sign.o\ + r_sin.o r_sinh.o r_sqrt.o r_tan.o r_tanh.o +DBL = d_abs.o d_acos.o d_asin.o d_atan.o d_atn2.o\ + d_cnjg.o d_cos.o d_cosh.o d_dim.o d_exp.o\ + d_imag.o d_int.o d_lg10.o d_log.o d_mod.o\ + d_nint.o d_prod.o d_sign.o d_sin.o d_sinh.o\ + d_sqrt.o d_tan.o d_tanh.o +INT = i_abs.o i_dim.o i_dnnt.o i_indx.o i_len.o i_mod.o i_nint.o i_sign.o\ + lbitbits.o lbitshft.o +HALF = h_abs.o h_dim.o h_dnnt.o h_indx.o h_len.o h_mod.o h_nint.o h_sign.o +CMP = l_ge.o l_gt.o l_le.o l_lt.o hl_ge.o hl_gt.o hl_le.o hl_lt.o +EFL = ef1asc_.o ef1cmc_.o +CHAR = f77_aloc.o s_cat.o s_cmp.o s_copy.o +I77 = backspac.o close.o dfe.o dolio.o due.o endfile.o err.o\ + fmt.o fmtlib.o ftell_.o iio.o ilnw.o inquire.o lread.o lwrite.o\ + open.o rdfmt.o rewind.o rsfe.o rsli.o rsne.o sfe.o sue.o\ + typesize.o uio.o util.o wref.o wrtfmt.o wsfe.o wsle.o wsne.o xwsne.o +QINT = pow_qq.o qbitbits.o qbitshft.o ftell64_.o +TIME = dtime_.o etime_.o + +# If you get an error compiling dtime_.c or etime_.c, try adding +# -DUSE_CLOCK to the CFLAGS assignment above; if that does not work, +# omit $(TIME) from OFILES = assignment below. + +# To get signed zeros in write statements on IEEE-arithmetic systems, +# add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.o +# to the end of the OFILES = assignment below. + +# For INTEGER*8 support (which requires system-dependent adjustments to +# f2c.h), add $(QINT) to the OFILES = assignment below... + +OFILES = $(MISC) $(POW) $(CX) $(DCX) $(REAL) $(DBL) $(INT) \ + $(HALF) $(CMP) $(EFL) $(CHAR) $(I77) $(TIME) + +all: f2c.h signal1.h sysdep1.h libf2c.a + +libf2c.a: $(OFILES) + ar r libf2c.a $? + -ranlib libf2c.a + +## Shared-library variant: the following rule works on Linux +## systems. Details are system-dependent. Under Linux, -fPIC +## must appear in the CFLAGS assignment when making libf2c.so. +## Under Solaris, use -Kpic in CFLAGS and use "ld -G" instead +## of "$(CC) -shared". +## For MacOSX 10.4 and 10.5 (and perhaps other versions >= 10.3), use +## "MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -single_module" +## instead of "$(CC) -shared", and when running programs linked against libf2c.so, +## arrange for $DYLD_LIBRARY_PATH to include the directory containing libf2c.so. + +libf2c.so: $(OFILES) + $(CC) -shared -o libf2c.so $(OFILES) + +### If your system lacks ranlib, you don't need it; see README. + +f77vers.o: f77vers.c + $(CC) -c f77vers.c + +i77vers.o: i77vers.c + $(CC) -c i77vers.c + +# To get an "f2c.h" for use with "f2c -C++", first "make hadd" +hadd: f2c.h0 f2ch.add + cat f2c.h0 f2ch.add >f2c.h + +# For use with "f2c" and "f2c -A": +f2c.h: f2c.h0 + cp f2c.h0 f2c.h + +# You may need to adjust signal1.h and sysdep1.h suitably for your system... +signal1.h: signal1.h0 + cp signal1.h0 signal1.h + +sysdep1.h: sysdep1.h0 + cp sysdep1.h0 sysdep1.h + +# If your system lacks onexit() and you are not using an +# ANSI C compiler, then you should uncomment the following +# two lines (for compiling main.o): +#main.o: main.c +# $(CC) -c -DNO_ONEXIT -DSkip_f2c_Undefs main.c +# On at least some Sun systems, it is more appropriate to +# uncomment the following two lines: +#main.o: main.c +# $(CC) -c -Donexit=on_exit -DSkip_f2c_Undefs main.c + +install: libf2c.a + cp libf2c.a $(LIBDIR) + -ranlib $(LIBDIR)/libf2c.a + +clean: + rm -f libf2c.a *.o arith.h signal1.h sysdep1.h + +backspac.o: fio.h +close.o: fio.h +dfe.o: fio.h +dfe.o: fmt.h +due.o: fio.h +endfile.o: fio.h rawio.h +err.o: fio.h rawio.h +fmt.o: fio.h +fmt.o: fmt.h +iio.o: fio.h +iio.o: fmt.h +ilnw.o: fio.h +ilnw.o: lio.h +inquire.o: fio.h +lread.o: fio.h +lread.o: fmt.h +lread.o: lio.h +lread.o: fp.h +lwrite.o: fio.h +lwrite.o: fmt.h +lwrite.o: lio.h +open.o: fio.h rawio.h +rdfmt.o: fio.h +rdfmt.o: fmt.h +rdfmt.o: fp.h +rewind.o: fio.h +rsfe.o: fio.h +rsfe.o: fmt.h +rsli.o: fio.h +rsli.o: lio.h +rsne.o: fio.h +rsne.o: lio.h +sfe.o: fio.h +signbit.o: arith.h +sue.o: fio.h +uio.o: fio.h +uninit.o: arith.h +util.o: fio.h +wref.o: fio.h +wref.o: fmt.h +wref.o: fp.h +wrtfmt.o: fio.h +wrtfmt.o: fmt.h +wsfe.o: fio.h +wsfe.o: fmt.h +wsle.o: fio.h +wsle.o: fmt.h +wsle.o: lio.h +wsne.o: fio.h +wsne.o: lio.h +xwsne.o: fio.h +xwsne.o: lio.h +xwsne.o: fmt.h + +arith.h: arithchk.c + $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\ + $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm + ./a.out >arith.h + rm -f a.out arithchk.o + +check: + xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ + c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ + ctype.c ctype.h \ + d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ + d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ + d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ + d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ + ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ + f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ + fp.h ftell_.c ftell64_.c \ + getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ + h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ + i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c \ + i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ + l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ + lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ + makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ + pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ + qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ + r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ + r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ + r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ + s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c scomptry.bat sfe.c \ + sig_die.c signal1.h0 signal_.c signbit.c sue.c sysdep1.h0 system_.c \ + typesize.c \ + uio.c uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ + z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out diff --git a/tools/connec/libf2c/makefile.vc b/tools/connec/libf2c/makefile.vc new file mode 100644 index 0000000..b3dd90c --- /dev/null +++ b/tools/connec/libf2c/makefile.vc @@ -0,0 +1,195 @@ +# For making f2c.lib (here called vcf2c.lib) with Microsoft Visual C++ . +# Invoke with "nmake -f makefile.vc" . + +# To get signed zeros in write statements on IEEE-arithmetic systems, +# add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.obj +# to the objects in the "w =" list below. + +CC = cl +CFLAGS = -DUSE_CLOCK -DMSDOS -DNO_ONEXIT -Ot1 -DNO_My_ctype -DNO_ISATTY + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +w = \ + abort_.obj \ + backspac.obj \ + c_abs.obj \ + c_cos.obj \ + c_div.obj \ + c_exp.obj \ + c_log.obj \ + c_sin.obj \ + c_sqrt.obj \ + cabs.obj \ + close.obj \ + d_abs.obj \ + d_acos.obj \ + d_asin.obj \ + d_atan.obj \ + d_atn2.obj \ + d_cnjg.obj \ + d_cos.obj \ + d_cosh.obj \ + d_dim.obj \ + d_exp.obj \ + d_imag.obj \ + d_int.obj \ + d_lg10.obj \ + d_log.obj \ + d_mod.obj \ + d_nint.obj \ + d_prod.obj \ + d_sign.obj \ + d_sin.obj \ + d_sinh.obj \ + d_sqrt.obj \ + d_tan.obj \ + d_tanh.obj \ + derf_.obj \ + derfc_.obj \ + dfe.obj \ + dolio.obj \ + dtime_.obj \ + due.obj \ + ef1asc_.obj \ + ef1cmc_.obj \ + endfile.obj \ + erf_.obj \ + erfc_.obj \ + err.obj \ + etime_.obj \ + exit_.obj \ + f77_aloc.obj \ + f77vers.obj \ + fmt.obj \ + fmtlib.obj \ + ftell_.obj \ + getarg_.obj \ + getenv_.obj \ + h_abs.obj \ + h_dim.obj \ + h_dnnt.obj \ + h_indx.obj \ + h_len.obj \ + h_mod.obj \ + h_nint.obj \ + h_sign.obj \ + hl_ge.obj \ + hl_gt.obj \ + hl_le.obj \ + hl_lt.obj \ + i77vers.obj \ + i_abs.obj \ + i_dim.obj \ + i_dnnt.obj \ + i_indx.obj \ + i_len.obj \ + i_mod.obj \ + i_nint.obj \ + i_sign.obj \ + iargc_.obj \ + iio.obj \ + ilnw.obj \ + inquire.obj \ + l_ge.obj \ + l_gt.obj \ + l_le.obj \ + l_lt.obj \ + lbitbits.obj \ + lbitshft.obj \ + lread.obj \ + lwrite.obj \ + main.obj \ + open.obj \ + pow_ci.obj \ + pow_dd.obj \ + pow_di.obj \ + pow_hh.obj \ + pow_ii.obj \ + pow_ri.obj \ + pow_zi.obj \ + pow_zz.obj \ + r_abs.obj \ + r_acos.obj \ + r_asin.obj \ + r_atan.obj \ + r_atn2.obj \ + r_cnjg.obj \ + r_cos.obj \ + r_cosh.obj \ + r_dim.obj \ + r_exp.obj \ + r_imag.obj \ + r_int.obj \ + r_lg10.obj \ + r_log.obj \ + r_mod.obj \ + r_nint.obj \ + r_sign.obj \ + r_sin.obj \ + r_sinh.obj \ + r_sqrt.obj \ + r_tan.obj \ + r_tanh.obj \ + rdfmt.obj \ + rewind.obj \ + rsfe.obj \ + rsli.obj \ + rsne.obj \ + s_cat.obj \ + s_cmp.obj \ + s_copy.obj \ + s_paus.obj \ + s_rnge.obj \ + s_stop.obj \ + sfe.obj \ + sig_die.obj \ + signal_.obj \ + sue.obj \ + system_.obj \ + typesize.obj \ + uio.obj \ + uninit.obj \ + util.obj \ + wref.obj \ + wrtfmt.obj \ + wsfe.obj \ + wsle.obj \ + wsne.obj \ + xwsne.obj \ + z_abs.obj \ + z_cos.obj \ + z_div.obj \ + z_exp.obj \ + z_log.obj \ + z_sin.obj \ + z_sqrt.obj + +all: f2c.h math.h signal1.h sysdep1.h vcf2c.lib + +f2c.h: f2c.h0 + copy f2c.h0 f2c.h + +math.h: math.hvc + copy math.hvc math.h + +signal1.h: signal1.h0 + copy signal1.h0 signal1.h + +sysdep1.h: sysdep1.h0 + copy sysdep1.h0 sysdep1.h + +vcf2c.lib: $w + lib -out:vcf2c.lib @libf2c.lbc + +open.obj: open.c + $(CC) -c $(CFLAGS) -DMSDOS open.c + +signbit.obj uninit.obj: arith.h + +arith.h: arithchk.c + comptry.bat $(CC) $(CFLAGS) -DNO_FPINIT arithchk.c + arithchk >arith.h + del arithchk.exe + del arithchk.obj diff --git a/tools/connec/libf2c/makefile.wat b/tools/connec/libf2c/makefile.wat new file mode 100644 index 0000000..a81c06d --- /dev/null +++ b/tools/connec/libf2c/makefile.wat @@ -0,0 +1,189 @@ +# For making f2c.lib (here called watf2c.lib) with WATCOM C/C++ . +# Invoke with "wmake -u -f makefile.wat" . +# In the CFLAGS line below, "-bt=nt" is for NT and W9x. +# With WATCOM, it is necessary to explicitly load main.obj . + +# To get signed zeros in write statements on IEEE-arithmetic systems, +# add -DSIGNED_ZEROS to the CFLAGS assignment below and add signbit.obj +# to the objects in the "w =" list below. + +CC = wcc386 +CFLAGS = -fpd -DMSDOS -DUSE_CLOCK -DNO_ONEXIT -bt=nt -DNO_My_ctype + +.c.obj: + $(CC) $(CFLAGS) $*.c + +w = \ + abort_.obj \ + backspac.obj \ + c_abs.obj \ + c_cos.obj \ + c_div.obj \ + c_exp.obj \ + c_log.obj \ + c_sin.obj \ + c_sqrt.obj \ + cabs.obj \ + close.obj \ + d_abs.obj \ + d_acos.obj \ + d_asin.obj \ + d_atan.obj \ + d_atn2.obj \ + d_cnjg.obj \ + d_cos.obj \ + d_cosh.obj \ + d_dim.obj \ + d_exp.obj \ + d_imag.obj \ + d_int.obj \ + d_lg10.obj \ + d_log.obj \ + d_mod.obj \ + d_nint.obj \ + d_prod.obj \ + d_sign.obj \ + d_sin.obj \ + d_sinh.obj \ + d_sqrt.obj \ + d_tan.obj \ + d_tanh.obj \ + derf_.obj \ + derfc_.obj \ + dfe.obj \ + dolio.obj \ + dtime_.obj \ + due.obj \ + ef1asc_.obj \ + ef1cmc_.obj \ + endfile.obj \ + erf_.obj \ + erfc_.obj \ + err.obj \ + etime_.obj \ + exit_.obj \ + f77_aloc.obj \ + f77vers.obj \ + fmt.obj \ + fmtlib.obj \ + ftell_.obj \ + getarg_.obj \ + getenv_.obj \ + h_abs.obj \ + h_dim.obj \ + h_dnnt.obj \ + h_indx.obj \ + h_len.obj \ + h_mod.obj \ + h_nint.obj \ + h_sign.obj \ + hl_ge.obj \ + hl_gt.obj \ + hl_le.obj \ + hl_lt.obj \ + i77vers.obj \ + i_abs.obj \ + i_dim.obj \ + i_dnnt.obj \ + i_indx.obj \ + i_len.obj \ + i_mod.obj \ + i_nint.obj \ + i_sign.obj \ + iargc_.obj \ + iio.obj \ + ilnw.obj \ + inquire.obj \ + l_ge.obj \ + l_gt.obj \ + l_le.obj \ + l_lt.obj \ + lbitbits.obj \ + lbitshft.obj \ + lread.obj \ + lwrite.obj \ + main.obj \ + open.obj \ + pow_ci.obj \ + pow_dd.obj \ + pow_di.obj \ + pow_hh.obj \ + pow_ii.obj \ + pow_ri.obj \ + pow_zi.obj \ + pow_zz.obj \ + r_abs.obj \ + r_acos.obj \ + r_asin.obj \ + r_atan.obj \ + r_atn2.obj \ + r_cnjg.obj \ + r_cos.obj \ + r_cosh.obj \ + r_dim.obj \ + r_exp.obj \ + r_imag.obj \ + r_int.obj \ + r_lg10.obj \ + r_log.obj \ + r_mod.obj \ + r_nint.obj \ + r_sign.obj \ + r_sin.obj \ + r_sinh.obj \ + r_sqrt.obj \ + r_tan.obj \ + r_tanh.obj \ + rdfmt.obj \ + rewind.obj \ + rsfe.obj \ + rsli.obj \ + rsne.obj \ + s_cat.obj \ + s_cmp.obj \ + s_copy.obj \ + s_paus.obj \ + s_rnge.obj \ + s_stop.obj \ + sfe.obj \ + sig_die.obj \ + signal_.obj \ + sue.obj \ + system_.obj \ + typesize.obj \ + uio.obj \ + uninit.obj \ + util.obj \ + wref.obj \ + wrtfmt.obj \ + wsfe.obj \ + wsle.obj \ + wsne.obj \ + xwsne.obj \ + z_abs.obj \ + z_cos.obj \ + z_div.obj \ + z_exp.obj \ + z_log.obj \ + z_sin.obj \ + z_sqrt.obj + +watf2c.lib: f2c.h signal1.h sysdep1.h $w + wlib -c watf2c.lib @libf2c + +f2c.h: f2c.h0 + copy f2c.h0 f2c.h + +signal1.h: signal1.h0 + copy signal1.h0 signal1.h + +sysdep1.h: sysdep1.h0 + copy sysdep1.h0 sysdep1.h + +signbit.obj uninit.obj: arith.h + +arith.h: arithchk.c + comptry.bat wcl386 -DNO_FPINIT arithchk.c + arithchk >arith.h + del arithchk.exe + del arithchk.obj diff --git a/tools/connec/libf2c/math.hvc b/tools/connec/libf2c/math.hvc new file mode 100644 index 0000000..52cfcee --- /dev/null +++ b/tools/connec/libf2c/math.hvc @@ -0,0 +1,3 @@ +/* for VC 4.2 */ +#include +#undef complex diff --git a/tools/connec/libf2c/mkfile.plan9 b/tools/connec/libf2c/mkfile.plan9 new file mode 100644 index 0000000..645e33d --- /dev/null +++ b/tools/connec/libf2c/mkfile.plan9 @@ -0,0 +1,162 @@ +# Plan 9 mkfile for libf2c.a$O + +f2c.h + +# For use with "f2c" and "f2c -A": +f2c.h: f2c.h0 + cp f2c.h0 f2c.h + +# You may need to adjust signal1.h suitably for your system... +signal1.h: signal1.h0 + cp signal1.h0 signal1.h + +clean: + rm -f libf2c.a$O *.$O arith.h + +backspac.$O: fio.h +close.$O: fio.h +dfe.$O: fio.h +dfe.$O: fmt.h +due.$O: fio.h +endfile.$O: fio.h rawio.h +err.$O: fio.h rawio.h +fmt.$O: fio.h +fmt.$O: fmt.h +iio.$O: fio.h +iio.$O: fmt.h +ilnw.$O: fio.h +ilnw.$O: lio.h +inquire.$O: fio.h +lread.$O: fio.h +lread.$O: fmt.h +lread.$O: lio.h +lread.$O: fp.h +lwrite.$O: fio.h +lwrite.$O: fmt.h +lwrite.$O: lio.h +open.$O: fio.h rawio.h +rdfmt.$O: fio.h +rdfmt.$O: fmt.h +rdfmt.$O: fp.h +rewind.$O: fio.h +rsfe.$O: fio.h +rsfe.$O: fmt.h +rsli.$O: fio.h +rsli.$O: lio.h +rsne.$O: fio.h +rsne.$O: lio.h +sfe.$O: fio.h +sue.$O: fio.h +uio.$O: fio.h +uninit.$O: arith.h +util.$O: fio.h +wref.$O: fio.h +wref.$O: fmt.h +wref.$O: fp.h +wrtfmt.$O: fio.h +wrtfmt.$O: fmt.h +wsfe.$O: fio.h +wsfe.$O: fmt.h +wsle.$O: fio.h +wsle.$O: fmt.h +wsle.$O: lio.h +wsne.$O: fio.h +wsne.$O: lio.h +xwsne.$O: fio.h +xwsne.$O: lio.h +xwsne.$O: fmt.h + +arith.h: arithchk.c + pcc -DNO_FPINIT -o arithchk arithchk.c + arithchk >$target + rm arithchk + +xsum.out:V: check + +check: + xsum Notice README abort_.c arithchk.c backspac.c c_abs.c c_cos.c \ + c_div.c c_exp.c c_log.c c_sin.c c_sqrt.c cabs.c close.c comptry.bat \ + d_abs.c d_acos.c d_asin.c d_atan.c d_atn2.c d_cnjg.c d_cos.c d_cosh.c \ + d_dim.c d_exp.c d_imag.c d_int.c d_lg10.c d_log.c d_mod.c \ + d_nint.c d_prod.c d_sign.c d_sin.c d_sinh.c d_sqrt.c d_tan.c \ + d_tanh.c derf_.c derfc_.c dfe.c dolio.c dtime_.c due.c ef1asc_.c \ + ef1cmc_.c endfile.c erf_.c erfc_.c err.c etime_.c exit_.c f2c.h0 \ + f2ch.add f77_aloc.c f77vers.c fio.h fmt.c fmt.h fmtlib.c \ + fp.h ftell_.c \ + getarg_.c getenv_.c h_abs.c h_dim.c h_dnnt.c h_indx.c h_len.c \ + h_mod.c h_nint.c h_sign.c hl_ge.c hl_gt.c hl_le.c hl_lt.c \ + i77vers.c i_abs.c i_dim.c i_dnnt.c i_indx.c i_len.c i_mod.c \ + i_nint.c i_sign.c iargc_.c iio.c ilnw.c inquire.c l_ge.c l_gt.c \ + l_le.c l_lt.c lbitbits.c lbitshft.c libf2c.lbc libf2c.sy lio.h \ + lread.c lwrite.c main.c makefile.sy makefile.u makefile.vc \ + makefile.wat math.hvc mkfile.plan9 open.c pow_ci.c pow_dd.c \ + pow_di.c pow_hh.c pow_ii.c pow_qq.c pow_ri.c pow_zi.c pow_zz.c \ + qbitbits.c qbitshft.c r_abs.c r_acos.c r_asin.c r_atan.c r_atn2.c \ + r_cnjg.c r_cos.c r_cosh.c r_dim.c r_exp.c r_imag.c r_int.c r_lg10.c \ + r_log.c r_mod.c r_nint.c r_sign.c r_sin.c r_sinh.c r_sqrt.c \ + r_tan.c r_tanh.c rawio.h rdfmt.c rewind.c rsfe.c rsli.c rsne.c \ + s_cat.c s_cmp.c s_copy.c s_paus.c s_rnge.c s_stop.c sfe.c \ + sig_die.c signal1.h0 signal_.c sue.c system_.c typesize.c uio.c \ + uninit.c util.c wref.c wrtfmt.c wsfe.c wsle.c wsne.c xwsne.c \ + z_abs.c z_cos.c z_div.c z_exp.c z_log.c z_sin.c z_sqrt.c >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out || diff xsum[01].out diff --git a/tools/connec/libf2c/open.c b/tools/connec/libf2c/open.c new file mode 100644 index 0000000..a06428d --- /dev/null +++ b/tools/connec/libf2c/open.c @@ -0,0 +1,301 @@ +#include "f2c.h" +#include "fio.h" +#include "string.h" +#ifndef NON_POSIX_STDIO +#ifdef MSDOS +#include "io.h" +#else +#include "unistd.h" /* for access */ +#endif +#endif + +#ifdef KR_headers +extern char *malloc(); +#ifdef NON_ANSI_STDIO +extern char *mktemp(); +#endif +extern integer f_clos(); +#define Const /*nothing*/ +#else +#define Const const +#undef abs +#undef min +#undef max +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +extern int f__canseek(FILE*); +extern integer f_clos(cllist*); +#endif + +#ifdef NON_ANSI_RW_MODES +Const char *f__r_mode[2] = {"r", "r"}; +Const char *f__w_mode[4] = {"w", "w", "r+w", "r+w"}; +#else +Const char *f__r_mode[2] = {"rb", "r"}; +Const char *f__w_mode[4] = {"wb", "w", "r+b", "r+"}; +#endif + + static char f__buf0[400], *f__buf = f__buf0; + int f__buflen = (int)sizeof(f__buf0); + + static void +#ifdef KR_headers +f__bufadj(n, c) int n, c; +#else +f__bufadj(int n, int c) +#endif +{ + unsigned int len; + char *nbuf, *s, *t, *te; + + if (f__buf == f__buf0) + f__buflen = 1024; + while(f__buflen <= n) + f__buflen <<= 1; + len = (unsigned int)f__buflen; + if (len != f__buflen || !(nbuf = (char*)malloc(len))) + f__fatal(113, "malloc failure"); + s = nbuf; + t = f__buf; + te = t + c; + while(t < te) + *s++ = *t++; + if (f__buf != f__buf0) + free(f__buf); + f__buf = nbuf; + } + + int +#ifdef KR_headers +f__putbuf(c) int c; +#else +f__putbuf(int c) +#endif +{ + char *s, *se; + int n; + + if (f__hiwater > f__recpos) + f__recpos = f__hiwater; + n = f__recpos + 1; + if (n >= f__buflen) + f__bufadj(n, f__recpos); + s = f__buf; + se = s + f__recpos; + if (c) + *se++ = c; + *se = 0; + for(;;) { + fputs(s, f__cf); + s += strlen(s); + if (s >= se) + break; /* normally happens the first time */ + putc(*s++, f__cf); + } + return 0; + } + + void +#ifdef KR_headers +x_putc(c) +#else +x_putc(int c) +#endif +{ + if (f__recpos >= f__buflen) + f__bufadj(f__recpos, f__buflen); + f__buf[f__recpos++] = c; + } + +#define opnerr(f,m,s) {if(f) errno= m; else opn_err(m,s,a); return(m);} + + static void +#ifdef KR_headers +opn_err(m, s, a) int m; char *s; olist *a; +#else +opn_err(int m, const char *s, olist *a) +#endif +{ + if (a->ofnm) { + /* supply file name to error message */ + if (a->ofnmlen >= f__buflen) + f__bufadj((int)a->ofnmlen, 0); + g_char(a->ofnm, a->ofnmlen, f__curunit->ufnm = f__buf); + } + f__fatal(m, s); + } + +#ifdef KR_headers +integer f_open(a) olist *a; +#else +integer f_open(olist *a) +#endif +{ unit *b; + integer rv; + char buf[256], *s; + cllist x; + int ufmt; + FILE *tf; +#ifndef NON_UNIX_STDIO + int n; +#endif + f__external = 1; + if(a->ounit>=MXUNIT || a->ounit<0) + err(a->oerr,101,"open") + if (!f__init) + f_init(); + f__curunit = b = &f__units[a->ounit]; + if(b->ufd) { + if(a->ofnm==0) + { + same: if (a->oblnk) + b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z'; + return(0); + } +#ifdef NON_UNIX_STDIO + if (b->ufnm + && strlen(b->ufnm) == a->ofnmlen + && !strncmp(b->ufnm, a->ofnm, (unsigned)a->ofnmlen)) + goto same; +#else + g_char(a->ofnm,a->ofnmlen,buf); + if (f__inode(buf,&n) == b->uinode && n == b->udev) + goto same; +#endif + x.cunit=a->ounit; + x.csta=0; + x.cerr=a->oerr; + if ((rv = f_clos(&x)) != 0) + return rv; + } + b->url = (int)a->orl; + b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z'); + if(a->ofm==0) + { if(b->url>0) b->ufmt=0; + else b->ufmt=1; + } + else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1; + else b->ufmt=0; + ufmt = b->ufmt; +#ifdef url_Adjust + if (b->url && !ufmt) + url_Adjust(b->url); +#endif + if (a->ofnm) { + g_char(a->ofnm,a->ofnmlen,buf); + if (!buf[0]) + opnerr(a->oerr,107,"open") + } + else + sprintf(buf, "fort.%ld", (long)a->ounit); + b->uscrtch = 0; + b->uend=0; + b->uwrt = 0; + b->ufd = 0; + b->urw = 3; + switch(a->osta ? *a->osta : 'u') + { + case 'o': + case 'O': +#ifdef NON_POSIX_STDIO + if (!(tf = FOPEN(buf,"r"))) + opnerr(a->oerr,errno,"open") + fclose(tf); +#else + if (access(buf,0)) + opnerr(a->oerr,errno,"open") +#endif + break; + case 's': + case 'S': + b->uscrtch=1; +#ifdef NON_ANSI_STDIO + (void) strcpy(buf,"tmp.FXXXXXX"); + (void) mktemp(buf); + goto replace; +#else + if (!(b->ufd = tmpfile())) + opnerr(a->oerr,errno,"open") + b->ufnm = 0; +#ifndef NON_UNIX_STDIO + b->uinode = b->udev = -1; +#endif + b->useek = 1; + return 0; +#endif + + case 'n': + case 'N': +#ifdef NON_POSIX_STDIO + if ((tf = FOPEN(buf,"r")) || (tf = FOPEN(buf,"a"))) { + fclose(tf); + opnerr(a->oerr,128,"open") + } +#else + if (!access(buf,0)) + opnerr(a->oerr,128,"open") +#endif + /* no break */ + case 'r': /* Fortran 90 replace option */ + case 'R': +#ifdef NON_ANSI_STDIO + replace: +#endif + if (tf = FOPEN(buf,f__w_mode[0])) + fclose(tf); + } + + b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1)); + if(b->ufnm==NULL) opnerr(a->oerr,113,"no space"); + (void) strcpy(b->ufnm,buf); + if ((s = a->oacc) && b->url) + ufmt = 0; + if(!(tf = FOPEN(buf, f__w_mode[ufmt|2]))) { + if (tf = FOPEN(buf, f__r_mode[ufmt])) + b->urw = 1; + else if (tf = FOPEN(buf, f__w_mode[ufmt])) { + b->uwrt = 1; + b->urw = 2; + } + else + err(a->oerr, errno, "open"); + } + b->useek = f__canseek(b->ufd = tf); +#ifndef NON_UNIX_STDIO + if((b->uinode = f__inode(buf,&b->udev)) == -1) + opnerr(a->oerr,108,"open") +#endif + if(b->useek) + if (a->orl) + rewind(b->ufd); + else if ((s = a->oacc) && (*s == 'a' || *s == 'A') + && FSEEK(b->ufd, 0L, SEEK_END)) + opnerr(a->oerr,129,"open"); + return(0); +} + + int +#ifdef KR_headers +fk_open(seq,fmt,n) ftnint n; +#else +fk_open(int seq, int fmt, ftnint n) +#endif +{ char nbuf[10]; + olist a; + (void) sprintf(nbuf,"fort.%ld",(long)n); + a.oerr=1; + a.ounit=n; + a.ofnm=nbuf; + a.ofnmlen=strlen(nbuf); + a.osta=NULL; + a.oacc= (char*)(seq==SEQ?"s":"d"); + a.ofm = (char*)(fmt==FMT?"f":"u"); + a.orl = seq==DIR?1:0; + a.oblnk=NULL; + return(f_open(&a)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/open.o b/tools/connec/libf2c/open.o new file mode 100644 index 0000000000000000000000000000000000000000..3c882bcef180464c5b608d12b2fb83427e458dda GIT binary patch literal 10296 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 Kb~18xmj5@IB#E>D literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/pow_ci.c b/tools/connec/libf2c/pow_ci.c new file mode 100644 index 0000000..574e0b1 --- /dev/null +++ b/tools/connec/libf2c/pow_ci.c @@ -0,0 +1,26 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +VOID pow_ci(p, a, b) /* p = a**b */ + complex *p, *a; integer *b; +#else +extern void pow_zi(doublecomplex*, doublecomplex*, integer*); +void pow_ci(complex *p, complex *a, integer *b) /* p = a**b */ +#endif +{ +doublecomplex p1, a1; + +a1.r = a->r; +a1.i = a->i; + +pow_zi(&p1, &a1, b); + +p->r = p1.r; +p->i = p1.i; +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_ci.o b/tools/connec/libf2c/pow_ci.o new file mode 100644 index 0000000000000000000000000000000000000000..afa8a030d72301d13016e956bfb315390f52f2ae GIT binary patch literal 1552 zcmb`GPiqrV5Wr`X*v2MgH{zjC4||9uDqS|zs;HDrn?EZA3no3-9+pkAA)!qo$p+gV z^pI01f=54wA0eO@uYL(V2ts?bpfhjZvzzVaB2Jmk%x`Dry*KaWZLv~{ND>H?KLrEf6TfFvZKYL0*C=Hyq?JdNGX;s~By;ZZ5Z!e#TF zn^DZkx9`*lzkNBA_mY`&Ii0}ZD+aYp9HVN?JjG^BbKPq_S}@0-_5Dw*jO_v7Cb!bb z3y_W!X(hQBe~$-Hk>BFqj>+az$~aO;8IkT%O3A0<`2;|Dd;77P-K~#$?nr&8ZD{)1 z`iMojH@Qcee*ca~d7pVE8agq6DE@^>6t0C~%wCwo7w7Q!6;5}jT%iDzdBe9)HWOs> zoP2c-hgbdA)=7t%Mh7fw=-Q0~tI%D_^m8N~LPCX4Udrm7;~cHc?4p zsC1f(-=2&Jq7c81D!7V1Nd$G~J!-?_u4~sp8@dC}wuLuv4sFeKj$F`~>$I)b!0tMr zHEq`htv(!r*64S;P7hOheb>>-&v)0@3D{!);h)O)8@x$__ZD;K;q2KEuAtH^3{=0g zX%Hy7XV|Q0F5(3&bAAskah}d8z?6GW{}Rs;^#ZS=6Sn>b-cYPVcSWyT)C<0WjMfjn z{0n4ZGIO_>@C225{%gH~wbWD030)>){ksBiE7lkG8FJzKQ&+=aNG_!XXHR{yygttD n5;FQ71m`E_N;Q7bdD91eh<qKf~F{ zoj<^z;ou<765iX+Feb}^x0(ID_nY^dH}hsL(z#57rhzaG=HM$5EWl2~mv08H32|tH z<;&;TYloh|5q%}G#BiPE+TS1&dIEq5eqk1YrZ5__n}6V=Kk#@C#i*CM z!cj;SyQF;vy+AIGBP<_|D#tXeQVFbVZf#*cXRT#2o9VojpI^wOE!2^<*8v(4X_s&B zbu&0m*ZA#znRn{?b`hB8SL?VhysC3(Gv7J!fd#I!Z|zlW*8x_teH&QO^MLJET-PaM zO1a`YEW27rdcM7Tz{~v`48C9WCQQDv=o=5epAE@A9MlUFhis3$3B8>= 1) + x *= x; + else + break; + } + } +return(pow); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_di.o b/tools/connec/libf2c/pow_di.o new file mode 100644 index 0000000000000000000000000000000000000000..08ba74e105a281dcba4b37fc75cc1c865f180d24 GIT binary patch literal 1496 zcmbu8K~ED=5XWb!0wTDzF@^+9dNOF_xug;r58BuOdjJn4n0S$F%Qg^gYr3zYc+isx z2^Wrj1V4lai5ES3;}ejY#)OoE7ZRD-ohi>{_oA=K{%3w~=FN28?)!!1#UaZASr$Bo zb5AJ1$Dwn(6q+TNfN|*CS=-$kM!8JX{qRLUz(;3HNbjcm`>=1nJgC{z-+DjYA68d$U&Hh0as1>4+t%AvusT_5YJ6mL9~;Udzr}kCtguurKgv(9RoV^R z&d;kk<;)b?p*Q<(wy2zkcOxqCDVj;m)bd6N?^iQ;Ir|`VN|9T%(uv6Dw1yrD0k#36B@?U#O z`yCCc)!gv3r>cQ2qC?!@T(7mfx(|wWKvjYORJB>J`wfh5G_|jmo~_LU+N-|e+W#Ze zKlL5IkrFamgE>X6F~JB-q0lXtB6slY@-Q4GW2l7WCMTKSVV+}OWS0$z7cRbN5jW^u z>= 1) + x *= x; + else + break; + } + return(pow); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_hh.o b/tools/connec/libf2c/pow_hh.o new file mode 100644 index 0000000000000000000000000000000000000000..347db45dd95b91bc0f32b6786c3ff7d0cbbfc18f GIT binary patch literal 1264 zcmbtTJ4*vW5T5gVM&VRM1TA7CD!L^2R*-li)L{0z@i&9CKg{ z>LCP1-Z1j5iKEhf$hasK$XXsm%EuCi9~vLP^^><1$dNcI=DMAVbD}42A2)9g<>K8V zZ#K?~uh$xXG0v{aPfp464b=d&xCykqMbLH{wf2UZ+GFg}hX)-Ihn#h_d3)s5J zO<-}`2DX+-rK~iTq%+)Na|_G;HaFKcysiHO+R;qs3{D^>Hudf&__sTu)`bsg!7p)& z8bzO*ytURtF6hKWUn}NPZ@mLLA7kDx}SIzDRLszkwJTTdBAM0@_#KY?D_ zlg^=r?BA=3h-H77rxi^teN~BqrB6!4gR`f1@1o#R>= 1) + x *= x; + else + break; + } + return(pow); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_ii.o b/tools/connec/libf2c/pow_ii.o new file mode 100644 index 0000000000000000000000000000000000000000..9237c239c546fac7f01dfbf3c79a2cc32c5d39b5 GIT binary patch literal 1256 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 TGuMy)yy29) literal 0 HcmV?d00001 diff --git a/tools/connec/src/f2c.1 b/tools/connec/src/f2c.1 new file mode 100644 index 0000000..3bdbc8b --- /dev/null +++ b/tools/connec/src/f2c.1 @@ -0,0 +1,222 @@ + + F2C(1) UNIX System V F2C(1) + + NAME + f2c - Convert Fortran 77 to C or C++ + + SYNOPSIS + f2c [ option ... ] file ... + + DESCRIPTION + F2c converts Fortran 77 source code in files with names end- + ing in `.f' or `.F' to C (or C++) source files in the cur- + rent directory, with `.c' substituted for the final `.f' or + `.F'. If no Fortran files are named, f2c reads Fortran from + standard input and writes C on standard output. File names + that end with `.p' or `.P' are taken to be prototype files, + as produced by option `-P', and are read first. + + The following options have the same meaning as in f77(1). + + -C Compile code to check that subscripts are within + declared array bounds. + + -I2 Render INTEGER and LOGICAL as short, INTEGER*4 as long + int. Assume the default libF77 and libI77: allow only + INTEGER*4 (and no LOGICAL) variables in INQUIREs. + Option `-I4' confirms the default rendering of INTEGER + as long int. + + -Idir + Look for a non-absolute include file first in the + directory of the current input file, then in directo- + ries specified by -I options (one directory per + option). Options -I2 and -I4 have precedence, so, + e.g., a directory named 2 should be specified by -I./2 + . + + -onetrip + Compile DO loops that are performed at least once if + reached. (Fortran 77 DO loops are not performed at all + if the upper limit is smaller than the lower limit.) + + -U Honor the case of variable and external names. Fortran + keywords must be in lower case. + + -u Make the default type of a variable `undefined' rather + than using the default Fortran rules. + + -w Suppress all warning messages, or, if the option is + `-w66', just Fortran 66 compatibility warnings. + + The following options are peculiar to f2c. + + -A Produce ANSI C (default, starting 20020621). For old- + style C, use option -K. + + Page 1 (printed 6/21/02) + + F2C(1) UNIX System V F2C(1) + + -a Make local variables automatic rather than static + unless they appear in a DATA, EQUIVALENCE, NAMELIST, or + SAVE statement. + + -C++ Output C++ code. + + -c Include original Fortran source as comments. + + -cd Do not recognize cdabs, cdcos, cdexp, cdlog, cdsin, and + cdsqrt as synonyms for the double complex intrinsics + zabs, zcos, zexp, zlog, zsin, and zsqrt, respectively, + nor dreal as a synonym for dble. + + -ddir + Write `.c' files in directory dir instead of the cur- + rent directory. + + -E Declare uninitialized COMMON to be Extern (overridably + defined in f2c.h as extern). + + -ec Place uninitialized COMMON blocks in separate files: + COMMON /ABC/ appears in file abc_com.c. Option `-e1c' + bundles the separate files into the output file, with + comments that give an unbundling sed(1) script. + + -ext Complain about f77(1) extensions. + + -f Assume free-format input: accept text after column 72 + and do not pad fixed-format lines shorter than 72 char- + acters with blanks. + + -72 Treat text appearing after column 72 as an error. + + -g Include original Fortran line numbers in #line lines. + + -h Emulate Fortran 66's treatment of Hollerith: try to + align character strings on word (or, if the option is + `-hd', on double-word) boundaries. + + -i2 Similar to -I2, but assume a modified libF77 and libI77 + (compiled with -Df2c_i2), so INTEGER and LOGICAL vari- + ables may be assigned by INQUIRE and array lengths are + stored in short ints. + + -i90 Do not recognize the Fortran 90 bit-manipulation + intrinsics btest, iand, ibclr, ibits, ibset, ieor, ior, + ishft, and ishftc. + + -kr Use temporary values to enforce Fortran expression + evaluation where K&R (first edition) parenthesization + rules allow rearrangement. If the option is `-krd', + use double precision temporaries even for single- + + Page 2 (printed 6/21/02) + + F2C(1) UNIX System V F2C(1) + + precision operands. + + -P Write a file.P of ANSI (or C++) prototypes for defini- + tions in each input file.f or file.F. When reading + Fortran from standard input, write prototypes at the + beginning of standard output. Option -Ps implies -P + and gives exit status 4 if rerunning f2c may change + prototypes or declarations. + + -p Supply preprocessor definitions to make common-block + members look like local variables. + + -R Do not promote REAL functions and operations to DOUBLE + PRECISION. Option `-!R' confirms the default, which + imitates f77. + + -r Cast REAL arguments of intrinsic functions and values + of REAL functions (including intrinsics) to REAL. + + -r8 Promote REAL to DOUBLE PRECISION, COMPLEX to DOUBLE + COMPLEX. + + -s Preserve multidimensional subscripts. Suppressed by + option `-C' . + + -Tdir + Put temporary files in directory dir. + + -trapuv + Dynamically initialize local variables, except those + appearing in SAVE or DATA statements, with values that + may help find references to uninitialized variables. + For example, with IEEE arithmetic, initialize local + floating-point variables to signaling NaNs. + + -w8 Suppress warnings when COMMON or EQUIVALENCE forces + odd-word alignment of doubles. + + -Wn Assume n characters/word (default 4) when initializing + numeric variables with character data. + + -z Do not implicitly recognize DOUBLE COMPLEX. + + -!bs Do not recognize backslash escapes (\", \', \0, \\, \b, + \f, \n, \r, \t, \v) in character strings. + + -!c Inhibit C output, but produce -P output. + + -!I Reject include statements. + + -!i8 Disallow INTEGER*8 , or, if the option is `-!i8const', + permit INTEGER*8 but do not promote integer constants + + Page 3 (printed 6/21/02) + + F2C(1) UNIX System V F2C(1) + + to INTEGER*8 when they involve more than 32 bits. + + -!it Don't infer types of untyped EXTERNAL procedures from + use as parameters to previously defined or prototyped + procedures. + + -!P Do not attempt to infer ANSI or C++ prototypes from + usage. + + The resulting C invokes the support routines of f77; object + code should be loaded by f77 or with ld(1) or cc(1) options + -lF77 -lI77 -lm. Calling conventions are those of f77: see + the reference below. + + FILES + file.[fF] input file + + *.c output file + + /usr/include/f2c.h + header file + + /usr/lib/libF77.aintrinsic function library + + /usr/lib/libI77.aFortran I/O library + + /lib/libc.a C library, see section 3 + + SEE ALSO + S. I. Feldman and P. J. Weinberger, `A Portable Fortran 77 + Compiler', UNIX Time Sharing System Programmer's Manual, + Tenth Edition, Volume 2, AT&T Bell Laboratories, 1990. + + DIAGNOSTICS + The diagnostics produced by f2c are intended to be self- + explanatory. + + BUGS + Floating-point constant expressions are simplified in the + floating-point arithmetic of the machine running f2c, so + they are typically accurate to at most 16 or 17 decimal + places. + Untypable EXTERNAL functions are declared int. + There is no notation for INTEGER*8 constants. + Some intrinsic functions do not yet work with INTEGER*8 . + + Page 4 (printed 6/21/02) + diff --git a/tools/connec/src/f2c.1t b/tools/connec/src/f2c.1t new file mode 100644 index 0000000..d73d334 --- /dev/null +++ b/tools/connec/src/f2c.1t @@ -0,0 +1,391 @@ +. \" Definitions of F, L and LR for the benefit of systems +. \" whose -man lacks them... +.de F +.nh +.if n \%\&\\$1 +.if t \%\&\f(CW\\$1\fR +.hy 14 +.. +.de L +.nh +.if n \%`\\$1' +.if t \%\&\f(CW\\$1\fR +.hy 14 +.. +.de LR +.nh +.if n \%`\\$1'\\$2 +.if t \%\&\f(CW\\$1\fR\\$2 +.hy 14 +.. +.TH F2C 1 +.CT 1 prog_other +.SH NAME +f2c \- Convert Fortran 77 to C or C++ +. \" f\^2c changed to f2c in the previous line for the benefit of +. \" people on systems (e.g. Sun systems) whose makewhatis cannot +. \" cope with troff formatting commands. +.SH SYNOPSIS +.B f\^2c +[ +.I option ... +] +.I file ... +.SH DESCRIPTION +.I F2c +converts Fortran 77 source code in +.I files +with names ending in +.L .f +or +.L .F +to C (or C++) source files in the +current directory, with +.L .c +substituted +for the final +.L .f +or +.LR .F . +If no Fortran files are named, +.I f\^2c +reads Fortran from standard input and +writes C on standard output. +.I File +names that end with +.L .p +or +.L .P +are taken to be prototype +files, as produced by option +.LR -P , +and are read first. +.PP +The following options have the same meaning as in +.IR f\^77 (1). +.TP +.B -C +Compile code to check that subscripts are within declared array bounds. +.TP +.B -I2 +Render INTEGER and LOGICAL as short, +INTEGER\(**4 as long int. Assume the default \fIlibF77\fR +and \fIlibI77\fR: allow only INTEGER\(**4 (and no LOGICAL) +variables in INQUIREs. Option +.L -I4 +confirms the default rendering of INTEGER as long int. +.TP +.BI -I dir +Look for a non-absolute include file first in the directory of the +current input file, then in directories specified by \f(CW-I\fP +options (one directory per option). Options +\f(CW-I2\fP and \f(CW-I4\fP +have precedence, so, e.g., a directory named \f(CW2\fP +should be specified by \f(CW-I./2\fP . +.TP +.B -onetrip +Compile DO loops that are performed at least once if reached. +(Fortran 77 DO loops are not performed at all if the upper limit is smaller than the lower limit.) +.TP +.B -U +Honor the case of variable and external names. Fortran keywords must be in +.I +lower +case. +.TP +.B -u +Make the default type of a variable `undefined' rather than using the default Fortran rules. +.TP +.B -w +Suppress all warning messages, or, if the option is +.LR -w66 , +just Fortran 66 compatibility warnings. +.PP +The following options are peculiar to +.IR f\^2c . +.TP +.B -A +Produce +.SM ANSI +C (default, starting 20020621). +For old-style C, use option \f(CW-K\fP. +.TP +.B -a +Make local variables automatic rather than static +unless they appear in a +.SM "DATA, EQUIVALENCE, NAMELIST," +or +.SM SAVE +statement. +.TP +.B -C++ +Output C++ code. +.TP +.B -c +Include original Fortran source as comments. +.TP +.B -cd +Do not recognize cdabs, cdcos, cdexp, cdlog, cdsin, and cdsqrt +as synonyms for the double complex intrinsics +zabs, zcos, zexp, zlog, zsin, and zsqrt, respectively, +nor dreal as a synonym for dble. +.TP +.BI -d dir +Write +.L .c +files in directory +.I dir +instead of the current directory. +.TP +.B -E +Declare uninitialized +.SM COMMON +to be +.B Extern +(overridably defined in +.F f2c.h +as +.B extern). +.TP +.B -ec +Place uninitialized +.SM COMMON +blocks in separate files: +.B COMMON /ABC/ +appears in file +.BR abc_com.c . +Option +.LR -e1c +bundles the separate files +into the output file, with comments that give an unbundling +.IR sed (1) +script. +.TP +.B -ext +Complain about +.IR f\^77 (1) +extensions. +.TP +.B -f +Assume free-format input: accept text after column 72 and do not +pad fixed-format lines shorter than 72 characters with blanks. +.TP +.B -72 +Treat text appearing after column 72 as an error. +.TP +.B -g +Include original Fortran line numbers in \f(CW#line\fR lines. +.TP +.B -h +Emulate Fortran 66's treatment of Hollerith: try to align character strings on +word (or, if the option is +.LR -hd , +on double-word) boundaries. +.TP +.B -i2 +Similar to +.BR -I2 , +but assume a modified +.I libF77 +and +.I libI77 +(compiled with +.BR -Df\^2c_i2 ), +so +.SM INTEGER +and +.SM LOGICAL +variables may be assigned by +.SM INQUIRE +and array lengths are stored in short ints. +.TP +.B -i90 +Do not recognize the Fortran 90 bit-manipulation intrinsics +btest, iand, ibclr, ibits, ibset, ieor, ior, ishft, and ishftc. +.TP +.B -kr +Use temporary values to enforce Fortran expression evaluation +where K&R (first edition) parenthesization rules allow rearrangement. +If the option is +.LR -krd , +use double precision temporaries even for single-precision operands. +.TP +.B -P +Write a +.IB file .P +of ANSI (or C++) prototypes +for definitions in each input +.IB file .f +or +.IB file .F . +When reading Fortran from standard input, write prototypes +at the beginning of standard output. Option +.B -Ps +implies +.B -P +and gives exit status 4 if rerunning +.I f\^2c +may change prototypes or declarations. +.TP +.B -p +Supply preprocessor definitions to make common-block members +look like local variables. +.TP +.B -R +Do not promote +.SM REAL +functions and operations to +.SM DOUBLE PRECISION. +Option +.L -!R +confirms the default, which imitates +.IR f\^77 . +.TP +.B -r +Cast REAL arguments of intrinsic functions and values of REAL +functions (including intrinsics) to REAL. +.TP +.B -r8 +Promote +.SM REAL +to +.SM DOUBLE PRECISION, COMPLEX +to +.SM DOUBLE COMPLEX. +.TP +.B -s +Preserve multidimensional subscripts. Suppressed by option +.L -C +\&. +.TP +.BI -T dir +Put temporary files in directory +.I dir. +.TP +.B -trapuv +Dynamically initialize local variables, except those appearing in +.SM SAVE +or +.SM DATA +statements, with values that may help find references to +uninitialized variables. For example, with IEEE arithmetic, +initialize local floating-point variables to signaling NaNs. +.TP +.B -w8 +Suppress warnings when +.SM COMMON +or +.SM EQUIVALENCE +forces odd-word alignment of doubles. +.TP +.BI -W n +Assume +.I n +characters/word (default 4) +when initializing numeric variables with character data. +.TP +.B -z +Do not implicitly recognize +.SM DOUBLE COMPLEX. +.TP +.B -!bs +Do not recognize \fIb\fRack\fIs\fRlash escapes +(\e", \e', \e0, \e\e, \eb, \ef, \en, \er, \et, \ev) in character strings. +.TP +.B -!c +Inhibit C output, but produce +.B -P +output. +.TP +.B -!I +Reject +.B include +statements. +.TP +.B -!i8 +Disallow +.SM INTEGER*8 , +or, if the option is +.LR -!i8const , +permit +.SM INTEGER*8 +but do not promote integer +constants to +.SM INTEGER*8 +when they involve more than 32 bits. +.TP +.B -!it +Don't infer types of untyped +.SM EXTERNAL +procedures from use as parameters to previously defined or prototyped +procedures. +.TP +.B -!P +Do not attempt to infer +.SM ANSI +or C++ +prototypes from usage. +.PP +The resulting C invokes the support routines of +.IR f\^77 ; +object code should be loaded by +.I f\^77 +or with +.IR ld (1) +or +.IR cc (1) +options +.BR "-lF77 -lI77 -lm" . +Calling conventions +are those of +.IR f\&77 : +see the reference below. +.br +.SH FILES +.TP +.nr )I 1.75i +.IB file .[fF] +input file +.TP +.B *.c +output file +.TP +.F /usr/include/f2c.h +header file +.TP +.F /usr/lib/libF77.a +intrinsic function library +.TP +.F /usr/lib/libI77.a +Fortran I/O library +.TP +.F /lib/libc.a +C library, see section 3 +.SH "SEE ALSO" +S. I. Feldman and +P. J. Weinberger, +`A Portable Fortran 77 Compiler', +\fIUNIX Time Sharing System Programmer's Manual\fR, +Tenth Edition, Volume 2, AT&T Bell Laboratories, 1990. +.SH DIAGNOSTICS +The diagnostics produced by +.I f\^2c +are intended to be +self-explanatory. +.SH BUGS +Floating-point constant expressions are simplified in +the floating-point arithmetic of the machine running +.IR f\^2c , +so they are typically accurate to at most 16 or 17 decimal places. +.br +Untypable +.SM EXTERNAL +functions are declared +.BR int . +.br +There is no notation for +.SM INTEGER*8 +constants. +.br +Some intrinsic functions do not yet work with +.SM INTEGER*8 . diff --git a/tools/connec/src/f2c.h b/tools/connec/src/f2c.h new file mode 100644 index 0000000..b94ee7c --- /dev/null +++ b/tools/connec/src/f2c.h @@ -0,0 +1,223 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef long int integer; +typedef unsigned long int uinteger; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; +#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ +typedef long long longint; /* system-dependent */ +typedef unsigned long long ulongint; /* system-dependent */ +#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) +#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) +#endif + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long int flag; +typedef long int ftnlen; +typedef long int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + integer1 g; + shortint h; + integer i; + /* longint j; */ + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/tools/connec/src/format.c b/tools/connec/src/format.c new file mode 100644 index 0000000..c954966 --- /dev/null +++ b/tools/connec/src/format.c @@ -0,0 +1,2626 @@ +/**************************************************************** +Copyright 1990-1996, 1999-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* Format.c -- this file takes an intermediate file (generated by pass 1 + of the translator) and some state information about the contents of that + file, and generates C program text. */ + +#include "defs.h" +#include "p1defs.h" +#include "format.h" +#include "output.h" +#include "names.h" +#include "iob.h" + +int c_output_line_length = DEF_C_LINE_LENGTH; + +int last_was_label; /* Boolean used to generate semicolons + when a label terminates a block */ +static char this_proc_name[52]; /* Name of the current procedure. This is + probably too simplistic to handle + multiple entry points */ + +static tagptr do_format Argdcl((FILEP, FILEP)); +static void do_p1_1while Argdcl((FILEP)); +static void do_p1_2while Argdcl((FILEP, FILEP)); +static tagptr do_p1_addr Argdcl((FILEP, FILEP)); +static void do_p1_asgoto Argdcl((FILEP, FILEP)); +static tagptr do_p1_charp Argdcl((FILEP)); +static void do_p1_comment Argdcl((FILEP, FILEP)); +static void do_p1_comp_goto Argdcl((FILEP, FILEP)); +static tagptr do_p1_const Argdcl((FILEP)); +static void do_p1_elif Argdcl((FILEP, FILEP)); +static void do_p1_else Argdcl((FILEP)); +static void do_p1_elseifstart Argdcl((FILEP)); +static void do_p1_end_for Argdcl((FILEP)); +static void do_p1_endelse Argdcl((FILEP)); +static void do_p1_endif Argdcl((FILEP)); +static tagptr do_p1_expr Argdcl((FILEP, FILEP)); +static tagptr do_p1_extern Argdcl((FILEP)); +static void do_p1_for Argdcl((FILEP, FILEP)); +static void do_p1_fortran Argdcl((FILEP, FILEP)); +static void do_p1_goto Argdcl((FILEP, FILEP)); +static tagptr do_p1_head Argdcl((FILEP, FILEP)); +static tagptr do_p1_ident Argdcl((FILEP)); +static void do_p1_if Argdcl((FILEP, FILEP)); +static void do_p1_label Argdcl((FILEP, FILEP)); +static tagptr do_p1_list Argdcl((FILEP, FILEP)); +static tagptr do_p1_literal Argdcl((FILEP)); +static tagptr do_p1_name_pointer Argdcl((FILEP)); +static void do_p1_set_line Argdcl((FILEP)); +static void do_p1_subr_ret Argdcl((FILEP, FILEP)); +static int get_p1_token Argdcl((FILEP)); +static int p1get_const Argdcl((FILEP, int, Constp*)); +static int p1geta Argdcl((FILEP, Addr*)); +static int p1getd Argdcl((FILEP, long int*)); +static int p1getf Argdcl((FILEP, char**)); +static int p1getn Argdcl((FILEP, int, char**)); +static int p1gets Argdcl((FILEP, char*, int)); +static void proto Argdcl((FILEP, Argtypes*, char*)); + +extern chainp assigned_fmts; +char filename[P1_FILENAME_MAX]; +extern int gflag, sharp_line, trapuv; +extern int typeconv[]; +int gflag1; +extern char *parens; + + void +start_formatting(Void) +{ + FILE *infile; + static int wrote_one = 0; + extern int usedefsforcommon; + extern char *p1_file, *p1_bakfile; + + this_proc_name[0] = '\0'; + last_was_label = 0; + ei_next = ei_first; + wh_next = wh_first; + + (void) fclose (pass1_file); + if ((infile = fopen (p1_file, binread)) == NULL) + Fatal("start_formatting: couldn't open the intermediate file\n"); + + if (wrote_one) + nice_printf (c_file, "\n"); + + while (!feof (infile)) { + expptr this_expr; + + this_expr = do_format (infile, c_file); + if (this_expr) { + out_and_free_statement (c_file, this_expr); + } /* if this_expr */ + } /* while !feof infile */ + + (void) fclose (infile); + + if (last_was_label) + nice_printf (c_file, ";\n"); + + prev_tab (c_file); + gflag1 = sharp_line = 0; + if (this_proc_name[0]) + nice_printf (c_file, "} /* %s */\n", this_proc_name); + + +/* Write the #undefs for common variable reference */ + + if (usedefsforcommon) { + Extsym *ext; + int did_one = 0; + + for (ext = extsymtab; ext < nextext; ext++) + if (ext -> extstg == STGCOMMON && ext -> used_here) { + ext -> used_here = 0; + if (!did_one) + nice_printf (c_file, "\n"); + wr_abbrevs(c_file, 0, ext->extp); + did_one = 1; + ext -> extp = CHNULL; + } /* if */ + + if (did_one) + nice_printf (c_file, "\n"); + } /* if usedefsforcommon */ + + other_undefs(c_file); + + wrote_one = 1; + +/* For debugging only */ + + if (debugflag && (pass1_file = fopen (p1_bakfile, binwrite))) + if (infile = fopen (p1_file, binread)) { + ffilecopy (infile, pass1_file); + fclose (infile); + fclose (pass1_file); + } /* if infile */ + +/* End of "debugging only" */ + + scrub(p1_file); /* optionally unlink */ + + if ((pass1_file = fopen (p1_file, binwrite)) == NULL) + err ("start_formatting: couldn't reopen the pass1 file"); + +} /* start_formatting */ + + + static void +#ifdef KR_headers +put_semi(outfile) + FILE *outfile; +#else +put_semi(FILE *outfile) +#endif +{ + nice_printf (outfile, ";\n"); + last_was_label = 0; + } + +#define SEM_CHECK(x) if (last_was_label) put_semi(x) + +/* do_format -- takes an input stream (a file in pass1 format) and writes + the appropriate C code to outfile when possible. When reading an + expression, the expression tree is returned instead. */ + + static expptr +#ifdef KR_headers +do_format(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_format(FILE *infile, FILE *outfile) +#endif +{ + int token_type, was_c_token; + expptr retval = ENULL; + + token_type = get_p1_token (infile); + was_c_token = 1; + switch (token_type) { + case P1_COMMENT: + do_p1_comment (infile, outfile); + was_c_token = 0; + break; + case P1_SET_LINE: + do_p1_set_line (infile); + was_c_token = 0; + break; + case P1_FILENAME: + p1gets(infile, filename, P1_FILENAME_MAX); + was_c_token = 0; + break; + case P1_NAME_POINTER: + retval = do_p1_name_pointer (infile); + break; + case P1_CONST: + retval = do_p1_const (infile); + break; + case P1_EXPR: + retval = do_p1_expr (infile, outfile); + break; + case P1_IDENT: + retval = do_p1_ident(infile); + break; + case P1_CHARP: + retval = do_p1_charp(infile); + break; + case P1_EXTERN: + retval = do_p1_extern (infile); + break; + case P1_HEAD: + gflag1 = sharp_line = 0; + retval = do_p1_head (infile, outfile); + gflag1 = sharp_line = gflag; + break; + case P1_LIST: + retval = do_p1_list (infile, outfile); + break; + case P1_LITERAL: + retval = do_p1_literal (infile); + break; + case P1_LABEL: + do_p1_label (infile, outfile); + /* last_was_label = 1; -- now set in do_p1_label */ + was_c_token = 0; + break; + case P1_ASGOTO: + do_p1_asgoto (infile, outfile); + break; + case P1_GOTO: + do_p1_goto (infile, outfile); + break; + case P1_IF: + do_p1_if (infile, outfile); + break; + case P1_ELSE: + SEM_CHECK(outfile); + do_p1_else (outfile); + break; + case P1_ELIF: + SEM_CHECK(outfile); + do_p1_elif (infile, outfile); + break; + case P1_ENDIF: + SEM_CHECK(outfile); + do_p1_endif (outfile); + break; + case P1_ENDELSE: + SEM_CHECK(outfile); + do_p1_endelse (outfile); + break; + case P1_ADDR: + retval = do_p1_addr (infile, outfile); + break; + case P1_SUBR_RET: + do_p1_subr_ret (infile, outfile); + break; + case P1_COMP_GOTO: + do_p1_comp_goto (infile, outfile); + break; + case P1_FOR: + do_p1_for (infile, outfile); + break; + case P1_ENDFOR: + SEM_CHECK(outfile); + do_p1_end_for (outfile); + break; + case P1_WHILE1START: + do_p1_1while(outfile); + break; + case P1_WHILE2START: + do_p1_2while(infile, outfile); + break; + case P1_PROCODE: + procode(outfile); + break; + case P1_ELSEIFSTART: + SEM_CHECK(outfile); + do_p1_elseifstart(outfile); + break; + case P1_FORTRAN: + do_p1_fortran(infile, outfile); + /* no break; */ + case P1_EOF: + was_c_token = 0; + break; + case P1_UNKNOWN: + Fatal("do_format: Unknown token type in intermediate file"); + break; + default: + Fatal("do_format: Bad token type in intermediate file"); + break; + } /* switch */ + + if (was_c_token) + last_was_label = 0; + return retval; +} /* do_format */ + + + static void +#ifdef KR_headers +do_p1_comment(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_comment(FILE *infile, FILE *outfile) +#endif +{ + extern int in_comment; + + char storage[COMMENT_BUFFER_SIZE + 1]; + int length; + + if (!p1gets(infile, storage, COMMENT_BUFFER_SIZE + 1)) + return; + + length = strlen (storage); + + gflag1 = sharp_line = 0; + in_comment = 1; + margin_printf(outfile, length ? "/* %s */\n" : "\n", storage); + in_comment = 0; + gflag1 = sharp_line = gflag; +} /* do_p1_comment */ + + static void +#ifdef KR_headers +do_p1_set_line(infile) + FILE *infile; +#else +do_p1_set_line(FILE *infile) +#endif +{ + int status; + long new_line_number = -1; + + status = p1getd (infile, &new_line_number); + + if (status == EOF) + err ("do_p1_set_line: Missing line number at end of file\n"); + else if (status == 0 || new_line_number == -1) + errl("do_p1_set_line: Illegal line number in intermediate file: %ld\n", + new_line_number); + else { + lineno = new_line_number; + } +} /* do_p1_set_line */ + + + static expptr +#ifdef KR_headers +do_p1_name_pointer(infile) + FILE *infile; +#else +do_p1_name_pointer(FILE *infile) +#endif +{ + Namep namep = (Namep) NULL; + int status; + + status = p1geta (infile, (Addr *) &namep); + + if (status == EOF) + err ("do_p1_name_pointer: Missing pointer at end of file\n"); + else if (status == 0 || namep == (Namep) NULL) + erri ("do_p1_name_pointer: Illegal name pointer in p1 file: '#" Addrfmt "'\n", + (Addr) namep); + + return (expptr) namep; +} /* do_p1_name_pointer */ + + + + static expptr +#ifdef KR_headers +do_p1_const(infile) + FILE *infile; +#else +do_p1_const(FILE *infile) +#endif +{ + struct Constblock *c = (struct Constblock *) NULL; + long type = -1; + int status; + + status = p1getd (infile, &type); + + if (status == EOF) + err ("do_p1_const: Missing constant type at end of file\n"); + else if (status == 0) + errl("do_p1_const: Illegal constant type in p1 file: %ld\n", type); + else { + status = p1get_const (infile, (int)type, &c); + + if (status == EOF) { + err ("do_p1_const: Missing constant value at end of file\n"); + c = (struct Constblock *) NULL; + } else if (status == 0) { + err ("do_p1_const: Illegal constant value in p1 file\n"); + c = (struct Constblock *) NULL; + } /* else */ + } /* else */ + return (expptr) c; +} /* do_p1_const */ + + void +#ifdef KR_headers +addrlit(addrp) + Addrp addrp; +#else +addrlit(Addrp addrp) +#endif +{ + long memno = addrp->memno; + struct Literal *litp, *lastlit; + + lastlit = litpool + nliterals; + for (litp = litpool; litp < lastlit; litp++) + if (litp->litnum == memno) { + addrp->vtype = litp->littype; + *((union Constant *) &(addrp->user)) = + *((union Constant *) &(litp->litval)); + addrp->vstg = STGMEMNO; + return; + } + err("addrlit failure!"); + } + + static expptr +#ifdef KR_headers +do_p1_literal(infile) + FILE *infile; +#else +do_p1_literal(FILE *infile) +#endif +{ + int status; + long memno; + Addrp addrp; + + status = p1getd (infile, &memno); + + if (status == EOF) + err ("do_p1_literal: Missing memno at end of file"); + else if (status == 0) + err ("do_p1_literal: Missing memno in p1 file"); + else { + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + addrp -> vtype = TYUNKNOWN; + addrp -> Field = NULL; + addrp -> memno = memno; + addrlit(addrp); + addrp -> uname_tag = UNAM_CONST; + } /* else */ + + return (expptr) addrp; +} /* do_p1_literal */ + + + static void +#ifdef KR_headers +do_p1_label(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_label(FILE *infile, FILE *outfile) +#endif +{ + int status; + ftnint stateno; + struct Labelblock *L; + char *fmt; + + status = p1getd (infile, &stateno); + + if (status == EOF) + err ("do_p1_label: Missing label at end of file"); + else if (status == 0) + err ("do_p1_label: Missing label in p1 file "); + else if (stateno < 0) { /* entry */ + margin_printf(outfile, "\n%s:\n", user_label(stateno)); + last_was_label = 1; + } + else { + L = labeltab + stateno; + if (L->labused) { + fmt = "%s:\n"; + last_was_label = 1; + } + else + fmt = "/* %s: */\n"; + margin_printf(outfile, fmt, user_label(L->stateno)); + } /* else */ +} /* do_p1_label */ + + + + static void +#ifdef KR_headers +do_p1_asgoto(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_asgoto(FILE *infile, FILE *outfile) +#endif +{ + expptr expr; + + expr = do_format (infile, outfile); + out_asgoto (outfile, expr); + +} /* do_p1_asgoto */ + + + static void +#ifdef KR_headers +do_p1_goto(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_goto(FILE *infile, FILE *outfile) +#endif +{ + int status; + long stateno; + + status = p1getd (infile, &stateno); + + if (status == EOF) + err ("do_p1_goto: Missing goto label at end of file"); + else if (status == 0) + err ("do_p1_goto: Missing goto label in p1 file"); + else { + nice_printf (outfile, "goto %s;\n", user_label (stateno)); + } /* else */ +} /* do_p1_goto */ + + + static void +#ifdef KR_headers +do_p1_if(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_if(FILE *infile, FILE *outfile) +#endif +{ + expptr cond; + + do { + cond = do_format (infile, outfile); + } while (cond == ENULL); + + out_if (outfile, cond); +} /* do_p1_if */ + + + static void +#ifdef KR_headers +do_p1_else(outfile) + FILE *outfile; +#else +do_p1_else(FILE *outfile) +#endif +{ + out_else (outfile); +} /* do_p1_else */ + + + static void +#ifdef KR_headers +do_p1_elif(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_elif(FILE *infile, FILE *outfile) +#endif +{ + expptr cond; + + do { + cond = do_format (infile, outfile); + } while (cond == ENULL); + + elif_out (outfile, cond); +} /* do_p1_elif */ + + static void +#ifdef KR_headers +do_p1_endif(outfile) + FILE *outfile; +#else +do_p1_endif(FILE *outfile) +#endif +{ + endif_out (outfile); +} /* do_p1_endif */ + + + static void +#ifdef KR_headers +do_p1_endelse(outfile) + FILE *outfile; +#else +do_p1_endelse(FILE *outfile) +#endif +{ + end_else_out (outfile); +} /* do_p1_endelse */ + + + static expptr +#ifdef KR_headers +do_p1_addr(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_addr(FILE *infile, FILE *outfile) +#endif +{ + Addrp addrp = (Addrp) NULL; + int status; + + status = p1getn (infile, (int)sizeof(struct Addrblock), (char **) &addrp); + + if (status == EOF) + err ("do_p1_addr: Missing Addrp at end of file"); + else if (status == 0) + err ("do_p1_addr: Missing Addrp in p1 file"); + else if (addrp == (Addrp) NULL) + err ("do_p1_addr: Null addrp in p1 file"); + else if (addrp -> tag != TADDR) + erri ("do_p1_addr: bad tag in p1 file '%d'", addrp -> tag); + else { + addrp -> vleng = do_format (infile, outfile); + addrp -> memoffset = do_format (infile, outfile); + } + + return (expptr) addrp; +} /* do_p1_addr */ + + + + static void +#ifdef KR_headers +do_p1_subr_ret(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_subr_ret(FILE *infile, FILE *outfile) +#endif +{ + expptr retval; + + nice_printf (outfile, "return "); + retval = do_format (infile, outfile); + if (!multitype) + if (retval) + expr_out (outfile, retval); + + nice_printf (outfile, ";\n"); +} /* do_p1_subr_ret */ + + + + static void +#ifdef KR_headers +do_p1_comp_goto(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_comp_goto(FILE *infile, FILE *outfile) +#endif +{ + expptr index; + expptr labels; + + index = do_format (infile, outfile); + + if (index == ENULL) { + err ("do_p1_comp_goto: no expression for computed goto"); + return; + } /* if index == ENULL */ + + labels = do_format (infile, outfile); + + if (labels && labels -> tag != TLIST) + erri ("do_p1_comp_goto: expected list, got tag '%d'", labels -> tag); + else + compgoto_out (outfile, index, labels); +} /* do_p1_comp_goto */ + + + static void +#ifdef KR_headers +do_p1_for(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_for(FILE *infile, FILE *outfile) +#endif +{ + expptr init, test, inc; + + init = do_format (infile, outfile); + test = do_format (infile, outfile); + inc = do_format (infile, outfile); + + out_for (outfile, init, test, inc); +} /* do_p1_for */ + + static void +#ifdef KR_headers +do_p1_end_for(outfile) + FILE *outfile; +#else +do_p1_end_for(FILE *outfile) +#endif +{ + out_end_for (outfile); +} /* do_p1_end_for */ + + + static void +#ifdef KR_headers +do_p1_fortran(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_fortran(FILE *infile, FILE *outfile) +#endif +{ + char buf[P1_STMTBUFSIZE]; + if (!p1gets(infile, buf, P1_STMTBUFSIZE)) + return; + /* bypass nice_printf nonsense */ + fprintf(outfile, "/*< %s >*/\n", buf+1); /* + 1 to skip by '$' */ + } + + + static expptr +#ifdef KR_headers +do_p1_expr(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_expr(FILE *infile, FILE *outfile) +#endif +{ + int status; + long opcode, type; + struct Exprblock *result = (struct Exprblock *) NULL; + + status = p1getd (infile, &opcode); + + if (status == EOF) + err ("do_p1_expr: Missing expr opcode at end of file"); + else if (status == 0) + err ("do_p1_expr: Missing expr opcode in p1 file"); + else { + + status = p1getd (infile, &type); + + if (status == EOF) + err ("do_p1_expr: Missing expr type at end of file"); + else if (status == 0) + err ("do_p1_expr: Missing expr type in p1 file"); + else if (opcode == 0) + return ENULL; + else { + result = ALLOC (Exprblock); + + result -> tag = TEXPR; + result -> vtype = (field)type; + result -> opcode = (unsigned int)opcode; + result -> vleng = do_format (infile, outfile); + + if (is_unary_op (opcode)) + result -> leftp = do_format (infile, outfile); + else if (is_binary_op (opcode)) { + result -> leftp = do_format (infile, outfile); + result -> rightp = do_format (infile, outfile); + } else + errl("do_p1_expr: Illegal opcode %ld", opcode); + } /* else */ + } /* else */ + + return (expptr) result; +} /* do_p1_expr */ + + + static expptr +#ifdef KR_headers +do_p1_ident(infile) + FILE *infile; +#else +do_p1_ident(FILE *infile) +#endif +{ + Addrp addrp; + int status; + long vtype, vstg; + + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + + status = p1getd (infile, &vtype); + if (status == EOF) + err ("do_p1_ident: Missing identifier type at end of file\n"); + else if (status == 0 || vtype < 0 || vtype >= NTYPES) + errl("do_p1_ident: Bad type in intermediate file: %ld\n", vtype); + else + addrp -> vtype = (field)vtype; + + status = p1getd (infile, &vstg); + if (status == EOF) + err ("do_p1_ident: Missing identifier storage at end of file\n"); + else if (status == 0 || vstg < 0 || vstg > STGNULL) + errl("do_p1_ident: Bad storage in intermediate file: %ld\n", vtype); + else + addrp -> vstg = (field)vstg; + + status = p1gets(infile, addrp->user.ident, IDENT_LEN); + + if (status == EOF) + err ("do_p1_ident: Missing ident string at end of file"); + else if (status == 0) + err ("do_p1_ident: Missing ident string in intermediate file"); + addrp->uname_tag = UNAM_IDENT; + return (expptr) addrp; +} /* do_p1_ident */ + + static expptr +#ifdef KR_headers +do_p1_charp(infile) + FILE *infile; +#else +do_p1_charp(FILE *infile) +#endif +{ + Addrp addrp; + int status; + long vtype, vstg; + char buf[64]; + + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + + status = p1getd (infile, &vtype); + if (status == EOF) + err ("do_p1_ident: Missing identifier type at end of file\n"); + else if (status == 0 || vtype < 0 || vtype >= NTYPES) + errl("do_p1_ident: Bad type in intermediate file: %ld\n", vtype); + else + addrp -> vtype = (field)vtype; + + status = p1getd (infile, &vstg); + if (status == EOF) + err ("do_p1_ident: Missing identifier storage at end of file\n"); + else if (status == 0 || vstg < 0 || vstg > STGNULL) + errl("do_p1_ident: Bad storage in intermediate file: %ld\n", vtype); + else + addrp -> vstg = (field)vstg; + + status = p1gets(infile, buf, (int)sizeof(buf)); + + if (status == EOF) + err ("do_p1_ident: Missing charp ident string at end of file"); + else if (status == 0) + err ("do_p1_ident: Missing charp ident string in intermediate file"); + addrp->uname_tag = UNAM_CHARP; + addrp->user.Charp = strcpy(mem(strlen(buf)+1,0), buf); + return (expptr) addrp; +} + + + static expptr +#ifdef KR_headers +do_p1_extern(infile) + FILE *infile; +#else +do_p1_extern(FILE *infile) +#endif +{ + Addrp addrp; + + addrp = ALLOC (Addrblock); + if (addrp) { + int status; + + addrp->tag = TADDR; + addrp->vstg = STGEXT; + addrp->uname_tag = UNAM_EXTERN; + status = p1getd (infile, &(addrp -> memno)); + if (status == EOF) + err ("do_p1_extern: Missing memno at end of file"); + else if (status == 0) + err ("do_p1_extern: Missing memno in intermediate file"); + if (addrp->vtype = extsymtab[addrp->memno].extype) + addrp->vclass = CLPROC; + } /* if addrp */ + + return (expptr) addrp; +} /* do_p1_extern */ + + + + static expptr +#ifdef KR_headers +do_p1_head(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_head(FILE *infile, FILE *outfile) +#endif +{ + int status; + int add_n_; + long Class; + char storage[256]; + + status = p1getd (infile, &Class); + if (status == EOF) + err ("do_p1_head: missing header class at end of file"); + else if (status == 0) + err ("do_p1_head: missing header class in p1 file"); + else { + status = p1gets (infile, storage, (int)sizeof(storage)); + if (status == EOF || status == 0) + storage[0] = '\0'; + } /* else */ + + if (Class == CLPROC || Class == CLMAIN) { + chainp lengths; + + add_n_ = nentry > 1; + lengths = length_comp(entries, add_n_); + + if (!add_n_ && protofile && Class != CLMAIN) + protowrite(protofile, proctype, storage, entries, lengths); + + if (Class == CLMAIN) + nice_printf (outfile, "/* Main program */ int "); + else + nice_printf(outfile, "%s ", multitype ? "VOID" + : c_type_decl(proctype, 1)); + + nice_printf(outfile, add_n_ ? "%s0_" : "%s", storage); + if (!Ansi) { + listargs(outfile, entries, add_n_, lengths); + nice_printf (outfile, "\n"); + } + list_arg_types (outfile, entries, lengths, add_n_, "\n"); + nice_printf (outfile, "{\n"); + frchain(&lengths); + next_tab (outfile); + strcpy(this_proc_name, storage); + list_decls (outfile); + + } else if (Class == CLBLOCK) + next_tab (outfile); + else + errl("do_p1_head: got class %ld", Class); + + return NULL; +} /* do_p1_head */ + + + static expptr +#ifdef KR_headers +do_p1_list(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_list(FILE *infile, FILE *outfile) +#endif +{ + long tag, type, count; + int status; + expptr result; + + status = p1getd (infile, &tag); + if (status == EOF) + err ("do_p1_list: missing list tag at end of file"); + else if (status == 0) + err ("do_p1_list: missing list tag in p1 file"); + else { + status = p1getd (infile, &type); + if (status == EOF) + err ("do_p1_list: missing list type at end of file"); + else if (status == 0) + err ("do_p1_list: missing list type in p1 file"); + else { + status = p1getd (infile, &count); + if (status == EOF) + err ("do_p1_list: missing count at end of file"); + else if (status == 0) + err ("do_p1_list: missing count in p1 file"); + } /* else */ + } /* else */ + + result = (expptr) ALLOC (Listblock); + if (result) { + chainp pointer; + + result -> tag = (field)tag; + result -> listblock.vtype = (field)type; + +/* Assume there will be enough data */ + + if (count--) { + pointer = result->listblock.listp = + mkchain((char *)do_format(infile, outfile), CHNULL); + while (count--) { + pointer -> nextp = + mkchain((char *)do_format(infile, outfile), CHNULL); + pointer = pointer -> nextp; + } /* while (count--) */ + } /* if (count) */ + } /* if (result) */ + + return result; +} /* do_p1_list */ + + + chainp +#ifdef KR_headers +length_comp(e, add_n) + struct Entrypoint *e; + int add_n; +#else +length_comp(struct Entrypoint *e, int add_n) +#endif + /* get lengths of characters args */ +{ + chainp lengths; + chainp args, args1; + Namep arg, np; + int nchargs; + Argtypes *at; + Atype *a; + extern int init_ac[TYSUBR+1]; + + if (!e) + return 0; /* possible only with errors */ + args = args1 = add_n ? allargs : e->arglist; + nchargs = 0; + for (lengths = NULL; args; args = args -> nextp) + if (arg = (Namep)args->datap) { + if (arg->vclass == CLUNKNOWN) + arg->vclass = CLVAR; + if (arg->vtype == TYCHAR && arg->vclass != CLPROC) { + lengths = mkchain((char *)arg, lengths); + nchargs++; + } + } + if (!add_n && (np = e->enamep)) { + /* one last check -- by now we know all we ever will + * about external args... + */ + save_argtypes(e->arglist, &e->entryname->arginfo, + &np->arginfo, 0, np->fvarname, STGEXT, nchargs, + np->vtype, 1); + at = e->entryname->arginfo; + a = at->atypes + init_ac[np->vtype]; + for(; args1; a++, args1 = args1->nextp) { + frchain(&a->cp); + if (arg = (Namep)args1->datap) + switch(arg->vclass) { + case CLPROC: + if (arg->vimpltype + && a->type >= 300) + a->type = TYUNKNOWN + 200; + break; + case CLUNKNOWN: + a->type %= 100; + } + } + } + return revchain(lengths); + } + + void +#ifdef KR_headers +listargs(outfile, entryp, add_n_, lengths) + FILE *outfile; + struct Entrypoint *entryp; + int add_n_; + chainp lengths; +#else +listargs(FILE *outfile, struct Entrypoint *entryp, int add_n_, chainp lengths) +#endif +{ + chainp args; + char *s; + Namep arg; + int did_one = 0; + + nice_printf (outfile, "("); + + if (add_n_) { + nice_printf(outfile, "n__"); + did_one = 1; + args = allargs; + } + else { + if (!entryp) + return; /* possible only with errors */ + args = entryp->arglist; + } + + if (multitype) + { + nice_printf(outfile, ", ret_val"); + did_one = 1; + args = allargs; + } + else if (ONEOF(proctype, MSKCOMPLEX|MSKCHAR)) + { + s = xretslot[proctype]->user.ident; + nice_printf(outfile, did_one ? ", %s" : "%s", + *s == '(' /*)*/ ? "r_v" : s); + did_one = 1; + if (proctype == TYCHAR) + nice_printf (outfile, ", ret_val_len"); + } + for (; args; args = args -> nextp) + if (arg = (Namep)args->datap) { + nice_printf (outfile, "%s", did_one ? ", " : ""); + out_name (outfile, arg); + did_one = 1; + } + + for (args = lengths; args; args = args -> nextp) + nice_printf(outfile, ", %s", + new_arg_length((Namep)args->datap)); + nice_printf (outfile, ")"); +} /* listargs */ + + + void +#ifdef KR_headers +list_arg_types(outfile, entryp, lengths, add_n_, finalnl) + FILE *outfile; + struct Entrypoint *entryp; + chainp lengths; + int add_n_; + char *finalnl; +#else +list_arg_types(FILE *outfile, struct Entrypoint *entryp, chainp lengths, int add_n_, char *finalnl) +#endif +{ + chainp args; + int last_type = -1, last_class = -1; + int did_one = 0, done_one, is_ext; + char *s, *sep = "", *sep1; + + if (outfile == (FILE *) NULL) { + err ("list_arg_types: null output file"); + return; + } else if (entryp == (struct Entrypoint *) NULL) { + err ("list_arg_types: null procedure entry pointer"); + return; + } /* else */ + + if (Ansi) { + done_one = 0; + sep1 = ", "; + nice_printf(outfile, "(" /*)*/); + } + else { + done_one = 1; + sep1 = ";\n"; + } + args = entryp->arglist; + if (add_n_) { + nice_printf(outfile, "int n__"); + did_one = done_one; + sep = sep1; + args = allargs; + } + if (multitype) { + nice_printf(outfile, "%sMultitype *ret_val", sep); + did_one = done_one; + sep = sep1; + } + else if (ONEOF (proctype, MSKCOMPLEX|MSKCHAR)) { + s = xretslot[proctype]->user.ident; + nice_printf(outfile, "%s%s *%s", sep, c_type_decl(proctype, 0), + *s == '(' /*)*/ ? "r_v" : s); + did_one = done_one; + sep = sep1; + if (proctype == TYCHAR) + nice_printf (outfile, "%sftnlen ret_val_len", sep); + } /* if ONEOF proctype */ + for (; args; args = args -> nextp) { + Namep arg = (Namep) args->datap; + +/* Scalars are passed by reference, and arrays will have their lower bound + adjusted, so nearly everything is printed with a star in front. The + exception is character lengths, which are passed by value. */ + + if (arg) { + int type = arg -> vtype, vclass = arg -> vclass; + + if (vclass == CLPROC) + if (arg->vimpltype) + type = Castargs ? TYUNKNOWN : TYSUBR; + else if (type == TYREAL && forcedouble && !Castargs) + type = TYDREAL; + + if (type == last_type && vclass == last_class && did_one) + nice_printf (outfile, ", "); + else + if ((is_ext = vclass == CLPROC) && Castargs) + nice_printf(outfile, "%s%s ", sep, + usedcasts[type] = casttypes[type]); + else + nice_printf(outfile, "%s%s ", sep, + c_type_decl(type, is_ext)); + if (vclass == CLPROC) + if (Castargs) + out_name(outfile, arg); + else { + nice_printf(outfile, "(*"); + out_name(outfile, arg); + nice_printf(outfile, ") %s", parens); + } + else { + nice_printf (outfile, "*"); + out_name (outfile, arg); + } + + last_type = type; + last_class = vclass; + did_one = done_one; + sep = sep1; + } /* if (arg) */ + } /* for args = entryp -> arglist */ + + for (args = lengths; args; args = args -> nextp) + nice_printf(outfile, "%sftnlen %s", sep, + new_arg_length((Namep)args->datap)); + if (did_one) + nice_printf (outfile, ";\n"); + else if (Ansi) + nice_printf(outfile, + /*((*/ sep != sep1 && Ansi == 1 ? "void)%s" : ")%s", + finalnl); +} /* list_arg_types */ + + static void +#ifdef KR_headers +write_formats(outfile) + FILE *outfile; +#else +write_formats(FILE *outfile) +#endif +{ + register struct Labelblock *lp; + int first = 1; + char *fs; + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if (lp->fmtlabused) { + if (first) { + first = 0; + nice_printf(outfile, "/* Format strings */\n"); + } + nice_printf(outfile, "static char fmt_%ld[] = \"", + lp->stateno); + if (!(fs = lp->fmtstring)) + fs = ""; + nice_printf(outfile, "%s\";\n", fs); + } + if (!first) + nice_printf(outfile, "\n"); + } + + static void +#ifdef KR_headers +write_ioblocks(outfile) + FILE *outfile; +#else +write_ioblocks(FILE *outfile) +#endif +{ + register iob_data *L; + register char *f, **s, *sep; + + nice_printf(outfile, "/* Fortran I/O blocks */\n"); + L = iob_list = (iob_data *)revchain((chainp)iob_list); + do { + nice_printf(outfile, "static %s %s = { ", + L->type, L->name); + sep = 0; + for(s = L->fields; f = *s; s++) { + if (sep) + nice_printf(outfile, sep); + sep = ", "; + if (*f == '"') { /* kludge */ + nice_printf(outfile, "\""); + nice_printf(outfile, "%s\"", f+1); + } + else + nice_printf(outfile, "%s", f); + } + nice_printf(outfile, " };\n"); + } + while(L = L->next); + nice_printf(outfile, "\n\n"); + } + + static void +#ifdef KR_headers +write_assigned_fmts(outfile) + FILE *outfile; +#else +write_assigned_fmts(FILE *outfile) +#endif +{ + register chainp cp; + Namep np; + char *comma, *type; + int did_one = 0; + + cp = assigned_fmts = revchain(assigned_fmts); + nice_printf(outfile, "/* Assigned format variables */\n"); + do { + np = (Namep)cp->datap; + if (did_one == np->vstg) { + comma = ", "; + type = ""; + } + else { + comma = (char*)(did_one ? ";\n" : ""); + type = (char*)(np->vstg == STGAUTO + ? "char " : "static char "); + did_one = np->vstg; + } + nice_printf(outfile, "%s%s*%s_fmt", comma, type, np->fvarname); + } + while(cp = cp->nextp); + nice_printf(outfile, ";\n\n"); + } + + static char * +#ifdef KR_headers +to_upper(s) + register char *s; +#else +to_upper(register char *s) +#endif +{ + static char buf[64]; + register char *t = buf; + register int c; + while(*t++ = (c = *s++) >= 'a' && c <= 'z' ? c + 'A' - 'a' : c); + return buf; + } + + +/* This routine creates static structures representing a namelist. + Declarations of the namelist and related structures are: + + struct Vardesc { + char *name; + char *addr; + ftnlen *dims; *//* laid out as struct dimensions below *//* + int type; + }; + typedef struct Vardesc Vardesc; + + struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; + + struct dimensions + { + ftnlen numberofdimensions; + ftnlen numberofelements + ftnlen baseoffset; + ftnlen span[numberofdimensions-1]; + }; + + If dims is not null, then the corner element of the array is at + addr. However, the element with subscripts (i1,...,in) is at + addr + sizeoftype * (i1+span[0]*(i2+span[1]*...) - dimp->baseoffset) +*/ + + static void +#ifdef KR_headers +write_namelists(nmch, outfile) + chainp nmch; + FILE *outfile; +#else +write_namelists(chainp nmch, FILE *outfile) +#endif +{ + Namep var; + struct Hashentry *entry; + struct Dimblock *dimp; + int i, nd, type; + char *comma, *name; + register chainp q; + register Namep v; + + nice_printf(outfile, "/* Namelist stuff */\n\n"); + for (entry = hashtab; entry < lasthash; ++entry) { + if (!(v = entry->varp) || !v->vnamelist) + continue; + type = v->vtype; + name = v->cvarname; + if (dimp = v->vdim) { + nd = dimp->ndim; + nice_printf(outfile, + "static ftnlen %s_dims[] = { %d, %ld, %ld", + name, nd, + dimp->nelt->constblock.Const.ci, + dimp->baseoffset->constblock.Const.ci); + for(i = 0, --nd; i < nd; i++) + nice_printf(outfile, ", %ld", + dimp->dims[i].dimsize->constblock.Const.ci); + nice_printf(outfile, " };\n"); + } + nice_printf(outfile, "static Vardesc %s_dv = { \"%s\", %s", + name, to_upper(v->fvarname), + type == TYCHAR ? "" + : (dimp || oneof_stg(v,v->vstg, + M(STGEQUIV)|M(STGCOMMON))) + ? "(char *)" : "(char *)&"); + out_name(outfile, v); + nice_printf(outfile, dimp ? ", %s_dims" : ", (ftnlen *)0", name); + nice_printf(outfile, ", %ld };\n", + type != TYCHAR ? (long)typeconv[type] + : -v->vleng->constblock.Const.ci); + } + + do { + var = (Namep)nmch->datap; + name = var->cvarname; + nice_printf(outfile, "\nstatic Vardesc *%s_vl[] = ", name); + comma = "{"; + i = 0; + for(q = var->varxptr.namelist ; q ; q = q->nextp) { + v = (Namep)q->datap; + if (!v->vnamelist) + continue; + i++; + nice_printf(outfile, "%s &%s_dv", comma, v->cvarname); + comma = ","; + } + nice_printf(outfile, " };\n"); + nice_printf(outfile, + "static Namelist %s = { \"%s\", %s_vl, %d };\n", + name, to_upper(var->fvarname), name, i); + } + while(nmch = nmch->nextp); + nice_printf(outfile, "\n"); + } + +/* fixextype tries to infer from usage in previous procedures + the type of an external procedure declared + external and passed as an argument but never typed or invoked. + */ + + static int +#ifdef KR_headers +fixexttype(var) + Namep var; +#else +fixexttype(Namep var) +#endif +{ + Extsym *e; + int type, type1; + + type = var->vtype; + e = &extsymtab[var->vardesc.varno]; + if ((type1 = e->extype) && type == TYUNKNOWN) + return var->vtype = type1; + if (var->visused) { + if (e->exused && type != type1) + changedtype(var); + e->exused = 1; + e->extype = type; + } + return type; + } + + static void +#ifdef KR_headers +ref_defs(outfile, refdefs) + FILE *outfile; + chainp refdefs; +#else +ref_defs(FILE *outfile, chainp refdefs) +#endif +{ + chainp cp; + int eb, i, j, n; + struct Dimblock *dimp; + expptr b, vl; + Namep var; + char *amp, *comma; + + margin_printf(outfile, "\n"); + for(cp = refdefs = revchain(refdefs); cp; cp = cp->nextp) { + var = (Namep)cp->datap; + cp->datap = 0; + amp = "_subscr"; + if (!(eb = var->vsubscrused)) { + var->vrefused = 0; + if (!ISCOMPLEX(var->vtype)) + amp = "_ref"; + } + def_start(outfile, var->cvarname, amp, CNULL); + dimp = var->vdim; + vl = 0; + comma = "("; + amp = ""; + if (var->vtype == TYCHAR) { + amp = "&"; + vl = var->vleng; + if (ISCONST(vl) && vl->constblock.Const.ci == 1) + vl = 0; + nice_printf(outfile, "%sa_0", comma); + comma = ","; + } + n = dimp->ndim; + for(i = 1; i <= n; i++, comma = ",") + nice_printf(outfile, "%sa_%d", comma, i); + nice_printf(outfile, ") %s", amp); + if (var->vsubscrused) + var->vsubscrused = 0; + else if (!ISCOMPLEX(var->vtype)) { + out_name(outfile, var); + nice_printf(outfile, "[%s", vl ? "(" : ""); + } + for(j = 2; j < n; j++) + nice_printf(outfile, "("); + while(--i > 1) { + nice_printf(outfile, "(a_%d)%s*", i, i == n ? "" : ")"); + expr_out(outfile, cpexpr(dimp->dims[i-2].dimsize)); + nice_printf(outfile, " + "); + } + nice_printf(outfile, "a_1"); + if (var->vtype == TYCHAR) { + if (vl) { + nice_printf(outfile, ")*"); + expr_out(outfile, cpexpr(vl)); + } + nice_printf(outfile, " + a_0"); + } + if ((var->vstg != STGARG /* || checksubs */ ) + && (b = dimp->baseoffset)) { + b = cpexpr(b); + if (var->vtype == TYCHAR) + b = mkexpr(OPSTAR, cpexpr(var->vleng), b); + nice_printf(outfile, " - "); + expr_out(outfile, b); + } + if (ISCOMPLEX(var->vtype)) { + margin_printf(outfile, "\n"); + def_start(outfile, var->cvarname, "_ref", CNULL); + comma = "("; + for(i = 1; i <= n; i++, comma = ",") + nice_printf(outfile, "%sa_%d", comma, i); + nice_printf(outfile, ") %s[%s_subscr", + var->cvarname, var->cvarname); + comma = "("; + for(i = 1; i <= n; i++, comma = ",") + nice_printf(outfile, "%sa_%d", comma, i); + nice_printf(outfile, ")"); + } + margin_printf(outfile, "]\n" + eb); + } + nice_printf(outfile, "\n"); + frchain(&refdefs); + } + + static long +#ifdef KR_headers +n_elt(vd) struct Dimblock *vd; +#else +n_elt(struct Dimblock *vd) +#endif +{ + expptr ne; + long nv = 1; + if (vd) { + if (!(ne = vd->nelt)) + Fatal("Null nelt in n_elt"); + if (ne->tag != TCONST) + fatali("Unexpected nelt tag %d in n_elt", ne->tag); + if (!ISINT(ne->constblock.vtype)) + fatali("Unexpected vtype %d in n_elt", + ne->constblock.vtype); + nv = ne->constblock.Const.ci; + } + return nv; + } + + void +#ifdef KR_headers +list_decls(outfile) + FILE *outfile; +#else +list_decls(FILE *outfile) +#endif +{ + extern chainp used_builtins; + extern struct Hashentry *hashtab; + struct Hashentry *entry; + int write_header = 1; + int last_class = -1, last_stg = -1; + Namep var; + int Alias, Define, did_one, last_type, stg, type; + extern int def_equivs, useauto; + extern chainp new_vars; /* Compiler-generated locals */ + chainp namelists = 0, refdefs = 0; + char *ctype; + int useauto1 = useauto && !saveall; + long x; + extern int hsize; + +/* First write out the statically initialized data */ + + if (initfile) + list_init_data(&initfile, initfname, outfile); + +/* Next come formats */ + write_formats(outfile); + +/* Now write out the system-generated identifiers */ + + if (new_vars || nequiv) { + chainp args, next_var, this_var; + chainp nv[TYVOID], nv1[TYVOID]; + int i, j; + ftnint k; + Addrp Var; + Namep arg; + + /* zap unused dimension variables */ + + for(args = allargs; args; args = args->nextp) { + arg = (Namep)args->datap; + if (this_var = arg->vlastdim) { + frexpr((tagptr)this_var->datap); + this_var->datap = 0; + } + } + + /* sort new_vars by type, skipping entries just zapped */ + + for(i = TYADDR; i < TYVOID; i++) + nv[i] = 0; + for(this_var = new_vars; this_var; this_var = next_var) { + next_var = this_var->nextp; + if (Var = (Addrp)this_var->datap) { + if (!(this_var->nextp = nv[j = Var->vtype])) + nv1[j] = this_var; + nv[j] = this_var; + } + else { + this_var->nextp = 0; + frchain(&this_var); + } + } + new_vars = 0; + for(i = TYVOID; --i >= TYADDR;) + if (this_var = nv[i]) { + nv1[i]->nextp = new_vars; + new_vars = this_var; + } + + /* write the declarations */ + + did_one = 0; + last_type = -1; + + for (this_var = new_vars; this_var; this_var = this_var -> nextp) { + Var = (Addrp) this_var->datap; + + if (Var == (Addrp) NULL) + err ("list_decls: null variable"); + else if (Var -> tag != TADDR) + erri ("list_decls: bad tag on new variable '%d'", + Var -> tag); + + type = nv_type (Var); + if (Var->vstg == STGINIT + || Var->uname_tag == UNAM_IDENT + && *Var->user.ident == ' ' + && multitype) + continue; + if (!did_one) + nice_printf (outfile, "/* System generated locals */\n"); + + if (last_type == type && did_one) + nice_printf (outfile, ", "); + else { + if (did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "%s ", + c_type_decl (type, Var -> vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for parameters + with unknown length and functions returning character */ + + if (Var -> vtype == TYCHAR && (!ISICON ((Var -> vleng)) + || Var -> vclass == CLPROC)) + nice_printf (outfile, "*"); + + write_nv_ident(outfile, (Addrp)this_var->datap); + if (Var -> vtype == TYCHAR && Var->vclass != CLPROC && + ISICON((Var -> vleng)) + && (k = Var->vleng->constblock.Const.ci) > 0) + nice_printf (outfile, "[%ld]", (long)k); + + did_one = 1; + last_type = nv_type (Var); + } /* for this_var */ + +/* Handle the uninitialized equivalences */ + + do_uninit_equivs (outfile, &did_one); + + if (did_one) + nice_printf (outfile, ";\n\n"); + } /* if new_vars */ + +/* Write out builtin declarations */ + + if (used_builtins) { + chainp cp; + Extsym *es; + + last_type = -1; + did_one = 0; + + nice_printf (outfile, "/* Builtin functions */"); + + for (cp = used_builtins; cp; cp = cp -> nextp) { + Addrp e = (Addrp)cp->datap; + + switch(type = e->vtype) { + case TYDREAL: + case TYREAL: + /* if (forcedouble || e->dbl_builtin) */ + /* libF77 currently assumes everything double */ + type = TYDREAL; + ctype = "double"; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + type = TYVOID; + /* no break */ + default: + ctype = c_type_decl(type, 0); + } + + if (did_one && last_type == type) + nice_printf(outfile, ", "); + else + nice_printf(outfile, "%s\n%s ", did_one ? ";" : "", ctype); + + extern_out(outfile, es = &extsymtab[e -> memno]); + proto(outfile, es->arginfo, es->fextname); + last_type = type; + did_one = 1; + } /* for cp = used_builtins */ + + nice_printf (outfile, ";\n\n"); + } /* if used_builtins */ + + last_type = -1; + for (entry = hashtab; entry < lasthash; ++entry) { + var = entry -> varp; + + if (var) { + int procclass = var -> vprocclass; + char *comment = NULL; + int vclass = var -> vclass; + stg = var -> vstg; + type = var -> vtype; + + if (var->vrefused) + refdefs = mkchain((char *)var, refdefs); + if (var->vsubscrused) + if (ISCOMPLEX(var->vtype)) + var->vsubscrused = 0; + else + refdefs = mkchain((char *)var, refdefs); + if (ONEOF(stg, M(STGARG)|M(STGLENG)|M(STGINIT))) + continue; + + if (useauto1 && stg == STGBSS && !var->vsave) + stg = STGAUTO; + + switch (vclass) { + case CLVAR: + break; + case CLPROC: + switch(procclass) { + case PTHISPROC: + extsymtab[var->vardesc.varno].extype = type; + continue; + case PSTFUNCT: + case PINTRINSIC: + continue; + case PUNKNOWN: + err ("list_decls: unknown procedure class"); + continue; + case PEXTERNAL: + if (stg == STGUNKNOWN) { + warn1( + "%.64s declared EXTERNAL but never used.", + var->fvarname); + /* to retain names declared EXTERNAL */ + /* but not referenced, change */ + /* "continue" to "stg = STGEXT" */ + continue; + } + else + type = fixexttype(var); + } + break; + case CLUNKNOWN: + /* declared but never used */ + continue; + case CLPARAM: + continue; + case CLNAMELIST: + if (var->visused) + namelists = mkchain((char *)var, namelists); + continue; + default: + erri("list_decls: can't handle class '%d' yet", + vclass); + Fatal(var->fvarname); + continue; + } /* switch */ + + /* Might be equivalenced to a common. If not, don't process */ + if (stg == STGCOMMON && !var->vcommequiv) + continue; + +/* Only write the header if system-generated locals, builtins, or + uninitialized equivs were already output */ + + if (write_header == 1 && (new_vars || nequiv || used_builtins) + && oneof_stg ( var, stg, + M(STGBSS)|M(STGEXT)|M(STGAUTO)|M(STGCOMMON)|M(STGEQUIV))) { + nice_printf (outfile, "/* Local variables */\n"); + write_header = 2; + } + + + Alias = oneof_stg(var, stg, M(STGEQUIV)|M(STGCOMMON)); + if (Define = (Alias && def_equivs)) { + if (!write_header) + nice_printf(outfile, ";\n"); + def_start(outfile, var->cvarname, CNULL, "("); + goto Alias1; + } + else if (type == last_type && vclass == last_class && + stg == last_stg && !write_header) + nice_printf (outfile, ", "); + else { + if (!write_header && ONEOF(stg, M(STGBSS)| + M(STGEXT)|M(STGAUTO)|M(STGEQUIV)|M(STGCOMMON))) + nice_printf (outfile, ";\n"); + + switch (stg) { + case STGARG: + case STGLENG: + /* Part of the argument list, don't write them out + again */ + continue; /* Go back to top of the loop */ + case STGBSS: + case STGEQUIV: + case STGCOMMON: + nice_printf (outfile, "static "); + break; + case STGEXT: + nice_printf (outfile, "extern "); + break; + case STGAUTO: + break; + case STGINIT: + case STGUNKNOWN: + /* Don't want to touch the initialized data, that will + be handled elsewhere. Unknown data have + already been complained about, so skip them */ + continue; + default: + erri("list_decls: can't handle storage class %d", + stg); + continue; + } /* switch */ + + if (type == TYCHAR && halign && vclass != CLPROC + && ISICON(var->vleng)) { + nice_printf(outfile, "struct { %s fill; char val", + halign); + x = wr_char_len(outfile, var->vdim, + var->vleng->constblock.Const.ci, 1); + if (x %= hsize) + nice_printf(outfile, "; char fill2[%ld]", + hsize - x); + nice_printf(outfile, "; } %s_st;\n", var->cvarname); + def_start(outfile, var->cvarname, CNULL, var->cvarname); + margin_printf(outfile, "_st.val\n"); + last_type = -1; + write_header = 2; + continue; + } + nice_printf(outfile, "%s ", + c_type_decl(type, vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for variable + length strings, and also for equivalences */ + + if (type == TYCHAR && vclass != CLPROC + && (!var->vleng || !ISICON (var -> vleng)) + || oneof_stg(var, stg, M(STGEQUIV)|M(STGCOMMON))) + nice_printf (outfile, "*%s", var->cvarname); + else { + nice_printf (outfile, "%s", var->cvarname); + if (vclass == CLPROC) { + Argtypes *at; + if (!(at = var->arginfo) + && var->vprocclass == PEXTERNAL) + at = extsymtab[var->vardesc.varno].arginfo; + proto(outfile, at, var->fvarname); + } + else if (type == TYCHAR && ISICON ((var -> vleng))) + wr_char_len(outfile, var->vdim, + var->vleng->constblock.Const.ci, 0); + else if (var -> vdim && + !oneof_stg (var, stg, M(STGEQUIV)|M(STGCOMMON))) + comment = wr_ardecls(outfile, var->vdim, 1L); + } + + if (comment) + nice_printf (outfile, "%s", comment); + Alias1: + if (Alias) { + char *amp, *lp, *name, *rp; + ftnint voff = var -> voffset; + int et0, expr_type, k; + Extsym *E; + struct Equivblock *eb; + char buf[MAXNAMELEN+30]; /*30 should be overkill*/ + +/* We DON'T want to use oneof_stg here, because we need to distinguish + between them */ + + if (stg == STGEQUIV) { + name = equiv_name(k = var->vardesc.varno, CNULL); + eb = eqvclass + k; + if (eb->eqvinit) { + amp = "&"; + et0 = TYERROR; + } + else { + amp = ""; + et0 = eb->eqvtype; + } + expr_type = et0; + } + else { + E = &extsymtab[var->vardesc.varno]; + sprintf(name = buf, "%s%d", E->cextname, E->curno); + expr_type = type; + et0 = -1; + amp = "&"; + } /* else */ + + if (!Define) + nice_printf (outfile, " = "); + if (voff) { + k = typesize[type]; + switch((int)(voff % k)) { + case 0: + voff /= k; + expr_type = type; + break; + case SZSHORT: + case SZSHORT+SZLONG: + expr_type = TYSHORT; + voff /= SZSHORT; + break; + case SZLONG: + expr_type = TYLONG; + voff /= SZLONG; + break; + default: + expr_type = TYCHAR; + } + } + + if (expr_type == type) { + lp = rp = ""; + if (et0 == -1 && !voff) + goto cast; + } + else { + lp = "("; + rp = ")"; + cast: + nice_printf(outfile, "(%s *)", c_type_decl(type, 0)); + } + +/* Now worry about computing the offset */ + + if (voff) { + if (expr_type == et0) + nice_printf (outfile, "%s%s + %ld%s", + lp, name, voff, rp); + else + nice_printf(outfile, "%s(%s *)%s%s + %ld%s", lp, + c_type_decl (expr_type, 0), amp, + name, voff, rp); + } else + nice_printf(outfile, "%s%s", amp, name); +/* Always put these at the end of the line */ + last_type = last_class = last_stg = -1; + write_header = 0; + if (Define) { + margin_printf(outfile, ")\n"); + write_header = 2; + } + continue; + } + write_header = 0; + last_type = type; + last_class = vclass; + last_stg = stg; + } /* if (var) */ + } /* for (entry = hashtab */ + + if (!write_header) + nice_printf (outfile, ";\n\n"); + else if (write_header == 2) + nice_printf(outfile, "\n"); + +/* Next, namelists, which may reference equivs */ + + if (namelists) { + write_namelists(namelists = revchain(namelists), outfile); + frchain(&namelists); + } + +/* Finally, ioblocks (which may reference equivs and namelists) */ + if (iob_list) + write_ioblocks(outfile); + if (assigned_fmts) + write_assigned_fmts(outfile); + + if (refdefs) + ref_defs(outfile, refdefs); + + if (trapuv) { + for (entry = hashtab; entry < lasthash; ++entry) + if ((var = entry->varp) + && ONEOF(var->vstg, M(STGAUTO)|M(STGBSS)) + && ISNUMERIC(var->vtype) + && var->vclass == CLVAR + && !var->vsave) + nice_printf(outfile, "_uninit_f2c(&%s,%d,%ldL);\n", + var->cvarname, typeconv[var->vtype], + n_elt(var->vdim)); + } + +} /* list_decls */ + + void +#ifdef KR_headers +do_uninit_equivs(outfile, did_one) + FILE *outfile; + int *did_one; +#else +do_uninit_equivs(FILE *outfile, int *did_one) +#endif +{ + extern int nequiv; + struct Equivblock *eqv, *lasteqv = eqvclass + nequiv; + int k, last_type = -1, t; + + for (eqv = eqvclass; eqv < lasteqv; eqv++) + if (!eqv -> eqvinit && eqv -> eqvtop != eqv -> eqvbottom) { + if (!*did_one) + nice_printf (outfile, "/* System generated locals */\n"); + t = eqv->eqvtype; + if (last_type == t) + nice_printf (outfile, ", "); + else { + if (*did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "static %s ", c_type_decl(t, 0)); + k = typesize[t]; + } /* else */ + nice_printf(outfile, "%s", equiv_name((int)(eqv - eqvclass), CNULL)); + nice_printf(outfile, "[%ld]", + (eqv->eqvtop - eqv->eqvbottom + k - 1) / k); + last_type = t; + *did_one = 1; + } /* if !eqv -> eqvinit */ +} /* do_uninit_equivs */ + + +/* wr_ardecls -- Writes the brackets and size for an array + declaration. Because of the inner workings of the compiler, + multi-dimensional arrays get mapped directly into a one-dimensional + array, so we have to compute the size of the array here. When the + dimension is greater than 1, a string comment about the original size + is returned */ + + char * +#ifdef KR_headers +wr_ardecls(outfile, dimp, size) + FILE *outfile; + struct Dimblock *dimp; + long size; +#else +wr_ardecls(FILE *outfile, struct Dimblock *dimp, long size) +#endif +{ + int i, k; + ftnint j; + static char buf[1000]; + + if (dimp == (struct Dimblock *) NULL) + return NULL; + + sprintf(buf, "\t/* was "); /* would like to say k = sprintf(...), but */ + k = strlen(buf); /* BSD doesn't return char transmitted count */ + + for (i = 0; i < dimp -> ndim; i++) { + expptr this_size = dimp -> dims[i].dimsize; + + if (ISCONST(this_size)) { + if (ISINT(this_size->constblock.vtype)) + j = this_size -> constblock.Const.ci; + else if (ISREAL(this_size->constblock.vtype)) + j = (ftnint)this_size -> constblock.Const.cd[0]; + else + goto non_const; + size *= j; + sprintf(buf+k, "[%ld]", j); + k += strlen(buf+k); + /* BSD prevents getting strlen from sprintf */ + } + else { + non_const: + err ("wr_ardecls: nonconstant array size"); + } + } /* for i = 0 */ + + nice_printf (outfile, "[%ld]", size); + strcat(buf+k, " */"); + + return (i > 1) ? buf : NULL; +} /* wr_ardecls */ + + + +/* ---------------------------------------------------------------------- + + The following routines read from the p1 intermediate file. If + that format changes, only these routines need be changed + + ---------------------------------------------------------------------- */ + + static int +#ifdef KR_headers +get_p1_token(infile) + FILE *infile; +#else +get_p1_token(FILE *infile) +#endif +{ + int token = P1_UNKNOWN; + +/* NOT PORTABLE!! */ + + if (fscanf (infile, "%d", &token) == EOF) + return P1_EOF; + +/* Skip over the ": " */ + + if (getc (infile) != '\n') + getc (infile); + + return token; +} /* get_p1_token */ + + + +/* Returns a (null terminated) string from the input file */ + + static int +#ifdef KR_headers +p1gets(fp, str, size) + FILE *fp; + char *str; + int size; +#else +p1gets(FILE *fp, char *str, int size) +#endif +{ + char c; + + if (str == NULL) + return 0; + + if ((c = getc (fp)) != ' ') + ungetc (c, fp); + + if (fgets (str, size, fp)) { + int length; + + str[size - 1] = '\0'; + length = strlen (str); + +/* Get rid of the newline */ + + if (str[length - 1] == '\n') + str[length - 1] = '\0'; + return 1; + + } else if (feof (fp)) + return EOF; + else + return 0; +} /* p1gets */ + + +#ifndef NO_LONG_LONG + static int +#ifdef KR_headers +p1getq(infile, result) FILE *infile; Llong *result; +#else +p1getq(FILE *infile, Llong *result) +#endif +{ +#ifdef __FreeBSD__ +#ifndef NO_FSCANF_LL_BUG +#define FSCANF_LL_BUG +#endif +#endif +#ifdef FSCANF_LL_BUG + ULlong x = 0; + int c, have_c = 0; + for(;;) { + c = getc(infile); + if (c == EOF) + break; + if (c <= ' ') { + if (!have_c) + continue; + goto done; + } + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'a' && c <= 'f') + c += 10 - 'a'; + else if (c >= 'A' && c <= 'F') + c += 10 - 'A'; + else { + done: + ungetc(c, infile); + break; + } + x = x << 4 | c; + have_c = 1; + } + if (have_c) { + *result = (Llong)x; + return 1; + } + return 0; +#else + return fscanf(infile, "%llx", result); +#endif + } +#endif + + static int +#ifdef KR_headers +p1get_const(infile, type, resultp) + FILE *infile; + int type; + struct Constblock **resultp; +#else +p1get_const(FILE *infile, int type, struct Constblock **resultp) +#endif +{ + int status; + Addr a; + struct Constblock *result; + + if (type != TYCHAR) { + *resultp = result = ALLOC(Constblock); + result -> tag = TCONST; + result -> vtype = type; + } + + switch (type) { + case TYINT1: + case TYSHORT: + case TYLONG: + case TYLOGICAL: + case TYLOGICAL1: + case TYLOGICAL2: + status = p1getd (infile, &(result -> Const.ci)); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + status = p1getq(infile, &result->Const.cq); + break; +#endif + case TYREAL: + case TYDREAL: + status = p1getf(infile, &result->Const.cds[0]); + result->vstg = 1; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + status = p1getf(infile, &result->Const.cds[0]); + if (status && status != EOF) + status = p1getf(infile, &result->Const.cds[1]); + result->vstg = 1; + break; + case TYCHAR: + status = fscanf(infile, Addrfmt, &a); + *resultp = (struct Constblock *) a; + break; + default: + erri ("p1get_const: bad constant type '%d'", type); + status = 0; + break; + } /* switch */ + + return status; +} /* p1get_const */ + + static int +#ifdef KR_headers +p1geta(infile, result) + FILE *infile; + Addr *result; +#else +p1geta(FILE *infile, Addr *result) +#endif +{ + return fscanf (infile, Addrfmt, result); +} /* p1getd */ + + static int +#ifdef KR_headers +p1getd(infile, result) + FILE *infile; + long *result; +#else +p1getd(FILE *infile, long *result) +#endif +{ + return fscanf (infile, "%ld", result); +} /* p1getd */ + + static int +#ifdef KR_headers +p1getf(infile, result) + FILE *infile; + char **result; +#else +p1getf(FILE *infile, char **result) +#endif +{ + + char buf[1324]; + register int k; + + k = fscanf (infile, "%s", buf); + if (k < 1) + k = EOF; + else + strcpy(*result = mem(strlen(buf)+1,0), buf); + return k; +} + + static int +#ifdef KR_headers +p1getn(infile, count, result) + FILE *infile; + int count; + char **result; +#else +p1getn(FILE *infile, int count, char **result) +#endif +{ + + char *bufptr; + + bufptr = (char *) ckalloc (count); + + if (result) + *result = bufptr; + + for (; !feof (infile) && count > 0; count--) + *bufptr++ = getc (infile); + + return feof (infile) ? EOF : 1; +} /* p1getn */ + + static void +#ifdef KR_headers +proto(outfile, at, fname) + FILE *outfile; + Argtypes *at; + char *fname; +#else +proto(FILE *outfile, Argtypes *at, char *fname) +#endif +{ + int i, j, k, n; + char *comma; + Atype *atypes; + Namep np; + chainp cp; + + if (at) { + /* Correct types that we learn on the fly, e.g. + subroutine gotcha(foo) + external foo + call zap(...,foo,...) + call foo(...) + */ + atypes = at->atypes; + n = at->defined ? at->dnargs : at->nargs; + for(i = 0; i++ < n; atypes++) { + if (!(cp = atypes->cp)) + continue; + j = atypes->type; + do { + np = (Namep)cp->datap; + k = np->vtype; + if (np->vclass == CLPROC) { + if (!np->vimpltype && k) + k += 200; + else { + if (j >= 300) + j = TYUNKNOWN + 200; + continue; + } + } + if (j == k) + continue; + if (j >= 300 + || j == 200 && k >= 200) + j = k; + else { + if (at->nargs >= 0) + bad_atypes(at,fname,i,j,k,""," and"); + goto break2; + } + } + while(cp = cp->nextp); + atypes->type = j; + frchain(&atypes->cp); + } + } + break2: + if (parens) { + nice_printf(outfile, parens); + return; + } + + if (!at || (n = at-> defined ? at->dnargs : at->nargs) < 0) { + nice_printf(outfile, Ansi == 1 ? "()" : "(...)"); + return; + } + + if (n == 0) { + nice_printf(outfile, Ansi == 1 ? "(void)" : "()"); + return; + } + + atypes = at->atypes; + nice_printf(outfile, "("); + comma = ""; + for(; --n >= 0; atypes++) { + k = atypes->type; + if (k == TYADDR) + nice_printf(outfile, "%schar **", comma); + else if (k >= 200) { + k -= 200; + if (k >= 100) + k -= 100; + nice_printf(outfile, "%s%s", comma, + usedcasts[k] = casttypes[k]); + } + else if (k >= 100) + nice_printf(outfile, + k == TYCHAR + 100 ? "%s%s *" : "%s%s", + comma, c_type_decl(k-100, 0)); + else + nice_printf(outfile, "%s%s *", comma, + c_type_decl(k, 0)); + comma = ", "; + } + nice_printf(outfile, ")"); + } + + void +#ifdef KR_headers +protowrite(protofile, type, name, e, lengths) + FILE *protofile; + int type; + char *name; + struct Entrypoint *e; + chainp lengths; +#else +protowrite(FILE *protofile, int type, char *name, struct Entrypoint *e, chainp lengths) +#endif +{ + extern char used_rets[]; + int asave; + + if (!(asave = Ansi)) + Castargs = Ansi = 1; + nice_printf(protofile, "extern %s %s", protorettypes[type], name); + list_arg_types(protofile, e, lengths, 0, ";\n"); + used_rets[type] = 1; + if (!(Ansi = asave)) + Castargs = 0; + } + + static void +#ifdef KR_headers +do_p1_1while(outfile) + FILE *outfile; +#else +do_p1_1while(FILE *outfile) +#endif +{ + if (*wh_next) { + nice_printf(outfile, + "for(;;) { /* while(complicated condition) */\n" /*}*/ ); + next_tab(outfile); + } + else + nice_printf(outfile, "while(" /*)*/ ); + } + + static void +#ifdef KR_headers +do_p1_2while(infile, outfile) + FILE *infile; + FILE *outfile; +#else +do_p1_2while(FILE *infile, FILE *outfile) +#endif +{ + expptr test; + + test = do_format(infile, outfile); + if (*wh_next) + nice_printf(outfile, "if (!("); + expr_out(outfile, test); + if (*wh_next++) + nice_printf(outfile, "))\n\tbreak;\n"); + else { + nice_printf(outfile, /*(*/ ") {\n"); + next_tab(outfile); + } + } + + static void +#ifdef KR_headers +do_p1_elseifstart(outfile) + FILE *outfile; +#else +do_p1_elseifstart(FILE *outfile) +#endif +{ /* with sufficiently illegal input, ei_next == ei_last == 0 is possible */ + if (ei_next < ei_last && *ei_next++) { + prev_tab(outfile); + nice_printf(outfile, /*{*/ + "} else /* if(complicated condition) */ {\n" /*}*/ ); + next_tab(outfile); + } + } diff --git a/tools/connec/src/format.h b/tools/connec/src/format.h new file mode 100644 index 0000000..3de97f6 --- /dev/null +++ b/tools/connec/src/format.h @@ -0,0 +1,12 @@ +#define DEF_C_LINE_LENGTH 77 +/* actual max will be 79 */ + +extern int c_output_line_length; /* max # chars per line in C source + code */ + +chainp data_value Argdcl((FILEP, long int, int)); +int do_init_data Argdcl((FILEP, FILEP)); +void list_init_data Argdcl((FILEP*, char*, FILEP)); +char* wr_ardecls Argdcl((FILEP, struct Dimblock*, long int)); +void wr_one_init Argdcl((FILEP, char*, chainp*, int)); +void wr_output_values Argdcl((FILEP, Namep, chainp)); diff --git a/tools/connec/src/format.o b/tools/connec/src/format.o new file mode 100644 index 0000000000000000000000000000000000000000..d6b2d4235823437104a2e2b55c6927dd7c10216b GIT binary patch literal 56560 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/formatdata.c b/tools/connec/src/formatdata.c new file mode 100644 index 0000000..98d6cfd --- /dev/null +++ b/tools/connec/src/formatdata.c @@ -0,0 +1,1263 @@ +/**************************************************************** +Copyright 1990-1, 1993-6, 1999-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" +#include "format.h" + +#define MAX_INIT_LINE 100 +#define VNAME_MAX 64 + +static int memno2info Argdcl((int, Namep*)); + +typedef unsigned long Ulong; + + extern char *initbname; + + void +#ifdef KR_headers +list_init_data(Infile, Inname, outfile) + FILE **Infile; + char *Inname; + FILE *outfile; +#else +list_init_data(FILE **Infile, char *Inname, FILE *outfile) +#endif +{ + FILE *sortfp; + int status; + + fclose(*Infile); + *Infile = 0; + + if (status = dsort(Inname, sortfname)) + fatali ("sort failed, status %d", status); + + scrub(Inname); /* optionally unlink Inname */ + + if ((sortfp = fopen(sortfname, textread)) == NULL) + Fatal("Couldn't open sorted initialization data"); + + do_init_data(outfile, sortfp); + fclose(sortfp); + scrub(sortfname); + +/* Insert a blank line after any initialized data */ + + nice_printf (outfile, "\n"); + + if (debugflag && infname) + /* don't back block data file up -- it won't be overwritten */ + backup(initfname, initbname); +} /* list_init_data */ + + + +/* do_init_data -- returns YES when at least one declaration has been + written */ + + int +#ifdef KR_headers +do_init_data(outfile, infile) + FILE *outfile; + FILE *infile; +#else +do_init_data(FILE *outfile, FILE *infile) +#endif +{ + char varname[VNAME_MAX], ovarname[VNAME_MAX]; + ftnint offset; + ftnint type; + int vargroup; /* 0 --> init, 1 --> equiv, 2 --> common */ + int did_one = 0; /* True when one has been output */ + chainp values = CHNULL; /* Actual data values */ + int keepit = 0; + Namep np; + + ovarname[0] = '\0'; + + while (rdname (infile, &vargroup, varname) && rdlong (infile, &offset) + && rdlong (infile, &type)) { + if (strcmp (varname, ovarname)) { + + /* If this is a new variable name, the old initialization has been + completed */ + + wr_one_init(outfile, ovarname, &values, keepit); + + strcpy (ovarname, varname); + values = CHNULL; + if (vargroup == 0) { + if (memno2info(atoi(varname+2), &np)) { + if (((Addrp)np)->uname_tag != UNAM_NAME) { + err("do_init_data: expected NAME"); + goto Keep; + } + np = ((Addrp)np)->user.name; + } + if (!(keepit = np->visused) && !np->vimpldovar) + warn1("local variable %s never used", + np->fvarname); + } + else { + Keep: + keepit = 1; + } + if (keepit && !did_one) { + nice_printf (outfile, "/* Initialized data */\n\n"); + did_one = YES; + } + } /* if strcmp */ + + values = mkchain((char *)data_value(infile, offset, (int)type), values); + } /* while */ + +/* Write out the last declaration */ + + wr_one_init (outfile, ovarname, &values, keepit); + + return did_one; +} /* do_init_data */ + + + ftnint +#ifdef KR_headers +wr_char_len(outfile, dimp, n, extra1) + FILE *outfile; + struct Dimblock *dimp; + ftnint n; + int extra1; +#else +wr_char_len(FILE *outfile, struct Dimblock *dimp, ftnint n, int extra1) +#endif +{ + int i, nd; + expptr e; + ftnint j, rv; + + if (!dimp) { + nice_printf (outfile, extra1 ? "[%ld+1]" : "[%ld]", (long)n); + return n + extra1; + } + nice_printf(outfile, "[%ld", (long)n); + nd = dimp->ndim; + rv = n; + for(i = 0; i < nd; i++) { + e = dimp->dims[i].dimsize; + if (ISCONST(e)) { + if (ISINT(e->constblock.vtype)) + j = e->constblock.Const.ci; + else if (ISREAL(e->constblock.vtype)) + j = (ftnint)e->constblock.Const.cd[0]; + else + goto non_const; + nice_printf(outfile, "*%ld", j); + rv *= j; + } + else { + non_const: + err ("wr_char_len: nonconstant array size"); + } + } + /* extra1 allows for stupid C compilers that complain about + * too many initializers in + * char x[2] = "ab"; + */ + nice_printf(outfile, extra1 ? "+1]" : "]"); + return extra1 ? rv+1 : rv; + } + + static int ch_ar_dim = -1; /* length of each element of char string array */ + static int eqvmemno; /* kludge */ + + static void +#ifdef KR_headers +write_char_init(outfile, Values, namep) + FILE *outfile; + chainp *Values; + Namep namep; +#else +write_char_init(FILE *outfile, chainp *Values, Namep namep) +#endif +{ + struct Equivblock *eqv; + long size; + struct Dimblock *dimp; + int i, nd, type; + ftnint j; + expptr ds; + + if (!namep) + return; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + eqv = &eqvclass[nequiv]; + eqv->eqvbottom = 0; + type = namep->vtype; + size = type == TYCHAR + ? namep->vleng->constblock.Const.ci + : typesize[type]; + if (dimp = namep->vdim) + for(i = 0, nd = dimp->ndim; i < nd; i++) { + ds = dimp->dims[i].dimsize; + if (ISCONST(ds)) { + if (ISINT(ds->constblock.vtype)) + j = ds->constblock.Const.ci; + else if (ISREAL(ds->constblock.vtype)) + j = (ftnint)ds->constblock.Const.cd[0]; + else + goto non_const; + size *= j; + } + else { + non_const: + err("write_char_values: nonconstant array size"); + } + } + *Values = revchain(*Values); + eqv->eqvtop = size; + eqvmemno = ++lastvarno; + eqv->eqvtype = type; + wr_equiv_init(outfile, nequiv, Values, 0); + def_start(outfile, namep->cvarname, CNULL, ""); + if (type == TYCHAR) + margin_printf(outfile, "((char *)&equiv_%d)\n\n", eqvmemno); + else + margin_printf(outfile, dimp + ? "((%s *)&equiv_%d)\n\n" : "(*(%s *)&equiv_%d)\n\n", + c_type_decl(type,0), eqvmemno); + } + +/* wr_one_init -- outputs the initialization of the variable pointed to + by info. When is_addr is true, info is an Addrp; otherwise, + treat it as a Namep */ + + void +#ifdef KR_headers +wr_one_init(outfile, varname, Values, keepit) + FILE *outfile; + char *varname; + chainp *Values; + int keepit; +#else +wr_one_init(FILE *outfile, char *varname, chainp *Values, int keepit) +#endif +{ + static int memno; + static union { + Namep name; + Addrp addr; + } info; + Namep namep; + int is_addr, size, type; + ftnint last, loc; + int is_scalar = 0; + char *array_comment = NULL, *name; + chainp cp, values; + extern char datachar[]; + static int e1[3] = {1, 0, 1}; + ftnint x; + extern int hsize; + + if (!keepit) + goto done; + if (varname == NULL || varname[1] != '.') + goto badvar; + +/* Get back to a meaningful representation; find the given memno in one + of the appropriate tables (user-generated variables in the hash table, + system-generated variables in a separate list */ + + memno = atoi(varname + 2); + switch(varname[0]) { + case 'q': + /* Must subtract eqvstart when the source file + * contains more than one procedure. + */ + wr_equiv_init(outfile, eqvmemno = memno - eqvstart, Values, 0); + goto done; + case 'Q': + /* COMMON initialization (BLOCK DATA) */ + wr_equiv_init(outfile, memno, Values, 1); + goto done; + case 'v': + break; + default: + badvar: + errstr("wr_one_init: unknown variable name '%s'", varname); + goto done; + } + + is_addr = memno2info (memno, &info.name); + if (info.name == (Namep) NULL) { + err ("wr_one_init -- unknown variable"); + return; + } + if (is_addr) { + if (info.addr -> uname_tag != UNAM_NAME) { + erri ("wr_one_init -- couldn't get name pointer; tag is %d", + info.addr -> uname_tag); + namep = (Namep) NULL; + nice_printf (outfile, " /* bad init data */"); + } else + namep = info.addr -> user.name; + } else + namep = info.name; + + /* check for character initialization */ + + *Values = values = revchain(*Values); + type = info.name->vtype; + if (type == TYCHAR) { + for(last = 0; values; values = values->nextp) { + cp = (chainp)values->datap; + loc = (ftnint)(Addr)cp->datap; + if (loc > last) { + write_char_init(outfile, Values, namep); + goto done; + } + last = (Addr)cp->nextp->datap == TYBLANK + ? loc + (Addr)cp->nextp->nextp->datap + : loc + 1; + } + if (halign && info.name->tag == TNAME) { + nice_printf(outfile, "static struct { %s fill; char val", + halign); + x = wr_char_len(outfile, namep->vdim, ch_ar_dim = + info.name -> vleng -> constblock.Const.ci, 1); + if (x %= hsize) + nice_printf(outfile, "; char fill2[%ld]", hsize - x); + name = info.name->cvarname; + nice_printf(outfile, "; } %s_st = { 0,", name); + wr_output_values(outfile, namep, *Values); + nice_printf(outfile, " };\n"); + ch_ar_dim = -1; + def_start(outfile, name, CNULL, name); + margin_printf(outfile, "_st.val\n"); + goto done; + } + } + else { + size = typesize[type]; + loc = 0; + for(; values; values = values->nextp) { + if ((Addr)((chainp)values->datap)->nextp->datap == TYCHAR) { + write_char_init(outfile, Values, namep); + goto done; + } + last = (long) (((Addr)((chainp) values->datap)->datap) / size); + if (last - loc > 4) { + write_char_init(outfile, Values, namep); + goto done; + } + loc = last; + } + } + values = *Values; + + nice_printf (outfile, "static %s ", c_type_decl (type, 0)); + + if (is_addr) + write_nv_ident (outfile, info.addr); + else + out_name (outfile, info.name); + + if (namep) + is_scalar = namep -> vdim == (struct Dimblock *) NULL; + + if (namep && !is_scalar) + array_comment = type == TYCHAR + ? 0 : wr_ardecls(outfile, namep->vdim, 1L); + + if (type == TYCHAR) + if (ISICON (info.name -> vleng)) + +/* We'll make single strings one character longer, so that we can use the + standard C initialization. All this does is pad an extra zero onto the + end of the string */ + wr_char_len(outfile, namep->vdim, ch_ar_dim = + info.name -> vleng -> constblock.Const.ci, e1[Ansi]); + else + err ("variable length character initialization"); + + if (array_comment) + nice_printf (outfile, "%s", array_comment); + + nice_printf (outfile, " = "); + wr_output_values (outfile, namep, values); + ch_ar_dim = -1; + nice_printf (outfile, ";\n"); + done: + frchain(Values); +} /* wr_one_init */ + + + + + chainp +#ifdef KR_headers +data_value(infile, offset, type) + FILE *infile; + ftnint offset; + int type; +#else +data_value(FILE *infile, ftnint offset, int type) +#endif +{ + char line[MAX_INIT_LINE + 1], *pointer; + chainp vals, prev_val; + char *newval; + + if (fgets (line, MAX_INIT_LINE, infile) == NULL) { + err ("data_value: error reading from intermediate file"); + return CHNULL; + } /* if fgets */ + +/* Get rid of the trailing newline */ + + if (line[0]) + line[strlen (line) - 1] = '\0'; + +#define iswhite(x) (isspace (x) || (x) == ',') + + pointer = line; + prev_val = vals = CHNULL; + + while (*pointer) { + register char *end_ptr, old_val; + +/* Move pointer to the start of the next word */ + + while (*pointer && iswhite (*pointer)) + pointer++; + if (*pointer == '\0') + break; + +/* Move end_ptr to the end of the current word */ + + for (end_ptr = pointer + 1; *end_ptr && !iswhite (*end_ptr); + end_ptr++) + ; + + old_val = *end_ptr; + *end_ptr = '\0'; + +/* Add this value to the end of the list */ + +#ifdef NO_LONG_LONG + if (ONEOF(type, MSKREAL|MSKCOMPLEX)) +#else + if (ONEOF(type, MSKREAL|MSKCOMPLEX|M(TYQUAD))) +#endif + newval = cpstring(pointer); + else + newval = (char *)Atol(pointer); + if (vals) { + prev_val->nextp = mkchain(newval, CHNULL); + prev_val = prev_val -> nextp; + } else + prev_val = vals = mkchain(newval, CHNULL); + *end_ptr = old_val; + pointer = end_ptr; + } /* while *pointer */ + + return mkchain((char *)(Addr)offset, mkchain((char *)(Addr)type, (chainp)(Addr)vals)); +} /* data_value */ + + static void +overlapping(Void) +{ + extern char *filename0; + static int warned = 0; + + if (warned) + return; + warned = 1; + + fprintf(stderr, "Error"); + if (filename0) + fprintf(stderr, " in file %s", filename0); + fprintf(stderr, ": overlapping initializations\n"); + nerr++; + } + + static void make_one_const Argdcl((int, union Constant*, chainp)); + static long charlen; + + void +#ifdef KR_headers +wr_output_values(outfile, namep, values) + FILE *outfile; + Namep namep; + chainp values; +#else +wr_output_values(FILE *outfile, Namep namep, chainp values) +#endif +{ + int type = TYUNKNOWN; + struct Constblock Const; + static expptr Vlen; + + if (namep) + type = namep -> vtype; + +/* Handle array initializations away from scalars */ + + if (namep && namep -> vdim) + wr_array_init (outfile, type, values); + + else if (values->nextp && type != TYCHAR) + overlapping(); + + else { + make_one_const(type, &Const.Const, values); + Const.vtype = type; + Const.vstg = ONEOF(type, MSKREAL|MSKCOMPLEX) != 0; + if (type== TYCHAR) { + if (!Vlen) + Vlen = ICON(0); + Const.vleng = Vlen; + Vlen->constblock.Const.ci = charlen; + out_const (outfile, &Const); + free (Const.Const.ccp); + } + else { +#ifndef NO_LONG_LONG + if (type == TYQUAD) + Const.Const.cd[1] = 123.456; /* kludge */ + /* kludge assumes max(sizeof(char*), */ + /* sizeof(long long)) <= sizeof(double) */ +#endif + out_const (outfile, &Const); + } + } + } + + + void +#ifdef KR_headers +wr_array_init(outfile, type, values) + FILE *outfile; + int type; + chainp values; +#else +wr_array_init(FILE *outfile, int type, chainp values) +#endif +{ + int size = typesize[type]; + long index, main_index = 0; + int k; + + if (type == TYCHAR) { + nice_printf(outfile, "\""); + k = 0; + if (Ansi != 1) + ch_ar_dim = -1; + } + else + nice_printf (outfile, "{ "); + while (values) { + struct Constblock Const; + + index = (long)((Addr)(((chainp) values->datap)->datap) / size); + while (index > main_index) { + +/* Fill with zeros. The structure shorthand works because the compiler + will expand the "0" in braces to fill the size of the entire structure + */ + + switch (type) { + case TYREAL: + case TYDREAL: + nice_printf (outfile, "0.0,"); + break; + case TYCOMPLEX: + case TYDCOMPLEX: + nice_printf (outfile, "{0},"); + break; + case TYCHAR: + nice_printf(outfile, " "); + break; + default: + nice_printf (outfile, "0,"); + break; + } /* switch */ + main_index++; + } /* while index > main_index */ + + if (index < main_index) + overlapping(); + else switch (type) { + case TYCHAR: + { int this_char; + + if (k == ch_ar_dim) { + nice_printf(outfile, "\" \""); + k = 0; + } + this_char = (int)(Addr) ((chainp) values->datap)-> + nextp->nextp->datap; + if ((Addr)((chainp)values->datap)->nextp->datap == TYBLANK) { + main_index += this_char; + k += this_char; + while(--this_char >= 0) + nice_printf(outfile, " "); + values = values -> nextp; + continue; + } + nice_printf(outfile, str_fmt[this_char]); + k++; + } /* case TYCHAR */ + break; + +#ifdef TYQUAD + case TYQUAD: +#ifndef NO_LONG_LONG + Const.Const.cd[1] = 123.456; +#endif +#endif + case TYINT1: + case TYSHORT: + case TYLONG: + case TYREAL: + case TYDREAL: + case TYLOGICAL: + case TYLOGICAL1: + case TYLOGICAL2: + case TYCOMPLEX: + case TYDCOMPLEX: + make_one_const(type, &Const.Const, values); + Const.vtype = type; + Const.vstg = ONEOF(type, MSKREAL|MSKCOMPLEX) != 0; + out_const(outfile, &Const); + break; + default: + erri("wr_array_init: bad type '%d'", type); + break; + } /* switch */ + values = values->nextp; + + main_index++; + if (values && type != TYCHAR) + nice_printf (outfile, ","); + } /* while values */ + + if (type == TYCHAR) { + nice_printf(outfile, "\""); + } + else + nice_printf (outfile, " }"); +} /* wr_array_init */ + + + static void +#ifdef KR_headers +make_one_const(type, storage, values) + int type; + union Constant *storage; + chainp values; +#else +make_one_const(int type, union Constant *storage, chainp values) +#endif +{ + union Constant *Const; + register char **L; + + if (type == TYCHAR) { + char *str, *str_ptr; + chainp v, prev; + int b = 0, k, main_index = 0; + +/* Find the max length of init string, by finding the highest offset + value stored in the list of initial values */ + + for(k = 1, prev = CHNULL, v = values; v; prev = v, v = v->nextp) + ; + if (prev != CHNULL) + k = ((int)(Addr) (((chainp) prev->datap)->datap)) + 2; + /* + 2 above for null char at end */ + str = Alloc (k); + for (str_ptr = str; values; str_ptr++) { + int index = (int)(Addr) (((chainp) values->datap)->datap); + + if (index < main_index) + overlapping(); + while (index > main_index++) + *str_ptr++ = ' '; + + k = (int)(Addr)(((chainp)values->datap)->nextp->nextp->datap); + if ((Addr)((chainp)values->datap)->nextp->datap == TYBLANK) { + b = k; + break; + } + *str_ptr = (char)k; + values = values -> nextp; + } /* for str_ptr */ + *str_ptr = '\0'; + Const = storage; + Const -> ccp = str; + Const -> ccp1.blanks = b; + charlen = str_ptr - str; + } else { + int i = 0; + chainp vals; + + vals = ((chainp)values->datap)->nextp->nextp; + if (vals) { + L = (char **)storage; + do L[i++] = vals->datap; + while(vals = vals->nextp); + } + + } /* else */ + +} /* make_one_const */ + + + int +#ifdef KR_headers +rdname(infile, vargroupp, name) + FILE *infile; + int *vargroupp; + char *name; +#else +rdname(FILE *infile, int *vargroupp, char *name) +#endif +{ + register int i, c; + + c = getc (infile); + + if (feof (infile)) + return NO; + + *vargroupp = c - '0'; + for (i = 1;; i++) { + if (i >= VNAME_MAX) + Fatal("rdname: oversize name"); + c = getc (infile); + if (feof (infile)) + return NO; + if (c == '\t') + break; + *name++ = c; + } + *name = 0; + return YES; +} /* rdname */ + + int +#ifdef KR_headers +rdlong(infile, n) + FILE *infile; + ftnint *n; +#else +rdlong(FILE *infile, ftnint *n) +#endif +{ + register int c; + + for (c = getc (infile); !feof (infile) && isspace (c); c = getc (infile)) + ; + + if (feof (infile)) + return NO; + + for (*n = 0; isdigit (c); c = getc (infile)) + *n = 10 * (*n) + c - '0'; + return YES; +} /* rdlong */ + + + static int +#ifdef KR_headers +memno2info(memno, info) + int memno; + Namep *info; +#else +memno2info(int memno, Namep *info) +#endif +{ + chainp this_var; + extern chainp new_vars; + extern struct Hashentry *hashtab, *lasthash; + struct Hashentry *entry; + + for (this_var = new_vars; this_var; this_var = this_var -> nextp) { + Addrp var = (Addrp) this_var->datap; + + if (var == (Addrp) NULL) + Fatal("memno2info: null variable"); + else if (var -> tag != TADDR) + Fatal("memno2info: bad tag"); + if (memno == var -> memno) { + *info = (Namep) var; + return 1; + } /* if memno == var -> memno */ + } /* for this_var = new_vars */ + + for (entry = hashtab; entry < lasthash; ++entry) { + Namep var = entry -> varp; + + if (var && var -> vardesc.varno == memno && var -> vstg == STGINIT) { + *info = (Namep) var; + return 0; + } /* if entry -> vardesc.varno == memno */ + } /* for entry = hashtab */ + + Fatal("memno2info: couldn't find memno"); + return 0; +} /* memno2info */ + + static chainp +#ifdef KR_headers +do_string(outfile, v, nloc) + FILE *outfile; + register chainp v; + ftnint *nloc; +#else +do_string(FILE *outfile, register chainp v, ftnint *nloc) +#endif +{ + register chainp cp, v0; + ftnint dloc, k, loc; + unsigned long uk; + char buf[8], *comma; + + nice_printf(outfile, "{"); + cp = (chainp)v->datap; + loc = (ftnint)(Addr)cp->datap; + comma = ""; + for(v0 = v;;) { + switch((Addr)cp->nextp->datap) { + case TYBLANK: + k = (ftnint)(Addr)cp->nextp->nextp->datap; + loc += k; + while(--k >= 0) { + nice_printf(outfile, "%s' '", comma); + comma = ", "; + } + break; + case TYCHAR: + uk = (ftnint)(Addr)cp->nextp->nextp->datap; + sprintf(buf, chr_fmt[uk], uk); + nice_printf(outfile, "%s'%s'", comma, buf); + comma = ", "; + loc++; + break; + default: + goto done; + } + v0 = v; + if (!(v = v->nextp) || !(cp = (chainp)v->datap)) + break; + dloc = (ftnint)(Addr)cp->datap; + if (loc != dloc) + break; + } + done: + nice_printf(outfile, "}"); + *nloc = loc; + return v0; + } + + static chainp +#ifdef KR_headers +Ado_string(outfile, v, nloc) + FILE *outfile; + register chainp v; + ftnint *nloc; +#else +Ado_string(FILE *outfile, register chainp v, ftnint *nloc) +#endif +{ + register chainp cp, v0; + ftnint dloc, k, loc; + + nice_printf(outfile, "\""); + cp = (chainp)v->datap; + loc = (ftnint)(Addr)cp->datap; + for(v0 = v;;) { + switch((Addr)cp->nextp->datap) { + case TYBLANK: + k = (ftnint)(Addr)cp->nextp->nextp->datap; + loc += k; + while(--k >= 0) + nice_printf(outfile, " "); + break; + case TYCHAR: + k = (ftnint)(Addr)cp->nextp->nextp->datap; + nice_printf(outfile, str_fmt[k]); + loc++; + break; + default: + goto done; + } + v0 = v; + if (!(v = v->nextp) || !(cp = (chainp)v->datap)) + break; + dloc = (ftnint)(Addr)cp->datap; + if (loc != dloc) + break; + } + done: + nice_printf(outfile, "\""); + *nloc = loc; + return v0; + } + + static char * +#ifdef KR_headers +Len(L, type) + long L; + int type; +#else +Len(long L, int type) +#endif +{ + static char buf[24]; + if (L == 1 && type != TYCHAR) + return ""; + sprintf(buf, "[%ld]", L); + return buf; + } + + static void +#ifdef KR_headers +fill_dcl(outfile, t, k, L) FILE *outfile; int t; int k; ftnint L; +#else +fill_dcl(FILE *outfile, int t, int k, ftnint L) +#endif +{ + nice_printf(outfile, "%s fill_%d[%ld];\n", Typename[t], k, L); + } + + static int +#ifdef KR_headers +fill_type(L, loc, xtype) ftnint L; ftnint loc; int xtype; +#else +fill_type(ftnint L, ftnint loc, int xtype) +#endif +{ + int ft, ft1, szshort; + + if (xtype == TYCHAR) + return xtype; + szshort = typesize[TYSHORT]; + ft = L % szshort ? TYCHAR : type_choice[L/szshort % 4]; + ft1 = loc % szshort ? TYCHAR : type_choice[loc/szshort % 4]; + if (typesize[ft] > typesize[ft1]) + ft = ft1; + return ft; + } + + static ftnint +#ifdef KR_headers +get_fill(dloc, loc, t0, t1, L0, L1, xtype) ftnint dloc; ftnint loc; int *t0; int *t1; ftnint *L0; ftnint *L1; int xtype; +#else +get_fill(ftnint dloc, ftnint loc, int *t0, int *t1, ftnint *L0, ftnint *L1, int xtype) +#endif +{ + ftnint L, L2, loc0; + + if (L = loc % typesize[xtype]) { + loc0 = loc; + loc += L = typesize[xtype] - L; + if (L % typesize[TYSHORT]) + *t0 = TYCHAR; + else + L /= typesize[*t0 = fill_type(L, loc0, xtype)]; + } + if (dloc < loc + typesize[xtype]) + return 0; + *L0 = L; + L2 = (dloc - loc) / typesize[xtype]; + loc += L2*typesize[xtype]; + if (dloc -= loc) + dloc /= typesize[*t1 = fill_type(dloc, loc, xtype)]; + *L1 = dloc; + return L2; + } + + void +#ifdef KR_headers +wr_equiv_init(outfile, memno, Values, iscomm) + FILE *outfile; + int memno; + chainp *Values; + int iscomm; +#else +wr_equiv_init(FILE *outfile, int memno, chainp *Values, int iscomm) +#endif +{ + struct Equivblock *eqv; + int btype, curtype, dtype, filltype, j, k, n, t0, t1; + int wasblank, xfilled, xtype; + static char Blank[] = ""; + register char *comma = Blank; + register chainp cp, v; + chainp sentinel, values, v1, vlast; + ftnint L, L0, L1, L2, dL, dloc, loc, loc0; + union Constant Const; + char imag_buf[50], real_buf[50]; + int szshort = typesize[TYSHORT]; + static char typepref[] = {0, 0, TYINT1, TYSHORT, TYLONG, +#ifdef TYQUAD + TYQUAD, +#endif + TYREAL, TYDREAL, TYREAL, TYDREAL, + TYLOGICAL1, TYLOGICAL2, + TYLOGICAL, TYCHAR}; + static char basetype[] = {0, 0, TYCHAR, TYSHORT, TYLONG, +#ifdef TYQUAD + TYDREAL, +#endif + TYLONG, TYDREAL, TYLONG, TYDREAL, + TYCHAR, TYSHORT, + TYLONG, TYCHAR, 0 /* for TYBLANK */ }; + extern int htype; + char *z; + + /* add sentinel */ + if (iscomm) { + L = extsymtab[memno].maxleng; + xtype = extsymtab[memno].extype; + } + else { + eqv = &eqvclass[memno]; + L = eqv->eqvtop - eqv->eqvbottom; + xtype = eqv->eqvtype; + } + + if (halign && typealign[typepref[xtype]] < typealign[htype]) + xtype = htype; + xtype = typepref[xtype]; + *Values = values = revchain(vlast = *Values); + + xfilled = 2; + if (xtype != TYCHAR) { + + /* unless the data include a value of the appropriate + * type, we add an extra element in an attempt + * to force correct alignment */ + + btype = basetype[xtype]; + loc = 0; + for(v = *Values;;v = v->nextp) { + if (!v) { + dtype = typepref[xtype]; + z = ISREAL(dtype) ? cpstring("0.") : (char *)0; + k = typesize[dtype]; + if (j = (int)(L % k)) + L += k - j; + v = mkchain((char *)(Addr)L, + mkchain((char *)(Addr)dtype, + mkchain(z, CHNULL))); + vlast = vlast->nextp = + mkchain((char *)v, CHNULL); + L += k; + break; + } + cp = (chainp)v->datap; + if (basetype[(Addr)cp->nextp->datap] == btype) + break; + dloc = (ftnint)(Addr)cp->datap; + if (get_fill(dloc, loc, &t0, &t1, &L0, &L1, xtype)) { + xfilled = 0; + break; + } + L1 = dloc - loc; + if (L1 > 0 + && !(L1 % szshort) + && !(loc % szshort) + && btype <= type_choice[L1/szshort % 4] + && btype <= type_choice[loc/szshort % 4]) + break; + dtype = (int)(Addr)cp->nextp->datap; + loc = dloc + (dtype == TYBLANK + ? (ftnint)(Addr)cp->nextp->nextp->datap + : typesize[dtype]); + } + } + sentinel = mkchain((char *)(Addr)L, mkchain((char *)(Addr)TYERROR,CHNULL)); + vlast->nextp = mkchain((char *)sentinel, CHNULL); + + /* use doublereal fillers only if there are doublereal values */ + + k = TYLONG; + for(v = values; v; v = v->nextp) + if (ONEOF((Addr)((chainp)v->datap)->nextp->datap, + M(TYDREAL)|M(TYDCOMPLEX))) { + k = TYDREAL; + break; + } + type_choice[0] = k; + + nice_printf(outfile, "%sstruct {\n", iscomm ? "" : "static "); + next_tab(outfile); + loc = loc0 = k = 0; + curtype = -1; + for(v = values; v; v = v->nextp) { + cp = (chainp)v->datap; + dloc = (ftnint)(Addr)cp->datap; + L = dloc - loc; + if (L < 0) { + overlapping(); + if ((Addr)cp->nextp->datap != TYERROR) { + v1 = cp; + frchain(&v1); + v->datap = 0; + } + continue; + } + dtype = (int)(Addr)cp->nextp->datap; + if (dtype == TYBLANK) { + dtype = TYCHAR; + wasblank = 1; + } + else + wasblank = 0; + if (curtype != dtype || L > 0) { + if (curtype != -1) { + L1 = (loc - loc0)/dL; + nice_printf(outfile, "%s e_%d%s;\n", + Typename[curtype], ++k, + Len(L1,curtype)); + } + curtype = dtype; + loc0 = dloc; + } + if (L > 0) { + filltype = fill_type(L, loc, xtype); + L1 = L / typesize[filltype]; + if (!xfilled && (L2 = get_fill(dloc, loc, &t0, &t1, + &L0, &L1, xtype))) { + xfilled = 1; + if (L0) + fill_dcl(outfile, t0, ++k, L0); + fill_dcl(outfile, xtype, ++k, L2); + if (L1) + fill_dcl(outfile, t1, ++k, L1); + } + else + fill_dcl(outfile, filltype, ++k, L1); + loc = dloc; + } + if (wasblank) { + loc += (ftnint)(Addr)cp->nextp->nextp->datap; + dL = 1; + } + else { + dL = typesize[dtype]; + loc += dL; + } + } + nice_printf(outfile, "} %s = { ", iscomm + ? extsymtab[memno].cextname + : equiv_name(eqvmemno, CNULL)); + loc = 0; + xfilled &= 2; + for(v = values; ; v = v->nextp) { + cp = (chainp)v->datap; + if (!cp) + continue; + dtype = (int)(Addr)cp->nextp->datap; + if (dtype == TYERROR) + break; + dloc = (ftnint)(Addr)cp->datap; + if (dloc > loc) { + n = 1; + if (!xfilled && (L2 = get_fill(dloc, loc, &t0, &t1, + &L0, &L1, xtype))) { + xfilled = 1; + if (L0) + n = 2; + if (L1) + n++; + } + while(n--) { + nice_printf(outfile, "%s{0}", comma); + comma = ", "; + } + loc = dloc; + } + if (comma != Blank) + nice_printf(outfile, ", "); + comma = ", "; + if (dtype == TYCHAR || dtype == TYBLANK) { + v = Ansi == 1 ? Ado_string(outfile, v, &loc) + : do_string(outfile, v, &loc); + continue; + } + make_one_const(dtype, &Const, v); + switch(dtype) { + case TYLOGICAL: + case TYLOGICAL2: + case TYLOGICAL1: + if (Const.ci < 0 || Const.ci > 1) + errl( + "wr_equiv_init: unexpected logical value %ld", + Const.ci); + nice_printf(outfile, + Const.ci ? "TRUE_" : "FALSE_"); + break; + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + nice_printf(outfile, "%ld", Const.ci); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + nice_printf(outfile, "%s", Const.cds[0]); + break; +#endif + case TYREAL: + nice_printf(outfile, "%s", + flconst(real_buf, Const.cds[0])); + break; + case TYDREAL: + nice_printf(outfile, "%s", Const.cds[0]); + break; + case TYCOMPLEX: + nice_printf(outfile, "%s, %s", + flconst(real_buf, Const.cds[0]), + flconst(imag_buf, Const.cds[1])); + break; + case TYDCOMPLEX: + nice_printf(outfile, "%s, %s", + Const.cds[0], Const.cds[1]); + break; + default: + erri("unexpected type %d in wr_equiv_init", + dtype); + } + loc += typesize[dtype]; + } + nice_printf(outfile, " };\n\n"); + prev_tab(outfile); + frchain(&sentinel); + } diff --git a/tools/connec/src/formatdata.o b/tools/connec/src/formatdata.o new file mode 100644 index 0000000000000000000000000000000000000000..2dac585901a9eaeaf06206e2cb31a3613974cbbe GIT binary patch literal 28984 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 PpDzcz+f+h%x2OLfU#zJF literal 0 HcmV?d00001 diff --git a/tools/connec/src/ftypes.h b/tools/connec/src/ftypes.h new file mode 100644 index 0000000..b023b06 --- /dev/null +++ b/tools/connec/src/ftypes.h @@ -0,0 +1,78 @@ + +/* variable types (stored in the vtype field of expptr) + * numeric assumptions: + * int < reals < complexes + * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX + */ + +#undef TYQUAD0 +#ifdef NO_TYQUAD +#undef TYQUAD +#define TYQUAD_inc 0 +#undef NO_LONG_LONG +#define NO_LONG_LONG +#else +#define TYQUAD 5 +#define TYQUAD_inc 1 +#ifdef NO_LONG_LONG +#define TYQUAD0 +#else +#ifndef Llong +typedef long long Llong; +#endif +#ifndef ULlong +typedef unsigned long long ULlong; +#endif +#endif /*NO_LONG_LONG*/ +#endif /*NO_TYQUAD*/ + +#ifdef _WIN64 +#define USE_LONGLONG +#endif + +#ifdef USE_LONGLONG +typedef unsigned long long Addr; +#define Addrfmt "%llx" +#define Atol atoll +#else +typedef unsigned long Addr; +#define Addrfmt "%lx" +#define Atol atol +#endif + +#define TYUNKNOWN 0 +#define TYADDR 1 +#define TYINT1 2 +#define TYSHORT 3 +#define TYLONG 4 +/* #define TYQUAD 5 */ +#define TYREAL (5+TYQUAD_inc) +#define TYDREAL (6+TYQUAD_inc) +#define TYCOMPLEX (7+TYQUAD_inc) +#define TYDCOMPLEX (8+TYQUAD_inc) +#define TYLOGICAL1 (9+TYQUAD_inc) +#define TYLOGICAL2 (10+TYQUAD_inc) +#define TYLOGICAL (11+TYQUAD_inc) +#define TYCHAR (12+TYQUAD_inc) +#define TYSUBR (13+TYQUAD_inc) +#define TYERROR (14+TYQUAD_inc) +#define TYCILIST (15+TYQUAD_inc) +#define TYICILIST (16+TYQUAD_inc) +#define TYOLIST (17+TYQUAD_inc) +#define TYCLLIST (18+TYQUAD_inc) +#define TYALIST (19+TYQUAD_inc) +#define TYINLIST (20+TYQUAD_inc) +#define TYVOID (21+TYQUAD_inc) +#define TYLABEL (22+TYQUAD_inc) +#define TYFTNLEN (23+TYQUAD_inc) +/* TYVOID is not in any tables. */ + +/* NTYPES, NTYPES0 -- Total number of types, used to allocate tables indexed by + type. Such tables can include the size (in bytes) of objects of a given + type, or labels for returning objects of different types from procedures + (see array rtvlabels) */ + +#define NTYPES TYVOID +#define NTYPES0 TYCILIST +#define TYBLANK TYSUBR /* Huh? */ + diff --git a/tools/connec/src/gram.c b/tools/connec/src/gram.c new file mode 100644 index 0000000..16d524e --- /dev/null +++ b/tools/connec/src/gram.c @@ -0,0 +1,1957 @@ +#define SEOS 1 +#define SCOMMENT 2 +#define SLABEL 3 +#define SUNKNOWN 4 +#define SHOLLERITH 5 +#define SICON 6 +#define SRCON 7 +#define SDCON 8 +#define SBITCON 9 +#define SOCTCON 10 +#define SHEXCON 11 +#define STRUE 12 +#define SFALSE 13 +#define SNAME 14 +#define SNAMEEQ 15 +#define SFIELD 16 +#define SSCALE 17 +#define SINCLUDE 18 +#define SLET 19 +#define SASSIGN 20 +#define SAUTOMATIC 21 +#define SBACKSPACE 22 +#define SBLOCK 23 +#define SCALL 24 +#define SCHARACTER 25 +#define SCLOSE 26 +#define SCOMMON 27 +#define SCOMPLEX 28 +#define SCONTINUE 29 +#define SDATA 30 +#define SDCOMPLEX 31 +#define SDIMENSION 32 +#define SDO 33 +#define SDOUBLE 34 +#define SELSE 35 +#define SELSEIF 36 +#define SEND 37 +#define SENDFILE 38 +#define SENDIF 39 +#define SENTRY 40 +#define SEQUIV 41 +#define SEXTERNAL 42 +#define SFORMAT 43 +#define SFUNCTION 44 +#define SGOTO 45 +#define SASGOTO 46 +#define SCOMPGOTO 47 +#define SARITHIF 48 +#define SLOGIF 49 +#define SIMPLICIT 50 +#define SINQUIRE 51 +#define SINTEGER 52 +#define SINTRINSIC 53 +#define SLOGICAL 54 +#define SNAMELIST 55 +#define SOPEN 56 +#define SPARAM 57 +#define SPAUSE 58 +#define SPRINT 59 +#define SPROGRAM 60 +#define SPUNCH 61 +#define SREAD 62 +#define SREAL 63 +#define SRETURN 64 +#define SREWIND 65 +#define SSAVE 66 +#define SSTATIC 67 +#define SSTOP 68 +#define SSUBROUTINE 69 +#define STHEN 70 +#define STO 71 +#define SUNDEFINED 72 +#define SWRITE 73 +#define SLPAR 74 +#define SRPAR 75 +#define SEQUALS 76 +#define SCOLON 77 +#define SCOMMA 78 +#define SCURRENCY 79 +#define SPLUS 80 +#define SMINUS 81 +#define SSTAR 82 +#define SSLASH 83 +#define SPOWER 84 +#define SCONCAT 85 +#define SAND 86 +#define SOR 87 +#define SNEQV 88 +#define SEQV 89 +#define SNOT 90 +#define SEQ 91 +#define SLT 92 +#define SGT 93 +#define SLE 94 +#define SGE 95 +#define SNE 96 +#define SENDDO 97 +#define SWHILE 98 +#define SSLASHD 99 +#define SBYTE 100 + +/* #line 125 "/n/bopp/v5/dmg/f2c/gram.in" */ +#include "defs.h" +#include "p1defs.h" + +static int nstars; /* Number of labels in an + alternate return CALL */ +static int datagripe; +static int ndim; +static int vartype; +int new_dcl; +static ftnint varleng; +static struct Dims dims[MAXDIM+1]; +extern struct Labelblock **labarray; /* Labels in an alternate + return CALL */ +extern int maxlablist; + +/* The next two variables are used to verify that each statement might be reached + during runtime. lastwasbranch is tested only in the defintion of the + stat: nonterminal. */ + +int lastwasbranch = NO; +static int thiswasbranch = NO; +extern ftnint yystno; +extern flag intonly; +static chainp datastack; +extern long laststfcn, thisstno; +extern int can_include; /* for netlib */ +extern void endcheck Argdcl((void)); +extern struct Primblock *primchk Argdcl((expptr)); + +#define ESNULL (Extsym *)0 +#define NPNULL (Namep)0 +#define LBNULL (struct Listblock *)0 + + static void +pop_datastack(Void) { + chainp d0 = datastack; + if (d0->datap) + curdtp = (chainp)d0->datap; + datastack = d0->nextp; + d0->nextp = 0; + frchain(&d0); + } + + +/* #line 172 "/n/bopp/v5/dmg/f2c/gram.in" */ +typedef union { + int ival; + ftnint lval; + char *charpval; + chainp chval; + tagptr tagval; + expptr expval; + struct Labelblock *labval; + struct Nameblock *namval; + struct Eqvchain *eqvval; + Extsym *extval; + } YYSTYPE; +extern int yyerrflag; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif +YYSTYPE yylval; +YYSTYPE yyval; +#define YYEOFCODE 1 +#define YYERRCODE 2 +short yyexca[] = +{-1, 1, + 1, -1, + -2, 0, +-1, 20, + 4, 38, + -2, 231, +-1, 24, + 4, 42, + -2, 231, +-1, 151, + 4, 247, + -2, 189, +-1, 175, + 4, 269, + 81, 269, + -2, 189, +-1, 225, + 80, 174, + -2, 140, +-1, 246, + 77, 231, + -2, 228, +-1, 273, + 4, 290, + -2, 144, +-1, 277, + 4, 299, + 81, 299, + -2, 146, +-1, 330, + 80, 175, + -2, 142, +-1, 360, + 4, 271, + 17, 271, + 77, 271, + 81, 271, + -2, 190, +-1, 439, + 94, 0, + 95, 0, + 96, 0, + 97, 0, + 98, 0, + 99, 0, + -2, 154, +-1, 456, + 4, 293, + 81, 293, + -2, 144, +-1, 458, + 4, 295, + 81, 295, + -2, 144, +-1, 460, + 4, 297, + 81, 297, + -2, 144, +-1, 462, + 4, 300, + 81, 300, + -2, 145, +-1, 506, + 81, 293, + -2, 144, +}; +#define YYNPROD 305 +#define YYPRIVATE 57344 +#define YYLAST 1455 +short yyact[] = +{ + 239, 359, 474, 306, 416, 427, 299, 389, 473, 267, + 315, 231, 400, 358, 318, 415, 328, 253, 319, 100, + 224, 297, 294, 280, 402, 401, 305, 117, 185, 265, + 17, 122, 204, 275, 196, 191, 202, 203, 119, 129, + 107, 271, 200, 184, 112, 104, 338, 102, 166, 167, + 336, 337, 338, 344, 343, 342, 121, 157, 120, 345, + 347, 346, 349, 348, 350, 261, 276, 336, 337, 338, + 131, 132, 133, 134, 104, 136, 539, 158, 399, 158, + 313, 166, 167, 336, 337, 338, 344, 343, 342, 341, + 340, 311, 345, 347, 346, 349, 348, 350, 399, 398, + 105, 514, 115, 537, 166, 167, 336, 337, 338, 344, + 343, 342, 341, 340, 238, 345, 347, 346, 349, 348, + 350, 106, 130, 104, 478, 211, 187, 188, 412, 320, + 259, 260, 261, 411, 95, 166, 167, 336, 337, 338, + 186, 213, 296, 212, 194, 486, 195, 542, 245, 96, + 97, 98, 527, 104, 529, 158, 523, 449, 258, 158, + 241, 243, 484, 101, 487, 485, 216, 274, 471, 222, + 217, 472, 221, 158, 483, 465, 430, 220, 166, 167, + 259, 260, 261, 262, 158, 166, 167, 336, 337, 338, + 344, 156, 121, 156, 120, 464, 345, 347, 346, 349, + 348, 350, 463, 373, 281, 282, 283, 236, 104, 232, + 242, 242, 249, 101, 292, 301, 263, 468, 290, 302, + 279, 296, 291, 288, 289, 166, 167, 259, 260, 261, + 264, 317, 455, 335, 189, 351, 312, 310, 446, 453, + 431, 284, 425, 335, 166, 167, 259, 260, 261, 262, + 258, 466, 325, 158, 467, 450, 380, 99, 449, 158, + 158, 158, 158, 158, 258, 258, 357, 379, 269, 156, + 234, 420, 266, 156, 421, 409, 393, 335, 410, 394, + 361, 333, 323, 362, 334, 258, 378, 156, 270, 208, + 326, 101, 330, 178, 113, 332, 374, 111, 156, 375, + 376, 403, 352, 110, 109, 108, 354, 355, 385, 386, + 363, 356, 384, 225, 377, 425, 367, 368, 369, 370, + 371, 422, 223, 364, 335, 538, 391, 335, 534, 533, + 532, 335, 423, 335, 372, 413, 408, 395, 390, 166, + 167, 259, 260, 261, 262, 381, 434, 528, 531, 526, + 494, 429, 237, 335, 496, 335, 335, 335, 104, 104, + 490, 298, 138, 158, 258, 335, 448, 156, 258, 258, + 258, 258, 258, 156, 156, 156, 156, 156, 251, 192, + 451, 103, 335, 454, 309, 277, 277, 360, 287, 426, + 118, 352, 166, 167, 259, 260, 261, 262, 137, 387, + 403, 232, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 477, 247, 469, 406, 482, 470, 308, 269, + 452, 166, 167, 336, 337, 338, 344, 335, 479, 155, + 244, 155, 488, 228, 225, 499, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 335, 383, 497, 273, 273, + 495, 502, 201, 258, 150, 151, 214, 175, 103, 103, + 103, 103, 501, 190, 475, 454, 210, 172, 193, 142, + 503, 197, 198, 199, 504, 510, 335, 156, 207, 403, + 277, 513, 507, 508, 509, 331, 277, 482, 517, 489, + 335, 520, 492, 335, 197, 218, 219, 242, 498, 335, + 525, 519, 518, 516, 515, 524, 353, 155, 404, 512, + 246, 155, 248, 104, 406, 417, 30, 535, 406, 511, + 390, 209, 213, 335, 227, 155, 268, 93, 6, 541, + 250, 335, 171, 173, 177, 82, 155, 335, 4, 475, + 81, 335, 5, 273, 543, 80, 457, 459, 461, 382, + 124, 79, 103, 174, 304, 295, 307, 522, 78, 77, + 76, 60, 49, 242, 48, 45, 424, 322, 33, 114, + 530, 118, 206, 316, 414, 321, 205, 397, 396, 300, + 197, 536, 481, 135, 215, 392, 277, 277, 277, 314, + 540, 116, 26, 406, 25, 353, 24, 23, 22, 21, + 388, 286, 9, 8, 7, 155, 2, 404, 303, 20, + 165, 155, 155, 155, 155, 155, 51, 491, 293, 268, + 230, 329, 268, 268, 166, 167, 336, 337, 338, 344, + 343, 457, 459, 461, 327, 345, 347, 346, 349, 348, + 350, 418, 92, 256, 53, 339, 19, 55, 37, 456, + 458, 460, 226, 3, 1, 0, 0, 0, 0, 0, + 0, 307, 0, 405, 197, 0, 0, 0, 0, 0, + 0, 277, 277, 277, 419, 0, 0, 0, 353, 0, + 321, 0, 0, 0, 0, 0, 404, 0, 0, 0, + 493, 0, 0, 0, 432, 166, 167, 336, 337, 338, + 344, 343, 342, 341, 340, 0, 345, 347, 346, 349, + 348, 350, 0, 0, 0, 155, 0, 500, 0, 0, + 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, + 0, 0, 462, 0, 506, 458, 460, 166, 167, 336, + 337, 338, 344, 343, 342, 341, 340, 0, 345, 347, + 346, 349, 348, 350, 0, 0, 0, 295, 0, 0, + 0, 0, 405, 480, 0, 307, 405, 0, 0, 447, + 0, 0, 0, 0, 166, 167, 336, 337, 338, 344, + 343, 342, 341, 340, 316, 345, 347, 346, 349, 348, + 350, 0, 0, 445, 0, 0, 0, 0, 166, 167, + 336, 337, 338, 344, 343, 342, 341, 340, 268, 345, + 347, 346, 349, 348, 350, 0, 0, 0, 505, 0, + 0, 0, 0, 0, 0, 0, 505, 505, 505, 0, + 0, 0, 0, 0, 0, 0, 307, 12, 0, 0, + 0, 405, 0, 0, 0, 0, 505, 0, 0, 0, + 521, 10, 56, 46, 73, 86, 14, 61, 70, 91, + 38, 66, 47, 42, 68, 72, 31, 67, 35, 34, + 11, 88, 36, 18, 41, 39, 28, 16, 57, 58, + 59, 50, 54, 43, 89, 64, 40, 69, 44, 90, + 29, 62, 85, 13, 0, 83, 65, 52, 87, 27, + 74, 63, 15, 433, 0, 71, 84, 0, 166, 167, + 336, 337, 338, 344, 343, 342, 341, 340, 0, 345, + 347, 346, 349, 348, 350, 0, 0, 0, 0, 0, + 32, 0, 0, 75, 166, 167, 336, 337, 338, 344, + 343, 342, 341, 340, 0, 345, 347, 346, 349, 348, + 350, 73, 0, 0, 0, 70, 0, 0, 66, 0, + 0, 68, 72, 0, 67, 161, 162, 163, 164, 170, + 169, 168, 159, 160, 104, 0, 0, 0, 0, 0, + 0, 0, 64, 0, 69, 0, 0, 0, 0, 0, + 0, 0, 0, 65, 0, 0, 0, 74, 0, 0, + 0, 0, 71, 161, 162, 163, 164, 170, 169, 168, + 159, 160, 104, 0, 161, 162, 163, 164, 170, 169, + 168, 159, 160, 104, 0, 0, 0, 0, 0, 0, + 75, 0, 0, 0, 235, 0, 0, 0, 0, 0, + 166, 167, 365, 0, 366, 0, 0, 0, 0, 0, + 240, 161, 162, 163, 164, 170, 169, 168, 159, 160, + 104, 0, 161, 162, 163, 164, 170, 169, 168, 159, + 160, 104, 235, 229, 0, 0, 0, 0, 166, 167, + 233, 0, 0, 235, 0, 0, 0, 0, 240, 166, + 167, 476, 0, 0, 0, 0, 0, 0, 0, 240, + 161, 162, 163, 164, 170, 169, 168, 159, 160, 104, + 161, 162, 163, 164, 170, 169, 168, 159, 160, 104, + 235, 0, 0, 0, 0, 0, 166, 167, 233, 0, + 0, 235, 0, 0, 0, 0, 240, 166, 167, 428, + 0, 0, 0, 0, 0, 0, 0, 240, 161, 162, + 163, 164, 170, 169, 168, 159, 160, 104, 0, 161, + 162, 163, 164, 170, 169, 168, 159, 160, 104, 278, + 0, 0, 0, 272, 0, 166, 167, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 161, 162, 163, 164, + 170, 169, 168, 159, 160, 104, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 161, 162, 163, 164, + 170, 169, 168, 159, 160, 104, 257, 235, 0, 0, + 0, 0, 0, 166, 167, 0, 0, 0, 278, 0, + 0, 0, 0, 240, 166, 167, 0, 123, 0, 0, + 126, 127, 128, 0, 240, 0, 0, 0, 0, 0, + 0, 0, 139, 140, 0, 324, 141, 0, 143, 144, + 145, 166, 167, 146, 147, 148, 0, 149, 0, 0, + 0, 240, 0, 0, 0, 252, 0, 0, 0, 0, + 0, 166, 167, 254, 0, 255, 0, 179, 180, 181, + 182, 183, 161, 162, 163, 164, 170, 169, 168, 159, + 160, 104, 0, 161, 162, 163, 164, 170, 169, 168, + 159, 160, 104, 161, 162, 163, 164, 170, 169, 168, + 159, 160, 104, 161, 162, 163, 164, 170, 169, 168, + 159, 160, 104, 161, 162, 163, 164, 170, 169, 168, + 159, 160, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 154, 0, 0, 0, 0, 0, 166, 167, 152, + 0, 153, 252, 0, 0, 0, 0, 0, 166, 167, + 285, 0, 154, 0, 0, 0, 0, 0, 166, 167, + 176, 0, 407, 0, 0, 0, 0, 0, 166, 167, + 56, 46, 252, 86, 0, 61, 0, 91, 166, 167, + 47, 0, 0, 0, 0, 0, 0, 0, 0, 88, + 0, 0, 0, 0, 0, 0, 57, 58, 59, 50, + 0, 0, 89, 0, 0, 0, 0, 90, 0, 62, + 85, 0, 0, 83, 0, 52, 87, 0, 0, 63, + 0, 125, 0, 0, 84 +}; +short yypact[] = +{ +-1000, 536, 524, 830,-1000,-1000,-1000,-1000,-1000,-1000, + 519,-1000,-1000,-1000,-1000,-1000,-1000, 210, 496, 19, + 224, 223, 222, 216, 82, 213, 16, 106,-1000,-1000, +-1000,-1000,-1000,1378,-1000,-1000,-1000, 37,-1000,-1000, +-1000,-1000,-1000,-1000,-1000, 496,-1000,-1000,-1000,-1000, +-1000, 392,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,1284, 390,1305, 390, + 212,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,-1000,-1000, 496, 496, 496, 496,-1000, + 496,-1000, 302,-1000,-1000, 496,-1000, -30, 496, 496, + 496, 375,-1000,-1000,-1000, 496, 208,-1000,-1000,-1000, +-1000, 504, 389, 132,-1000,-1000, 379,-1000,-1000,-1000, +-1000, 106, 496, 496, 375,-1000,-1000, 243, 357, 515, +-1000, 356, 995,1140,1140, 353, 513, 496, 336, 496, +-1000,-1000,-1000,-1000,1198,-1000,-1000, 95,1325,-1000, +-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, +-1000,-1000,1198, 191, 207,-1000,-1000,1092,1151,-1000, +-1000,-1000,-1000,1295, 311,-1000,-1000, 302, 302, 496, +-1000,-1000, 136, 284,-1000, 82,-1000, 284,-1000,-1000, +-1000, 496,-1000, 341,-1000, 307, 927, 5, 106, -6, + 496, 82, 28,-1000,-1000,1178,-1000, 496,-1000,-1000, +-1000,-1000,-1000,1140,-1000,1140, 411,-1000,1140,-1000, + 203,-1000, 851, 513,-1000,1140,-1000,-1000,-1000,1140, +1140,-1000, 851,-1000,1140,-1000, 82, 513,-1000, 309, + 202,-1000,1325,-1000,-1000,-1000, 957,-1000,1325,1325, +1325,1325,1325, -22, 256, 122, 342,-1000,-1000, 342, + 342,-1000,1151, 205, 186, 175, 851,-1000,1151,-1000, +-1000,-1000,-1000,-1000, 95,-1000,-1000, 321,-1000,-1000, + 302,-1000,-1000, 198,-1000,-1000,-1000, 37,-1000, -3, +1315, 496,-1000, 197,-1000, 47,-1000,-1000, 341, 498, +-1000, 496,-1000,-1000, 193,-1000, 242, 28,-1000,-1000, +-1000, 163,1140, 851,1054,-1000, 851, 273, 96, 159, + 851, 496, 825,-1000,1043,1140,1140,1140,1140,1140, +1140,1140,1140,1140,1140,-1000,-1000,-1000,-1000,-1000, +-1000,-1000, 715, 157, -41, 102, 691, 289, 177,-1000, +-1000,-1000,1198, 161, 851,-1000,-1000, 45, -22, -22, + -22, 142,-1000, 342, 122, 151, 122,-1000,1151,1151, +1151, 654, 121, 114, 94,-1000,-1000,-1000, 173,-1000, + 138,-1000, 284,-1000, 57,-1000, 90,1006,-1000,1315, +-1000,-1000, 39,1102,-1000,-1000,-1000,1140,-1000,-1000, + 496,-1000, 341, 93, 84,-1000, 61,-1000, 83,-1000, +-1000, 496,1140,-1000, 283,1140, 612,-1000, 272, 277, +1140,1140,-1000, 513,-1000, -18, -41, -41, -41, 338, + -35, -35, 541, 102, 52,-1000,1140,-1000, 513, 513, + 82,-1000, 95,-1000,-1000, 342,-1000,-1000,-1000,-1000, +-1000,-1000,-1000,1151,1151,1151,-1000, 503, 502, 37, +-1000,-1000,1006,-1000,-1000, 21,-1000,-1000,1315,-1000, +-1000,-1000,-1000, 341,-1000, 498, 498, 496,-1000, 851, +1140, 75, 851, 432,-1000,-1000,1140, 271, 851, 71, + 269, 76,-1000,1140, 270, 236, 269, 252, 251, 250, +-1000,-1000,-1000,-1000,1006,-1000,-1000, 17, 247,-1000, +-1000,-1000, -2,1140,-1000,-1000,-1000, 513,-1000,-1000, + 851,-1000,-1000,-1000,-1000,-1000, 851,-1000,-1000,-1000, + 851, 66, 513,-1000 +}; +short yypgo[] = +{ + 0, 654, 653, 1, 652, 167, 9, 30, 648, 647, + 646, 4, 0, 645, 644, 643, 39, 642, 3, 26, + 641, 634, 621, 18, 14, 620, 35, 618, 617, 29, + 41, 33, 20, 362, 22, 616, 34, 352, 66, 270, + 16, 57, 378, 2, 24, 25, 11, 207, 114, 610, + 609, 38, 28, 43, 608, 606, 604, 603, 602,1205, + 134, 601, 600, 7, 599, 598, 597, 596, 594, 592, + 591, 31, 589, 19, 585, 21, 37, 6, 584, 5, + 42, 583, 36, 582, 579, 12, 27, 10, 578, 577, + 8, 13, 32, 576, 574, 572, 15, 569, 516, 568, + 567, 566, 565, 564, 562, 561, 560, 454, 559, 558, + 553, 551, 545, 540, 23, 535, 530, 17 +}; +short yyr1[] = +{ + 0, 1, 1, 55, 55, 55, 55, 55, 55, 55, + 2, 56, 56, 56, 56, 56, 56, 56, 60, 52, + 33, 53, 53, 61, 61, 62, 62, 63, 63, 26, + 26, 26, 27, 27, 34, 34, 17, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 10, + 10, 10, 74, 7, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 16, 16, 16, + 50, 50, 50, 50, 51, 51, 64, 64, 65, 65, + 66, 66, 80, 54, 54, 67, 67, 81, 82, 76, + 83, 84, 77, 77, 85, 85, 45, 45, 45, 70, + 70, 86, 86, 72, 72, 87, 36, 18, 18, 19, + 19, 75, 75, 89, 88, 88, 90, 90, 43, 43, + 91, 91, 3, 68, 68, 92, 92, 95, 93, 94, + 94, 96, 96, 11, 69, 69, 97, 20, 20, 71, + 21, 21, 22, 22, 38, 38, 38, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 12, 12, 13, 13, 13, 13, 13, 13, 37, + 37, 37, 37, 32, 40, 40, 44, 44, 48, 48, + 48, 48, 48, 48, 48, 47, 49, 49, 49, 41, + 41, 42, 42, 42, 42, 42, 42, 42, 42, 58, + 58, 58, 58, 58, 58, 100, 58, 58, 58, 99, + 23, 24, 101, 24, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 4, 102, 103, 103, 103, + 103, 73, 73, 35, 25, 25, 46, 46, 14, 14, + 28, 28, 59, 78, 79, 104, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 105, 106, 113, 113, 113, 108, 115, 115, 115, 110, + 110, 107, 107, 116, 116, 117, 117, 117, 117, 117, + 117, 15, 109, 111, 112, 112, 29, 29, 6, 6, + 30, 30, 30, 31, 31, 31, 31, 31, 31, 5, + 5, 5, 5, 5, 114 +}; +short yyr2[] = +{ + 0, 0, 3, 2, 2, 2, 3, 3, 2, 1, + 1, 3, 4, 3, 4, 4, 5, 3, 0, 1, + 1, 0, 1, 2, 3, 1, 3, 1, 3, 0, + 2, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 5, 7, + 5, 5, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 4, 6, + 3, 4, 5, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 1, 3, 3, 3, 0, 6, 0, + 0, 0, 2, 3, 1, 3, 1, 2, 1, 1, + 3, 1, 1, 1, 3, 3, 2, 1, 5, 1, + 3, 0, 3, 0, 2, 3, 1, 3, 1, 1, + 1, 3, 1, 3, 3, 4, 1, 0, 2, 1, + 3, 1, 3, 1, 1, 2, 4, 1, 3, 0, + 0, 1, 1, 3, 1, 3, 1, 1, 1, 3, + 3, 3, 3, 2, 3, 3, 3, 3, 3, 2, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 4, 5, 5, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 5, 1, 1, 1, 1, + 3, 1, 1, 3, 3, 3, 3, 2, 3, 1, + 5, 4, 1, 2, 2, 0, 7, 2, 2, 5, + 3, 1, 0, 5, 4, 5, 2, 1, 1, 10, + 1, 3, 4, 3, 3, 1, 1, 3, 3, 7, + 7, 0, 1, 3, 1, 3, 1, 2, 1, 1, + 1, 3, 0, 0, 0, 1, 2, 2, 2, 2, + 2, 2, 2, 3, 4, 4, 2, 3, 4, 1, + 3, 3, 1, 1, 1, 3, 1, 1, 1, 1, + 1, 3, 3, 1, 3, 1, 1, 1, 2, 2, + 2, 1, 3, 3, 4, 4, 1, 3, 1, 5, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 1, + 3, 5, 5, 5, 0 +}; +short yychk[] = +{ +-1000, -1, -55, -2, 2, 6, 4, -56, -57, -58, + 21, 40, 7, 63, 26, 72, 47, -7, 43, -10, + -50, -64, -65, -66, -67, -68, -69, 69, 46, 60, + -98, 36, 100, -99, 39, 38, 42, -8, 30, 45, + 56, 44, 33, 53, 58,-102, 23, 32,-103,-104, + 51, -35, 67, -14, 52, -9, 22, 48, 49, 50, +-105, 27, 61, 71, 55, 66, 31, 37, 34, 57, + 28, 75, 35, 24, 70, 103,-106,-108,-109,-111, +-112,-113,-115, 65, 76, 62, 25, 68, 41, 54, + 59, 29, -17, 8, -59, -60, -60, -60, -60, 47, + -73, 81, -52, -33, 17, 81, 102, -73, 81, 81, + 81, 81, -73, 81, -97, 86, -70, -86, -33, -51, + 88, 86, -71, -59, -98, 73, -59, -59, -59, -16, + 85, -71, -71, -71, -71, -81, -71, -37, -33, -59, + -59, -59, 77, -59, -59, -59, -59, -59, -59, -59, +-107, -42, 85, 87, 77, -37, -48, -41, -12, 15, + 16, 8, 9, 10, 11, -49, 83, 84, 14, 13, + 12,-107, 77,-107,-110, -42, 85,-107, 81, -59, + -59, -59, -59, -59, -53, -52, -53, -52, -52, -60, + -33, -26, 77, -33, -76, -51, -36, -33, -33, -33, + -80, 77, -82, -76, -92, -93, -95, -33, 81, 17, + 77, -3, -73, 9, 77, -78, -36, -51, -33, -33, + -80, -82, -92, 79, -32, 77, -4, 9, 77, 78, + -25, -46, -38, 85, -39, 77, -47, -37, -48, -12, + 93, -40, -38, -40, 77, -3, -33, 77, -33, -41, +-116, -42, 77,-117, 85, 87, -15, 18, -12, 85, + 86, 87, 88, -41, -41, -29, 81, -6, -37, 77, + 81, -30, 81, -39, -5, -31, -38, -47, 77, -30, +-114,-114,-114,-114, -41, 85, -61, 77, -26, -26, + -52, -71, 78, -27, -34, -33, 85, -75, 77, -77, + -84, -73, -75, -54, -37, -19, -18, -37, 77, 77, + -7, 86, -86, 86, -72, -87, -33, -73, -24, -23, + 101, -33,-100, -38, 77, -36, -38, -21, -40, -22, + -38, 74, -38, 78, 81, -12, 85, 86, 87, -13, + 92, 91, 90, 89, 88, 94, 96, 95, 98, 97, + 99, -3, -38, -39, -38, -38, -38, -73, -91, -3, + 78, 78, 81, -41, -38, 85, 87, -41, -41, -41, + -41, -41, 78, 81, -29, -29, -29, -30, 81, 81, + 81, -38, -39, -5, -31,-114,-114, 78, -62, -63, + 17, -26, -74, 78, 81, -16, -88, -89, 102, 81, + -85, -45, -44, -12, -47, -33, -48, 77, -36, 78, + 81, 86, 81, -19, -94, -96, -11, 17, -20, -33, + 78, 81, 79, -24,-101, 79, -38, -79, 85, 78, + 80, 81, -33, 78, -46, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, 78, 81, 78, 77, 81, + 78,-117, -41, 78, -6, 81, -39, -5, -39, -5, + -39, -5, 78, 81, 81, 81, 78, 81, 79, -75, + -34, 78, 81, -90, -43, -38, 85, -85, 85, -44, + -37, -83, -18, 81, 78, 81, 84, 81, -87, -38, + 77, -28, -38, 78, 78, -32, 77, -40, -38, -3, + -39, -91, -3, -73, -23, -33, -39, -23, -23, -23, + -63, 17, -16, -90, 80, -45, -44, -77, -23, -96, + -11, -33, -38, 81, 73, -79, 78, 81, 78, 78, + -38, 78, 78, 78, 78, -43, -38, 86, 78, 78, + -38, -3, 81, -3 +}; +short yydef[] = +{ + 1, -2, 0, 0, 9, 10, 2, 3, 4, 5, + 0, 242, 8, 18, 18, 18, 18, 231, 0, 37, + -2, 39, 40, 41, -2, 43, 44, 45, 47, 139, + 199, 242, 202, 0, 242, 242, 242, 67, 139, 139, + 139, 139, 87, 139, 134, 0, 242, 242, 217, 218, + 242, 220, 242, 242, 242, 54, 226, 242, 242, 242, + 245, 242, 238, 239, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 0, 0, 0, 0, + 259, 242, 242, 242, 242, 242, 262, 263, 264, 266, + 267, 268, 6, 36, 7, 21, 21, 0, 0, 18, + 0, 232, 29, 19, 20, 0, 89, 0, 232, 0, + 0, 0, 89, 127, 135, 0, 46, 99, 101, 102, + 74, 0, 0, 231, 203, 204, 0, 207, 208, 53, + 243, 0, 0, 0, 0, 89, 127, 0, 169, 0, + 216, 0, 0, 174, 174, 0, 0, 0, 0, 0, + 246, -2, 248, 249, 0, 191, 192, 0, 0, 178, + 179, 180, 181, 182, 183, 184, 161, 162, 186, 187, + 188, 250, 0, 251, 252, -2, 270, 256, 0, 304, + 304, 304, 304, 0, 11, 22, 13, 29, 29, 0, + 139, 17, 0, 111, 91, 231, 73, 111, 77, 79, + 81, 0, 86, 0, 124, 126, 0, 0, 0, 0, + 0, 231, 0, 122, 205, 0, 70, 0, 76, 78, + 80, 85, 123, 0, 170, -2, 0, 225, 0, 221, + 0, 234, 236, 0, 144, 0, 146, 147, 148, 0, + 0, 223, 175, 224, 0, 227, -2, 0, 233, 275, + 0, 189, 0, 273, 276, 277, 0, 281, 0, 0, + 0, 0, 0, 197, 275, 253, 0, 286, 288, 0, + 0, 257, 0, -2, 291, 292, 0, -2, 0, 260, + 261, 265, 282, 283, 304, 304, 12, 0, 14, 15, + 29, 52, 30, 0, 32, 34, 35, 67, 113, 0, + 0, 0, 106, 0, 83, 0, 109, 107, 0, 0, + 128, 0, 100, 75, 0, 103, 0, 0, 201, 211, + 212, 0, 0, 244, 0, 71, 214, 0, 0, 141, + -2, 0, 0, 222, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163, 164, 165, 166, 167, + 168, 237, 0, 144, 153, 159, 0, 0, 0, 120, + -2, 272, 0, 0, 278, 279, 280, 193, 194, 195, + 196, 198, 271, 0, 255, 0, 254, 258, 0, 0, + 0, 0, 144, 0, 0, 284, 285, 23, 0, 25, + 27, 16, 111, 31, 0, 50, 0, 0, 51, 0, + 92, 94, 96, 0, 98, 176, 177, 0, 72, 82, + 0, 90, 0, 0, 0, 129, 131, 133, 136, 137, + 48, 0, 0, 200, 0, 0, 0, 68, 0, 171, + 174, 0, 215, 0, 235, 149, 150, 151, 152, -2, + 155, 156, 157, 158, 160, 145, 0, 209, 0, 0, + 231, 274, 275, 190, 287, 0, -2, 294, -2, 296, + -2, 298, -2, 0, 0, 0, 24, 0, 0, 67, + 33, 112, 0, 114, 116, 119, 118, 93, 0, 97, + 84, 91, 110, 0, 125, 0, 0, 0, 104, 105, + 0, 210, 240, 0, 244, 172, 174, 0, 143, 0, + 144, 0, 121, 0, 0, 169, -2, 0, 0, 0, + 26, 28, 49, 115, 0, 95, 96, 0, 0, 130, + 132, 138, 0, 0, 206, 69, 173, 0, 185, 229, + 230, 289, 301, 302, 303, 117, 119, 88, 108, 213, + 241, 0, 0, 219 +}; +short yytok1[] = +{ + 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103 +}; +short yytok2[] = +{ + 2, 3 +}; +long yytok3[] = +{ + 0 +}; +#define YYFLAG -1000 +#define YYERROR goto yyerrlab +#define YYACCEPT return(0) +#define YYABORT return(1) +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 + +#ifdef yydebug +#include "y.debug" +#else +#define yydebug 0 +char* yytoknames[1]; /* for debugging */ +char* yystates[1]; /* for debugging */ +#endif + +/* parser for yacc output */ + +int yynerrs = 0; /* number of errors */ +int yyerrflag = 0; /* error recovery flag */ + +extern int fprint(int, char*, ...); +extern int sprint(char*, char*, ...); + +char* +yytokname(int yyc) +{ + static char x[10]; + + if(yyc > 0 && yyc <= sizeof(yytoknames)/sizeof(yytoknames[0])) + if(yytoknames[yyc-1]) + return yytoknames[yyc-1]; + sprintf(x, "<%d>", yyc); + return x; +} + +char* +yystatname(int yys) +{ + static char x[10]; + + if(yys >= 0 && yys < sizeof(yystates)/sizeof(yystates[0])) + if(yystates[yys]) + return yystates[yys]; + sprintf(x, "<%d>\n", yys); + return x; +} + +long +yylex1(void) +{ + long yychar; + long *t3p; + int c; + + yychar = yylex(); + if(yychar <= 0) { + c = yytok1[0]; + goto out; + } + if(yychar < sizeof(yytok1)/sizeof(yytok1[0])) { + c = yytok1[yychar]; + goto out; + } + if(yychar >= YYPRIVATE) + if(yychar < YYPRIVATE+sizeof(yytok2)/sizeof(yytok2[0])) { + c = yytok2[yychar-YYPRIVATE]; + goto out; + } + for(t3p=yytok3;; t3p+=2) { + c = t3p[0]; + if(c == yychar) { + c = t3p[1]; + goto out; + } + if(c == 0) + break; + } + c = 0; + +out: + if(c == 0) + c = yytok2[1]; /* unknown char */ + if(yydebug >= 3) + printf("lex %.4lX %s\n", yychar, yytokname(c)); + return c; +} + +int +yyparse(void) +{ + struct + { + YYSTYPE yyv; + int yys; + } yys[YYMAXDEPTH], *yyp, *yypt; + short *yyxi; + int yyj, yym, yystate, yyn, yyg; + YYSTYPE save1, save2; + int save3, save4; + long yychar; + + save1 = yylval; + save2 = yyval; + save3 = yynerrs; + save4 = yyerrflag; + + yystate = 0; + yychar = -1; + yynerrs = 0; + yyerrflag = 0; + yyp = &yys[-1]; + goto yystack; + +ret0: + yyn = 0; + goto ret; + +ret1: + yyn = 1; + goto ret; + +ret: + yylval = save1; + yyval = save2; + yynerrs = save3; + yyerrflag = save4; + return yyn; + +yystack: + /* put a state and value onto the stack */ + if(yydebug >= 4) + printf("char %s in %s", yytokname(yychar), yystatname(yystate)); + + yyp++; + if(yyp >= &yys[YYMAXDEPTH]) { + yyerror("yacc stack overflow"); + goto ret1; + } + yyp->yys = yystate; + yyp->yyv = yyval; + +yynewstate: + yyn = yypact[yystate]; + if(yyn <= YYFLAG) + goto yydefault; /* simple state */ + if(yychar < 0) + yychar = yylex1(); + yyn += yychar; + if(yyn < 0 || yyn >= YYLAST) + goto yydefault; + yyn = yyact[yyn]; + if(yychk[yyn] == yychar) { /* valid shift */ + yychar = -1; + yyval = yylval; + yystate = yyn; + if(yyerrflag > 0) + yyerrflag--; + goto yystack; + } + +yydefault: + /* default state action */ + yyn = yydef[yystate]; + if(yyn == -2) { + if(yychar < 0) + yychar = yylex1(); + + /* look through exception table */ + for(yyxi=yyexca;; yyxi+=2) + if(yyxi[0] == -1 && yyxi[1] == yystate) + break; + for(yyxi += 2;; yyxi += 2) { + yyn = yyxi[0]; + if(yyn < 0 || yyn == yychar) + break; + } + yyn = yyxi[1]; + if(yyn < 0) + goto ret0; + } + if(yyn == 0) { + /* error ... attempt to resume parsing */ + switch(yyerrflag) { + case 0: /* brand new error */ + yyerror("syntax error"); + if(yydebug >= 1) { + printf("%s", yystatname(yystate)); + printf("saw %s\n", yytokname(yychar)); + } +yyerrlab: + yynerrs++; + + case 1: + case 2: /* incompletely recovered error ... try again */ + yyerrflag = 3; + + /* find a state where "error" is a legal shift action */ + while(yyp >= yys) { + yyn = yypact[yyp->yys] + YYERRCODE; + if(yyn >= 0 && yyn < YYLAST) { + yystate = yyact[yyn]; /* simulate a shift of "error" */ + if(yychk[yystate] == YYERRCODE) + goto yystack; + } + + /* the current yyp has no shift onn "error", pop stack */ + if(yydebug >= 2) + printf("error recovery pops state %d, uncovers %d\n", + yyp->yys, (yyp-1)->yys ); + yyp--; + } + /* there is no state on the stack with an error shift ... abort */ + goto ret1; + + case 3: /* no shift yet; clobber input char */ + if(yydebug >= YYEOFCODE) + printf("error recovery discards %s\n", yytokname(yychar)); + if(yychar == YYEOFCODE) + goto ret1; + yychar = -1; + goto yynewstate; /* try again in the same state */ + } + } + + /* reduction by production yyn */ + if(yydebug >= 2) + printf("reduce %d in:\n\t%s", yyn, yystatname(yystate)); + + yypt = yyp; + yyp -= yyr2[yyn]; + yyval = (yyp+1)->yyv; + yym = yyn; + + /* consult goto table to find next state */ + yyn = yyr1[yyn]; + yyg = yypgo[yyn]; + yyj = yyg + yyp->yys + 1; + + if(yyj >= YYLAST || yychk[yystate=yyact[yyj]] != -yyn) + yystate = yyact[yyg]; + switch(yym) { + +case 3: +/* #line 220 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ +/* stat: is the nonterminal for Fortran statements */ + + lastwasbranch = NO; } break; +case 5: +/* #line 226 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ /* forbid further statement function definitions... */ + if (parstate == INDATA && laststfcn != thisstno) + parstate = INEXEC; + thisstno++; + if(yypt[-1].yyv.labval && (yypt[-1].yyv.labval->labelno==dorange)) + enddo(yypt[-1].yyv.labval->labelno); + if(lastwasbranch && thislabel==NULL) + warn("statement cannot be reached"); + lastwasbranch = thiswasbranch; + thiswasbranch = NO; + if(yypt[-1].yyv.labval) + { + if(yypt[-1].yyv.labval->labtype == LABFORMAT) + err("label already that of a format"); + else + yypt[-1].yyv.labval->labtype = LABEXEC; + } + freetemps(); + } break; +case 6: +/* #line 246 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if (can_include) + doinclude( yypt[-0].yyv.charpval ); + else { + fprintf(diagfile, "Cannot open file %s\n", yypt[-0].yyv.charpval); + done(1); + } + } break; +case 7: +/* #line 254 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if (yypt[-2].yyv.labval) + lastwasbranch = NO; + endcheck(); + endproc(); /* lastwasbranch = NO; -- set in endproc() */ + } break; +case 8: +/* #line 260 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ unclassifiable(); + +/* flline flushes the current line, ignoring the rest of the text there */ + + flline(); } break; +case 9: +/* #line 266 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ flline(); needkwd = NO; inioctl = NO; + yyerrok; yyclearin; } break; +case 10: +/* #line 271 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + if(yystno != 0) + { + yyval.labval = thislabel = mklabel(yystno); + if( ! headerdone ) { + if (procclass == CLUNKNOWN) + procclass = CLMAIN; + puthead(CNULL, procclass); + } + if(thislabel->labdefined) + execerr("label %s already defined", + convic(thislabel->stateno) ); + else { + if(thislabel->blklevel!=0 && thislabel->blklevellabtype!=LABFORMAT) + warn1("there is a branch to label %s from outside block", + convic( (ftnint) (thislabel->stateno) ) ); + thislabel->blklevel = blklevel; + thislabel->labdefined = YES; + if(thislabel->labtype != LABFORMAT) + p1_label((long)(thislabel - labeltab)); + } + } + else yyval.labval = thislabel = NULL; + } break; +case 11: +/* #line 299 "/n/bopp/v5/dmg/f2c/gram.in" */ +{startproc(yypt[-0].yyv.extval, CLMAIN); } break; +case 12: +/* #line 301 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ warn("ignoring arguments to main program"); + /* hashclear(); */ + startproc(yypt[-1].yyv.extval, CLMAIN); } break; +case 13: +/* #line 305 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-0].yyv.extval) NO66("named BLOCKDATA"); + startproc(yypt[-0].yyv.extval, CLBLOCK); } break; +case 14: +/* #line 308 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ entrypt(CLPROC, TYSUBR, (ftnint) 0, yypt[-1].yyv.extval, yypt[-0].yyv.chval); } break; +case 15: +/* #line 310 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, yypt[-1].yyv.extval, yypt[-0].yyv.chval); } break; +case 16: +/* #line 312 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ entrypt(CLPROC, yypt[-4].yyv.ival, varleng, yypt[-1].yyv.extval, yypt[-0].yyv.chval); } break; +case 17: +/* #line 314 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(parstate==OUTSIDE || procclass==CLMAIN + || procclass==CLBLOCK) + execerr("misplaced entry statement", CNULL); + entrypt(CLENTRY, 0, (ftnint) 0, yypt[-1].yyv.extval, yypt[-0].yyv.chval); + } break; +case 18: +/* #line 322 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ newproc(); } break; +case 19: +/* #line 326 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = newentry(yypt[-0].yyv.namval, 1); } break; +case 20: +/* #line 330 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.namval = mkname(token); } break; +case 21: +/* #line 333 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = NULL; } break; +case 29: +/* #line 351 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = 0; } break; +case 30: +/* #line 353 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66(" () argument list"); + yyval.chval = 0; } break; +case 31: +/* #line 356 "/n/bopp/v5/dmg/f2c/gram.in" */ +{yyval.chval = yypt[-1].yyv.chval; } break; +case 32: +/* #line 360 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = (yypt[-0].yyv.namval ? mkchain((char *)yypt[-0].yyv.namval,CHNULL) : CHNULL ); } break; +case 33: +/* #line 362 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-0].yyv.namval) yypt[-2].yyv.chval = yyval.chval = mkchain((char *)yypt[-0].yyv.namval, yypt[-2].yyv.chval); } break; +case 34: +/* #line 366 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-0].yyv.namval->vstg!=STGUNKNOWN && yypt[-0].yyv.namval->vstg!=STGARG) + dclerr("name declared as argument after use", yypt[-0].yyv.namval); + yypt[-0].yyv.namval->vstg = STGARG; + } break; +case 35: +/* #line 371 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("altenate return argument"); + +/* substars means that '*'ed formal parameters should be replaced. + This is used to specify alternate return labels; in theory, only + parameter slots which have '*' should accept the statement labels. + This compiler chooses to ignore the '*'s in the formal declaration, and + always return the proper value anyway. + + This variable is only referred to in proc.c */ + + yyval.namval = 0; substars = YES; } break; +case 36: +/* #line 387 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + char *s; + s = copyn(toklen+1, token); + s[toklen] = '\0'; + yyval.charpval = s; + } break; +case 45: +/* #line 403 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("SAVE statement"); + saveall = YES; } break; +case 46: +/* #line 406 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("SAVE statement"); } break; +case 47: +/* #line 408 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ fmtstmt(thislabel); setfmt(thislabel); } break; +case 48: +/* #line 410 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("PARAMETER statement"); } break; +case 49: +/* #line 414 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ settype(yypt[-4].yyv.namval, yypt[-6].yyv.ival, yypt[-0].yyv.lval); + if(ndim>0) setbound(yypt[-4].yyv.namval,ndim,dims); + } break; +case 50: +/* #line 418 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ settype(yypt[-2].yyv.namval, yypt[-4].yyv.ival, yypt[-0].yyv.lval); + if(ndim>0) setbound(yypt[-2].yyv.namval,ndim,dims); + } break; +case 51: +/* #line 422 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if (new_dcl == 2) { + err("attempt to give DATA in type-declaration"); + new_dcl = 1; + } + } break; +case 52: +/* #line 429 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ new_dcl = 2; } break; +case 53: +/* #line 432 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ varleng = yypt[-0].yyv.lval; } break; +case 54: +/* #line 436 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ varleng = (yypt[-0].yyv.ival<0 || ONEOF(yypt[-0].yyv.ival,M(TYLOGICAL)|M(TYLONG)) + ? 0 : typesize[yypt[-0].yyv.ival]); + vartype = yypt[-0].yyv.ival; } break; +case 55: +/* #line 441 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYLONG; } break; +case 56: +/* #line 442 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = tyreal; } break; +case 57: +/* #line 443 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ++complex_seen; yyval.ival = tycomplex; } break; +case 58: +/* #line 444 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYDREAL; } break; +case 59: +/* #line 445 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); yyval.ival = TYDCOMPLEX; } break; +case 60: +/* #line 446 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYLOGICAL; } break; +case 61: +/* #line 447 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("CHARACTER statement"); yyval.ival = TYCHAR; } break; +case 62: +/* #line 448 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYUNKNOWN; } break; +case 63: +/* #line 449 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYUNKNOWN; } break; +case 64: +/* #line 450 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NOEXT("AUTOMATIC statement"); yyval.ival = - STGAUTO; } break; +case 65: +/* #line 451 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NOEXT("STATIC statement"); yyval.ival = - STGBSS; } break; +case 66: +/* #line 452 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = TYINT1; } break; +case 67: +/* #line 456 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.lval = varleng; } break; +case 68: +/* #line 458 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + expptr p; + p = yypt[-1].yyv.expval; + NO66("length specification *n"); + if( ! ISICON(p) || p->constblock.Const.ci <= 0 ) + { + yyval.lval = 0; + dclerr("length must be a positive integer constant", + NPNULL); + } + else { + if (vartype == TYCHAR) + yyval.lval = p->constblock.Const.ci; + else switch((int)p->constblock.Const.ci) { + case 1: yyval.lval = 1; break; + case 2: yyval.lval = typesize[TYSHORT]; break; + case 4: yyval.lval = typesize[TYLONG]; break; + case 8: yyval.lval = typesize[TYDREAL]; break; + case 16: yyval.lval = typesize[TYDCOMPLEX]; break; + default: + dclerr("invalid length",NPNULL); + yyval.lval = varleng; + } + } + } break; +case 69: +/* #line 484 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("length specification *(*)"); yyval.lval = -1; } break; +case 70: +/* #line 488 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ incomm( yyval.extval = comblock("") , yypt[-0].yyv.namval ); } break; +case 71: +/* #line 490 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = yypt[-1].yyv.extval; incomm(yypt[-1].yyv.extval, yypt[-0].yyv.namval); } break; +case 72: +/* #line 492 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = yypt[-2].yyv.extval; incomm(yypt[-2].yyv.extval, yypt[-0].yyv.namval); } break; +case 73: +/* #line 494 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ incomm(yypt[-2].yyv.extval, yypt[-0].yyv.namval); } break; +case 74: +/* #line 498 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = comblock(""); } break; +case 75: +/* #line 500 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.extval = comblock(token); } break; +case 76: +/* #line 504 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ setext(yypt[-0].yyv.namval); } break; +case 77: +/* #line 506 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ setext(yypt[-0].yyv.namval); } break; +case 78: +/* #line 510 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("INTRINSIC statement"); setintr(yypt[-0].yyv.namval); } break; +case 79: +/* #line 512 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ setintr(yypt[-0].yyv.namval); } break; +case 82: +/* #line 520 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + struct Equivblock *p; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + p = & eqvclass[nequiv++]; + p->eqvinit = NO; + p->eqvbottom = 0; + p->eqvtop = 0; + p->equivs = yypt[-1].yyv.eqvval; + } break; +case 83: +/* #line 533 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.eqvval=ALLOC(Eqvchain); + yyval.eqvval->eqvitem.eqvlhs = primchk(yypt[-0].yyv.expval); + } break; +case 84: +/* #line 537 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.eqvval=ALLOC(Eqvchain); + yyval.eqvval->eqvitem.eqvlhs = primchk(yypt[-0].yyv.expval); + yyval.eqvval->eqvnextp = yypt[-2].yyv.eqvval; + } break; +case 87: +/* #line 548 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + if(parstate < INDATA) + { + enddcl(); + parstate = INDATA; + datagripe = 1; + } + } break; +case 88: +/* #line 563 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ftnint junk; + if(nextdata(&junk) != NULL) + err("too few initializers"); + frdata(yypt[-4].yyv.chval); + frrpl(); + } break; +case 89: +/* #line 571 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ frchain(&datastack); curdtp = 0; } break; +case 90: +/* #line 573 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ pop_datastack(); } break; +case 91: +/* #line 575 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ toomanyinit = NO; } break; +case 94: +/* #line 580 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ dataval(ENULL, yypt[-0].yyv.expval); } break; +case 95: +/* #line 582 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ dataval(yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 97: +/* #line 587 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if( yypt[-1].yyv.ival==OPMINUS && ISCONST(yypt[-0].yyv.expval) ) + consnegop((Constp)yypt[-0].yyv.expval); + yyval.expval = yypt[-0].yyv.expval; + } break; +case 101: +/* #line 599 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ int k; + yypt[-0].yyv.namval->vsave = YES; + k = yypt[-0].yyv.namval->vstg; + if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) ) + dclerr("can only save static variables", yypt[-0].yyv.namval); + } break; +case 105: +/* #line 613 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-2].yyv.namval->vclass == CLUNKNOWN) + make_param((struct Paramblock *)yypt[-2].yyv.namval, yypt[-0].yyv.expval); + else dclerr("cannot make into parameter", yypt[-2].yyv.namval); + } break; +case 106: +/* #line 620 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(ndim>0) setbound(yypt[-1].yyv.namval, ndim, dims); } break; +case 107: +/* #line 624 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ Namep np; + struct Primblock *pp = (struct Primblock *)yypt[-0].yyv.expval; + int tt = yypt[-0].yyv.expval->tag; + if (tt != TPRIM) { + if (tt == TCONST) + err("parameter in data statement"); + else + erri("tag %d in data statement",tt); + yyval.chval = 0; + err_lineno = lineno; + break; + } + np = pp -> namep; + vardcl(np); + if ((pp->fcharp || pp->lcharp) + && (np->vtype != TYCHAR || np->vdim && !pp->argsp)) + sserr(np); + if(np->vstg == STGCOMMON) + extsymtab[np->vardesc.varno].extinit = YES; + else if(np->vstg==STGEQUIV) + eqvclass[np->vardesc.varno].eqvinit = YES; + else if(np->vstg!=STGINIT && np->vstg!=STGBSS) { + errstr(np->vstg == STGARG + ? "Dummy argument \"%.60s\" in data statement." + : "Cannot give data to \"%.75s\"", + np->fvarname); + yyval.chval = 0; + err_lineno = lineno; + break; + } + yyval.chval = mkchain((char *)yypt[-0].yyv.expval, CHNULL); + } break; +case 108: +/* #line 657 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ chainp p; struct Impldoblock *q; + pop_datastack(); + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + (q->varnp = (Namep) (yypt[-1].yyv.chval->datap))->vimpldovar = 1; + p = yypt[-1].yyv.chval->nextp; + if(p) { q->implb = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impub = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impstep = (expptr)(p->datap); } + frchain( & (yypt[-1].yyv.chval) ); + yyval.chval = mkchain((char *)q, CHNULL); + q->datalist = hookup(yypt[-3].yyv.chval, yyval.chval); + } break; +case 109: +/* #line 673 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if (!datastack) + curdtp = 0; + datastack = mkchain((char *)curdtp, datastack); + curdtp = yypt[-0].yyv.chval; curdtelt = 0; + } break; +case 110: +/* #line 679 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = hookup(yypt[-2].yyv.chval, yypt[-0].yyv.chval); } break; +case 111: +/* #line 683 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ndim = 0; } break; +case 113: +/* #line 687 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ndim = 0; } break; +case 116: +/* #line 692 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = 0; + dims[ndim].ub = yypt[-0].yyv.expval; + } + ++ndim; + } break; +case 117: +/* #line 702 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = yypt[-2].yyv.expval; + dims[ndim].ub = yypt[-0].yyv.expval; + } + ++ndim; + } break; +case 118: +/* #line 714 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = 0; } break; +case 120: +/* #line 719 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ nstars = 1; labarray[0] = yypt[-0].yyv.labval; } break; +case 121: +/* #line 721 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(nstars < maxlablist) labarray[nstars++] = yypt[-0].yyv.labval; } break; +case 122: +/* #line 725 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.labval = execlab( convci(toklen, token) ); } break; +case 123: +/* #line 729 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("IMPLICIT statement"); } break; +case 126: +/* #line 735 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if (vartype != TYUNKNOWN) + dclerr("-- expected letter range",NPNULL); + setimpl(vartype, varleng, 'a', 'z'); } break; +case 127: +/* #line 740 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ needkwd = 1; } break; +case 131: +/* #line 749 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ setimpl(vartype, varleng, yypt[-0].yyv.ival, yypt[-0].yyv.ival); } break; +case 132: +/* #line 751 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ setimpl(vartype, varleng, yypt[-2].yyv.ival, yypt[-0].yyv.ival); } break; +case 133: +/* #line 755 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(toklen!=1 || token[0]<'a' || token[0]>'z') + { + dclerr("implicit item must be single letter", NPNULL); + yyval.ival = 0; + } + else yyval.ival = token[0]; + } break; +case 136: +/* #line 769 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + if(yypt[-2].yyv.namval->vclass == CLUNKNOWN) + { + yypt[-2].yyv.namval->vclass = CLNAMELIST; + yypt[-2].yyv.namval->vtype = TYINT; + yypt[-2].yyv.namval->vstg = STGBSS; + yypt[-2].yyv.namval->varxptr.namelist = yypt[-0].yyv.chval; + yypt[-2].yyv.namval->vardesc.varno = ++lastvarno; + } + else dclerr("cannot be a namelist name", yypt[-2].yyv.namval); + } break; +case 137: +/* #line 783 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.namval, CHNULL); } break; +case 138: +/* #line 785 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = hookup(yypt[-2].yyv.chval, mkchain((char *)yypt[-0].yyv.namval, CHNULL)); } break; +case 139: +/* #line 789 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ switch(parstate) + { + case OUTSIDE: newproc(); + startproc(ESNULL, CLMAIN); + case INSIDE: parstate = INDCL; + case INDCL: break; + + case INDATA: + if (datagripe) { + errstr( + "Statement order error: declaration after DATA", + CNULL); + datagripe = 0; + } + break; + + default: + dclerr("declaration among executables", NPNULL); + } + } break; +case 140: +/* #line 811 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = 0; } break; +case 141: +/* #line 813 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = revchain(yypt[-0].yyv.chval); } break; +case 142: +/* #line 817 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, CHNULL); } break; +case 143: +/* #line 819 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, yypt[-2].yyv.chval); } break; +case 145: +/* #line 824 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = yypt[-1].yyv.expval; if (yyval.expval->tag == TPRIM) + paren_used(&yyval.expval->primblock); } break; +case 149: +/* #line 832 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(yypt[-1].yyv.ival, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 150: +/* #line 834 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPSTAR, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 151: +/* #line 836 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPSLASH, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 152: +/* #line 838 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPPOWER, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 153: +/* #line 840 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-1].yyv.ival == OPMINUS) + yyval.expval = mkexpr(OPNEG, yypt[-0].yyv.expval, ENULL); + else { + yyval.expval = yypt[-0].yyv.expval; + if (yyval.expval->tag == TPRIM) + paren_used(&yyval.expval->primblock); + } + } break; +case 154: +/* #line 849 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(yypt[-1].yyv.ival, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 155: +/* #line 851 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66(".EQV. operator"); + yyval.expval = mkexpr(OPEQV, yypt[-2].yyv.expval,yypt[-0].yyv.expval); } break; +case 156: +/* #line 854 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66(".NEQV. operator"); + yyval.expval = mkexpr(OPNEQV, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 157: +/* #line 857 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPOR, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 158: +/* #line 859 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPAND, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 159: +/* #line 861 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPNOT, yypt[-0].yyv.expval, ENULL); } break; +case 160: +/* #line 863 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("concatenation operator //"); + yyval.expval = mkexpr(OPCONCAT, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 161: +/* #line 867 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPPLUS; } break; +case 162: +/* #line 868 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPMINUS; } break; +case 163: +/* #line 871 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPEQ; } break; +case 164: +/* #line 872 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPGT; } break; +case 165: +/* #line 873 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPLT; } break; +case 166: +/* #line 874 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPGE; } break; +case 167: +/* #line 875 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPLE; } break; +case 168: +/* #line 876 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = OPNE; } break; +case 169: +/* #line 880 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkprim(yypt[-0].yyv.namval, LBNULL, CHNULL); } break; +case 170: +/* #line 882 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("substring operator :"); + yyval.expval = mkprim(yypt[-1].yyv.namval, LBNULL, yypt[-0].yyv.chval); } break; +case 171: +/* #line 885 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkprim(yypt[-3].yyv.namval, mklist(yypt[-1].yyv.chval), CHNULL); } break; +case 172: +/* #line 887 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("substring operator :"); + yyval.expval = mkprim(yypt[-4].yyv.namval, mklist(yypt[-2].yyv.chval), yypt[-0].yyv.chval); } break; +case 173: +/* #line 892 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-3].yyv.expval, mkchain((char *)yypt[-1].yyv.expval,CHNULL)); } break; +case 174: +/* #line 896 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = 0; } break; +case 176: +/* #line 901 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-0].yyv.namval->vclass == CLPARAM) + yyval.expval = (expptr) cpexpr( + ( (struct Paramblock *) (yypt[-0].yyv.namval) ) -> paramval); + } break; +case 178: +/* #line 908 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mklogcon(1); } break; +case 179: +/* #line 909 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mklogcon(0); } break; +case 180: +/* #line 910 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkstrcon(toklen, token); } break; +case 181: +/* #line 911 "/n/bopp/v5/dmg/f2c/gram.in" */ + { yyval.expval = mkintqcon(toklen, token); } break; +case 182: +/* #line 912 "/n/bopp/v5/dmg/f2c/gram.in" */ + { yyval.expval = mkrealcon(tyreal, token); } break; +case 183: +/* #line 913 "/n/bopp/v5/dmg/f2c/gram.in" */ + { yyval.expval = mkrealcon(TYDREAL, token); } break; +case 185: +/* #line 918 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkcxcon(yypt[-3].yyv.expval,yypt[-1].yyv.expval); } break; +case 186: +/* #line 922 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NOEXT("hex constant"); + yyval.expval = mkbitcon(4, toklen, token); } break; +case 187: +/* #line 925 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NOEXT("octal constant"); + yyval.expval = mkbitcon(3, toklen, token); } break; +case 188: +/* #line 928 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NOEXT("binary constant"); + yyval.expval = mkbitcon(1, toklen, token); } break; +case 190: +/* #line 934 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = yypt[-1].yyv.expval; } break; +case 193: +/* #line 940 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(yypt[-1].yyv.ival, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 194: +/* #line 942 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPSTAR, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 195: +/* #line 944 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPSLASH, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 196: +/* #line 946 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.expval = mkexpr(OPPOWER, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 197: +/* #line 948 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(yypt[-1].yyv.ival == OPMINUS) + yyval.expval = mkexpr(OPNEG, yypt[-0].yyv.expval, ENULL); + else yyval.expval = yypt[-0].yyv.expval; + } break; +case 198: +/* #line 953 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ NO66("concatenation operator //"); + yyval.expval = mkexpr(OPCONCAT, yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 200: +/* #line 958 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + if(yypt[-2].yyv.labval->labdefined) + execerr("no backward DO loops", CNULL); + yypt[-2].yyv.labval->blklevel = blklevel+1; + exdo(yypt[-2].yyv.labval->labelno, NPNULL, yypt[-0].yyv.chval); + } break; +case 201: +/* #line 965 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + exdo((int)(ctls - ctlstack - 2), NPNULL, yypt[-0].yyv.chval); + NOEXT("DO without label"); + } break; +case 202: +/* #line 970 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exenddo(NPNULL); } break; +case 203: +/* #line 972 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exendif(); thiswasbranch = NO; } break; +case 205: +/* #line 974 "/n/bopp/v5/dmg/f2c/gram.in" */ +{westart(1);} break; +case 206: +/* #line 975 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exelif(yypt[-2].yyv.expval); lastwasbranch = NO; } break; +case 207: +/* #line 977 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exelse(); lastwasbranch = NO; } break; +case 208: +/* #line 979 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exendif(); lastwasbranch = NO; } break; +case 209: +/* #line 983 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exif(yypt[-1].yyv.expval); } break; +case 210: +/* #line 987 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-2].yyv.namval, yypt[-0].yyv.chval); } break; +case 212: +/* #line 991 "/n/bopp/v5/dmg/f2c/gram.in" */ +{westart(0);} break; +case 213: +/* #line 992 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain(CNULL, (chainp)yypt[-1].yyv.expval); } break; +case 214: +/* #line 996 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exequals((struct Primblock *)yypt[-2].yyv.expval, yypt[-0].yyv.expval); } break; +case 215: +/* #line 998 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exassign(yypt[-0].yyv.namval, yypt[-2].yyv.labval); } break; +case 218: +/* #line 1002 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ inioctl = NO; } break; +case 219: +/* #line 1004 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exarif(yypt[-6].yyv.expval, yypt[-4].yyv.labval, yypt[-2].yyv.labval, yypt[-0].yyv.labval); thiswasbranch = YES; } break; +case 220: +/* #line 1006 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ excall(yypt[-0].yyv.namval, LBNULL, 0, labarray); } break; +case 221: +/* #line 1008 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ excall(yypt[-2].yyv.namval, LBNULL, 0, labarray); } break; +case 222: +/* #line 1010 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(nstars < maxlablist) + excall(yypt[-3].yyv.namval, mklist(revchain(yypt[-1].yyv.chval)), nstars, labarray); + else + many("alternate returns", 'l', maxlablist); + } break; +case 223: +/* #line 1016 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exreturn(yypt[-0].yyv.expval); thiswasbranch = YES; } break; +case 224: +/* #line 1018 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exstop(yypt[-2].yyv.ival, yypt[-0].yyv.expval); thiswasbranch = yypt[-2].yyv.ival; } break; +case 225: +/* #line 1022 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.labval = mklabel( convci(toklen, token) ); } break; +case 226: +/* #line 1026 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + } break; +case 227: +/* #line 1035 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exgoto(yypt[-0].yyv.labval); thiswasbranch = YES; } break; +case 228: +/* #line 1037 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exasgoto(yypt[-0].yyv.namval); thiswasbranch = YES; } break; +case 229: +/* #line 1039 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ exasgoto(yypt[-4].yyv.namval); thiswasbranch = YES; } break; +case 230: +/* #line 1041 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(nstars < maxlablist) + putcmgo(putx(fixtype(yypt[-0].yyv.expval)), nstars, labarray); + else + many("labels in computed GOTO list", 'l', maxlablist); + } break; +case 233: +/* #line 1053 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ nstars = 0; yyval.namval = yypt[-0].yyv.namval; } break; +case 234: +/* #line 1057 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = yypt[-0].yyv.expval ? mkchain((char *)yypt[-0].yyv.expval,CHNULL) : CHNULL; } break; +case 235: +/* #line 1059 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = yypt[-0].yyv.expval ? mkchain((char *)yypt[-0].yyv.expval, yypt[-2].yyv.chval) : yypt[-2].yyv.chval; } break; +case 237: +/* #line 1064 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(nstars < maxlablist) labarray[nstars++] = yypt[-0].yyv.labval; yyval.expval = 0; } break; +case 238: +/* #line 1068 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = 0; } break; +case 239: +/* #line 1070 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = 2; } break; +case 240: +/* #line 1074 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, CHNULL); } break; +case 241: +/* #line 1076 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = hookup(yypt[-2].yyv.chval, mkchain((char *)yypt[-0].yyv.expval,CHNULL) ); } break; +case 242: +/* #line 1080 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + +/* This next statement depends on the ordering of the state table encoding */ + + if(parstate < INDATA) enddcl(); + } break; +case 243: +/* #line 1093 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ intonly = YES; } break; +case 244: +/* #line 1097 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ intonly = NO; } break; +case 245: +/* #line 1102 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ endio(); } break; +case 247: +/* #line 1107 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSUNIT, yypt[-0].yyv.expval); endioctl(); } break; +case 248: +/* #line 1109 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSUNIT, ENULL); endioctl(); } break; +case 249: +/* #line 1111 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSUNIT, IOSTDERR); endioctl(); } break; +case 251: +/* #line 1114 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(CHNULL); } break; +case 252: +/* #line 1116 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(CHNULL); } break; +case 253: +/* #line 1118 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 254: +/* #line 1120 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 255: +/* #line 1122 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 256: +/* #line 1124 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(CHNULL); } break; +case 257: +/* #line 1126 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 258: +/* #line 1128 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 259: +/* #line 1130 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(CHNULL); } break; +case 260: +/* #line 1132 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ doio(revchain(yypt[-0].yyv.chval)); } break; +case 262: +/* #line 1139 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOBACKSPACE; } break; +case 263: +/* #line 1141 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOREWIND; } break; +case 264: +/* #line 1143 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOENDFILE; } break; +case 266: +/* #line 1150 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOINQUIRE; } break; +case 267: +/* #line 1152 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOOPEN; } break; +case 268: +/* #line 1154 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOCLOSE; } break; +case 269: +/* #line 1158 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, yypt[-0].yyv.expval); + endioctl(); + } break; +case 270: +/* #line 1164 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } break; +case 271: +/* #line 1172 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + ioclause(IOSUNIT, yypt[-1].yyv.expval); + endioctl(); + } break; +case 272: +/* #line 1177 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ endioctl(); } break; +case 275: +/* #line 1185 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSPOSITIONAL, yypt[-0].yyv.expval); } break; +case 276: +/* #line 1187 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSPOSITIONAL, ENULL); } break; +case 277: +/* #line 1189 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(IOSPOSITIONAL, IOSTDERR); } break; +case 278: +/* #line 1191 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(yypt[-1].yyv.ival, yypt[-0].yyv.expval); } break; +case 279: +/* #line 1193 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(yypt[-1].yyv.ival, ENULL); } break; +case 280: +/* #line 1195 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ ioclause(yypt[-1].yyv.ival, IOSTDERR); } break; +case 281: +/* #line 1199 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.ival = iocname(); } break; +case 282: +/* #line 1203 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOREAD; } break; +case 283: +/* #line 1207 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ iostmt = IOWRITE; } break; +case 284: +/* #line 1211 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, yypt[-1].yyv.expval); + endioctl(); + } break; +case 285: +/* #line 1218 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } break; +case 286: +/* #line 1227 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, CHNULL); } break; +case 287: +/* #line 1229 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, yypt[-2].yyv.chval); } break; +case 288: +/* #line 1233 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) yypt[-0].yyv.expval; } break; +case 289: +/* #line 1235 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) mkiodo(yypt[-1].yyv.chval,revchain(yypt[-3].yyv.chval)); } break; +case 290: +/* #line 1239 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, CHNULL); } break; +case 291: +/* #line 1241 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, CHNULL); } break; +case 293: +/* #line 1246 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, mkchain((char *)yypt[-2].yyv.expval, CHNULL) ); } break; +case 294: +/* #line 1248 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, mkchain((char *)yypt[-2].yyv.expval, CHNULL) ); } break; +case 295: +/* #line 1250 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, mkchain((char *)yypt[-2].yyv.tagval, CHNULL) ); } break; +case 296: +/* #line 1252 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, mkchain((char *)yypt[-2].yyv.tagval, CHNULL) ); } break; +case 297: +/* #line 1254 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.expval, yypt[-2].yyv.chval); } break; +case 298: +/* #line 1256 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.chval = mkchain((char *)yypt[-0].yyv.tagval, yypt[-2].yyv.chval); } break; +case 299: +/* #line 1260 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) yypt[-0].yyv.expval; } break; +case 300: +/* #line 1262 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) yypt[-1].yyv.expval; } break; +case 301: +/* #line 1264 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) mkiodo(yypt[-1].yyv.chval, mkchain((char *)yypt[-3].yyv.expval, CHNULL) ); } break; +case 302: +/* #line 1266 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) mkiodo(yypt[-1].yyv.chval, mkchain((char *)yypt[-3].yyv.tagval, CHNULL) ); } break; +case 303: +/* #line 1268 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ yyval.tagval = (tagptr) mkiodo(yypt[-1].yyv.chval, revchain(yypt[-3].yyv.chval)); } break; +case 304: +/* #line 1272 "/n/bopp/v5/dmg/f2c/gram.in" */ +{ startioctl(); } break; + } + goto yystack; /* stack new state and value */ +} diff --git a/tools/connec/src/gram.dcl b/tools/connec/src/gram.dcl new file mode 100644 index 0000000..e5c5df0 --- /dev/null +++ b/tools/connec/src/gram.dcl @@ -0,0 +1,416 @@ +spec: dcl + | common + | external + | intrinsic + | equivalence + | data + | implicit + | namelist + | SSAVE + { NO66("SAVE statement"); + saveall = YES; } + | SSAVE savelist + { NO66("SAVE statement"); } + | SFORMAT + { fmtstmt(thislabel); setfmt(thislabel); } + | SPARAM in_dcl SLPAR paramlist SRPAR + { NO66("PARAMETER statement"); } + ; + +dcl: type opt_comma name in_dcl new_dcl dims lengspec + { settype($3, $1, $7); + if(ndim>0) setbound($3,ndim,dims); + } + | dcl SCOMMA name dims lengspec + { settype($3, $1, $5); + if(ndim>0) setbound($3,ndim,dims); + } + | dcl SSLASHD datainit vallist SSLASHD + { if (new_dcl == 2) { + err("attempt to give DATA in type-declaration"); + new_dcl = 1; + } + } + ; + +new_dcl: { new_dcl = 2; } ; + +type: typespec lengspec + { varleng = $2; } + ; + +typespec: typename + { varleng = ($1<0 || ONEOF($1,M(TYLOGICAL)|M(TYLONG)) + ? 0 : typesize[$1]); + vartype = $1; } + ; + +typename: SINTEGER { $$ = TYLONG; } + | SREAL { $$ = tyreal; } + | SCOMPLEX { ++complex_seen; $$ = tycomplex; } + | SDOUBLE { $$ = TYDREAL; } + | SDCOMPLEX { ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; } + | SLOGICAL { $$ = TYLOGICAL; } + | SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; } + | SUNDEFINED { $$ = TYUNKNOWN; } + | SDIMENSION { $$ = TYUNKNOWN; } + | SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; } + | SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; } + | SBYTE { $$ = TYINT1; } + ; + +lengspec: + { $$ = varleng; } + | SSTAR intonlyon expr intonlyoff + { + expptr p; + p = $3; + NO66("length specification *n"); + if( ! ISICON(p) || p->constblock.Const.ci <= 0 ) + { + $$ = 0; + dclerr("length must be a positive integer constant", + NPNULL); + } + else { + if (vartype == TYCHAR) + $$ = p->constblock.Const.ci; + else switch((int)p->constblock.Const.ci) { + case 1: $$ = 1; break; + case 2: $$ = typesize[TYSHORT]; break; + case 4: $$ = typesize[TYLONG]; break; + case 8: $$ = typesize[TYDREAL]; break; + case 16: $$ = typesize[TYDCOMPLEX]; break; + default: + dclerr("invalid length",NPNULL); + $$ = varleng; + } + } + } + | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff + { NO66("length specification *(*)"); $$ = -1; } + ; + +common: SCOMMON in_dcl var + { incomm( $$ = comblock("") , $3 ); } + | SCOMMON in_dcl comblock var + { $$ = $3; incomm($3, $4); } + | common opt_comma comblock opt_comma var + { $$ = $3; incomm($3, $5); } + | common SCOMMA var + { incomm($1, $3); } + ; + +comblock: SCONCAT + { $$ = comblock(""); } + | SSLASH SNAME SSLASH + { $$ = comblock(token); } + ; + +external: SEXTERNAL in_dcl name + { setext($3); } + | external SCOMMA name + { setext($3); } + ; + +intrinsic: SINTRINSIC in_dcl name + { NO66("INTRINSIC statement"); setintr($3); } + | intrinsic SCOMMA name + { setintr($3); } + ; + +equivalence: SEQUIV in_dcl equivset + | equivalence SCOMMA equivset + ; + +equivset: SLPAR equivlist SRPAR + { + struct Equivblock *p; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + p = & eqvclass[nequiv++]; + p->eqvinit = NO; + p->eqvbottom = 0; + p->eqvtop = 0; + p->equivs = $2; + } + ; + +equivlist: lhs + { $$=ALLOC(Eqvchain); + $$->eqvitem.eqvlhs = primchk($1); + } + | equivlist SCOMMA lhs + { $$=ALLOC(Eqvchain); + $$->eqvitem.eqvlhs = primchk($3); + $$->eqvnextp = $1; + } + ; + +data: SDATA in_data datalist + | data opt_comma datalist + ; + +in_data: + { if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + if(parstate < INDATA) + { + enddcl(); + parstate = INDATA; + datagripe = 1; + } + } + ; + +datalist: datainit datavarlist SSLASH datapop vallist SSLASH + { ftnint junk; + if(nextdata(&junk) != NULL) + err("too few initializers"); + frdata($2); + frrpl(); + } + ; + +datainit: /* nothing */ { frchain(&datastack); curdtp = 0; } ; + +datapop: /* nothing */ { pop_datastack(); } ; + +vallist: { toomanyinit = NO; } val + | vallist SCOMMA val + ; + +val: value + { dataval(ENULL, $1); } + | simple SSTAR value + { dataval($1, $3); } + ; + +value: simple + | addop simple + { if( $1==OPMINUS && ISCONST($2) ) + consnegop((Constp)$2); + $$ = $2; + } + | complex_const + ; + +savelist: saveitem + | savelist SCOMMA saveitem + ; + +saveitem: name + { int k; + $1->vsave = YES; + k = $1->vstg; + if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) ) + dclerr("can only save static variables", $1); + } + | comblock + ; + +paramlist: paramitem + | paramlist SCOMMA paramitem + ; + +paramitem: name SEQUALS expr + { if($1->vclass == CLUNKNOWN) + make_param((struct Paramblock *)$1, $3); + else dclerr("cannot make into parameter", $1); + } + ; + +var: name dims + { if(ndim>0) setbound($1, ndim, dims); } + ; + +datavar: lhs + { Namep np; + struct Primblock *pp = (struct Primblock *)$1; + int tt = $1->tag; + if (tt != TPRIM) { + if (tt == TCONST) + err("parameter in data statement"); + else + erri("tag %d in data statement",tt); + $$ = 0; + err_lineno = lineno; + break; + } + np = pp -> namep; + vardcl(np); + if ((pp->fcharp || pp->lcharp) + && (np->vtype != TYCHAR || np->vdim && !pp->argsp)) + sserr(np); + if(np->vstg == STGCOMMON) + extsymtab[np->vardesc.varno].extinit = YES; + else if(np->vstg==STGEQUIV) + eqvclass[np->vardesc.varno].eqvinit = YES; + else if(np->vstg!=STGINIT && np->vstg!=STGBSS) { + errstr(np->vstg == STGARG + ? "Dummy argument \"%.60s\" in data statement." + : "Cannot give data to \"%.75s\"", + np->fvarname); + $$ = 0; + err_lineno = lineno; + break; + } + $$ = mkchain((char *)$1, CHNULL); + } + | SLPAR datavarlist SCOMMA dospec SRPAR + { chainp p; struct Impldoblock *q; + pop_datastack(); + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + (q->varnp = (Namep) ($4->datap))->vimpldovar = 1; + p = $4->nextp; + if(p) { q->implb = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impub = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impstep = (expptr)(p->datap); } + frchain( & ($4) ); + $$ = mkchain((char *)q, CHNULL); + q->datalist = hookup($2, $$); + } + ; + +datavarlist: datavar + { if (!datastack) + curdtp = 0; + datastack = mkchain((char *)curdtp, datastack); + curdtp = $1; curdtelt = 0; + } + | datavarlist SCOMMA datavar + { $$ = hookup($1, $3); } + ; + +dims: + { ndim = 0; } + | SLPAR dimlist SRPAR + ; + +dimlist: { ndim = 0; } dim + | dimlist SCOMMA dim + ; + +dim: ubound + { + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = 0; + dims[ndim].ub = $1; + } + ++ndim; + } + | expr SCOLON ubound + { + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = $1; + dims[ndim].ub = $3; + } + ++ndim; + } + ; + +ubound: SSTAR + { $$ = 0; } + | expr + ; + +labellist: label + { nstars = 1; labarray[0] = $1; } + | labellist SCOMMA label + { if(nstars < maxlablist) labarray[nstars++] = $3; } + ; + +label: SICON + { $$ = execlab( convci(toklen, token) ); } + ; + +implicit: SIMPLICIT in_dcl implist + { NO66("IMPLICIT statement"); } + | implicit SCOMMA implist + ; + +implist: imptype SLPAR letgroups SRPAR + | imptype + { if (vartype != TYUNKNOWN) + dclerr("-- expected letter range",NPNULL); + setimpl(vartype, varleng, 'a', 'z'); } + ; + +imptype: { needkwd = 1; } type + /* { vartype = $2; } */ + ; + +letgroups: letgroup + | letgroups SCOMMA letgroup + ; + +letgroup: letter + { setimpl(vartype, varleng, $1, $1); } + | letter SMINUS letter + { setimpl(vartype, varleng, $1, $3); } + ; + +letter: SNAME + { if(toklen!=1 || token[0]<'a' || token[0]>'z') + { + dclerr("implicit item must be single letter", NPNULL); + $$ = 0; + } + else $$ = token[0]; + } + ; + +namelist: SNAMELIST + | namelist namelistentry + ; + +namelistentry: SSLASH name SSLASH namelistlist + { + if($2->vclass == CLUNKNOWN) + { + $2->vclass = CLNAMELIST; + $2->vtype = TYINT; + $2->vstg = STGBSS; + $2->varxptr.namelist = $4; + $2->vardesc.varno = ++lastvarno; + } + else dclerr("cannot be a namelist name", $2); + } + ; + +namelistlist: name + { $$ = mkchain((char *)$1, CHNULL); } + | namelistlist SCOMMA name + { $$ = hookup($1, mkchain((char *)$3, CHNULL)); } + ; + +in_dcl: + { switch(parstate) + { + case OUTSIDE: newproc(); + startproc(ESNULL, CLMAIN); + case INSIDE: parstate = INDCL; + case INDCL: break; + + case INDATA: + if (datagripe) { + errstr( + "Statement order error: declaration after DATA", + CNULL); + datagripe = 0; + } + break; + + default: + dclerr("declaration among executables", NPNULL); + } + } + ; diff --git a/tools/connec/src/gram.exec b/tools/connec/src/gram.exec new file mode 100644 index 0000000..98a94f9 --- /dev/null +++ b/tools/connec/src/gram.exec @@ -0,0 +1,143 @@ +exec: iffable + | SDO end_spec label opt_comma dospecw + { + if($3->labdefined) + execerr("no backward DO loops", CNULL); + $3->blklevel = blklevel+1; + exdo($3->labelno, NPNULL, $5); + } + | SDO end_spec opt_comma dospecw + { + exdo((int)(ctls - ctlstack - 2), NPNULL, $4); + NOEXT("DO without label"); + } + | SENDDO + { exenddo(NPNULL); } + | logif iffable + { exendif(); thiswasbranch = NO; } + | logif STHEN + | SELSEIF end_spec SLPAR {westart(1);} expr SRPAR STHEN + { exelif($5); lastwasbranch = NO; } + | SELSE end_spec + { exelse(); lastwasbranch = NO; } + | SENDIF end_spec + { exendif(); lastwasbranch = NO; } + ; + +logif: SLOGIF end_spec SLPAR expr SRPAR + { exif($4); } + ; + +dospec: name SEQUALS exprlist + { $$ = mkchain((char *)$1, $3); } + ; + +dospecw: dospec + | SWHILE {westart(0);} SLPAR expr SRPAR + { $$ = mkchain(CNULL, (chainp)$4); } + ; + +iffable: let lhs SEQUALS expr + { exequals((struct Primblock *)$2, $4); } + | SASSIGN end_spec assignlabel STO name + { exassign($5, $3); } + | SCONTINUE end_spec + | goto + | io + { inioctl = NO; } + | SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label + { exarif($4, $6, $8, $10); thiswasbranch = YES; } + | call + { excall($1, LBNULL, 0, labarray); } + | call SLPAR SRPAR + { excall($1, LBNULL, 0, labarray); } + | call SLPAR callarglist SRPAR + { if(nstars < maxlablist) + excall($1, mklist(revchain($3)), nstars, labarray); + else + many("alternate returns", 'l', maxlablist); + } + | SRETURN end_spec opt_expr + { exreturn($3); thiswasbranch = YES; } + | stop end_spec opt_expr + { exstop($1, $3); thiswasbranch = $1; } + ; + +assignlabel: SICON + { $$ = mklabel( convci(toklen, token) ); } + ; + +let: SLET + { if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + } + ; + +goto: SGOTO end_spec label + { exgoto($3); thiswasbranch = YES; } + | SASGOTO end_spec name + { exasgoto($3); thiswasbranch = YES; } + | SASGOTO end_spec name opt_comma SLPAR labellist SRPAR + { exasgoto($3); thiswasbranch = YES; } + | SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr + { if(nstars < maxlablist) + putcmgo(putx(fixtype($7)), nstars, labarray); + else + many("labels in computed GOTO list", 'l', maxlablist); + } + ; + +opt_comma: + | SCOMMA + ; + +call: SCALL end_spec name + { nstars = 0; $$ = $3; } + ; + +callarglist: callarg + { $$ = $1 ? mkchain((char *)$1,CHNULL) : CHNULL; } + | callarglist SCOMMA callarg + { $$ = $3 ? mkchain((char *)$3, $1) : $1; } + ; + +callarg: expr + | SSTAR label + { if(nstars < maxlablist) labarray[nstars++] = $2; $$ = 0; } + ; + +stop: SPAUSE + { $$ = 0; } + | SSTOP + { $$ = 2; } + ; + +exprlist: expr + { $$ = mkchain((char *)$1, CHNULL); } + | exprlist SCOMMA expr + { $$ = hookup($1, mkchain((char *)$3,CHNULL) ); } + ; + +end_spec: + { if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + +/* This next statement depends on the ordering of the state table encoding */ + + if(parstate < INDATA) enddcl(); + } + ; + +intonlyon: + { intonly = YES; } + ; + +intonlyoff: + { intonly = NO; } + ; diff --git a/tools/connec/src/gram.expr b/tools/connec/src/gram.expr new file mode 100644 index 0000000..b6ce6ff --- /dev/null +++ b/tools/connec/src/gram.expr @@ -0,0 +1,146 @@ +funarglist: + { $$ = 0; } + | funargs + { $$ = revchain($1); } + ; + +funargs: expr + { $$ = mkchain((char *)$1, CHNULL); } + | funargs SCOMMA expr + { $$ = mkchain((char *)$3, $1); } + ; + + +expr: uexpr + | SLPAR expr SRPAR { $$ = $2; if ($$->tag == TPRIM) + paren_used(&$$->primblock); } + | complex_const + ; + +uexpr: lhs + | simple_const + | expr addop expr %prec SPLUS + { $$ = mkexpr($2, $1, $3); } + | expr SSTAR expr + { $$ = mkexpr(OPSTAR, $1, $3); } + | expr SSLASH expr + { $$ = mkexpr(OPSLASH, $1, $3); } + | expr SPOWER expr + { $$ = mkexpr(OPPOWER, $1, $3); } + | addop expr %prec SSTAR + { if($1 == OPMINUS) + $$ = mkexpr(OPNEG, $2, ENULL); + else { + $$ = $2; + if ($$->tag == TPRIM) + paren_used(&$$->primblock); + } + } + | expr relop expr %prec SEQ + { $$ = mkexpr($2, $1, $3); } + | expr SEQV expr + { NO66(".EQV. operator"); + $$ = mkexpr(OPEQV, $1,$3); } + | expr SNEQV expr + { NO66(".NEQV. operator"); + $$ = mkexpr(OPNEQV, $1, $3); } + | expr SOR expr + { $$ = mkexpr(OPOR, $1, $3); } + | expr SAND expr + { $$ = mkexpr(OPAND, $1, $3); } + | SNOT expr + { $$ = mkexpr(OPNOT, $2, ENULL); } + | expr SCONCAT expr + { NO66("concatenation operator //"); + $$ = mkexpr(OPCONCAT, $1, $3); } + ; + +addop: SPLUS { $$ = OPPLUS; } + | SMINUS { $$ = OPMINUS; } + ; + +relop: SEQ { $$ = OPEQ; } + | SGT { $$ = OPGT; } + | SLT { $$ = OPLT; } + | SGE { $$ = OPGE; } + | SLE { $$ = OPLE; } + | SNE { $$ = OPNE; } + ; + +lhs: name + { $$ = mkprim($1, LBNULL, CHNULL); } + | name substring + { NO66("substring operator :"); + $$ = mkprim($1, LBNULL, $2); } + | name SLPAR funarglist SRPAR + { $$ = mkprim($1, mklist($3), CHNULL); } + | name SLPAR funarglist SRPAR substring + { NO66("substring operator :"); + $$ = mkprim($1, mklist($3), $5); } + ; + +substring: SLPAR opt_expr SCOLON opt_expr SRPAR + { $$ = mkchain((char *)$2, mkchain((char *)$4,CHNULL)); } + ; + +opt_expr: + { $$ = 0; } + | expr + ; + +simple: name + { if($1->vclass == CLPARAM) + $$ = (expptr) cpexpr( + ( (struct Paramblock *) ($1) ) -> paramval); + } + | simple_const + ; + +simple_const: STRUE { $$ = mklogcon(1); } + | SFALSE { $$ = mklogcon(0); } + | SHOLLERITH { $$ = mkstrcon(toklen, token); } + | SICON = { $$ = mkintqcon(toklen, token); } + | SRCON = { $$ = mkrealcon(tyreal, token); } + | SDCON = { $$ = mkrealcon(TYDREAL, token); } + | bit_const + ; + +complex_const: SLPAR uexpr SCOMMA uexpr SRPAR + { $$ = mkcxcon($2,$4); } + ; + +bit_const: SHEXCON + { NOEXT("hex constant"); + $$ = mkbitcon(4, toklen, token); } + | SOCTCON + { NOEXT("octal constant"); + $$ = mkbitcon(3, toklen, token); } + | SBITCON + { NOEXT("binary constant"); + $$ = mkbitcon(1, toklen, token); } + ; + +fexpr: unpar_fexpr + | SLPAR fexpr SRPAR + { $$ = $2; } + ; + +unpar_fexpr: lhs + | simple_const + | fexpr addop fexpr %prec SPLUS + { $$ = mkexpr($2, $1, $3); } + | fexpr SSTAR fexpr + { $$ = mkexpr(OPSTAR, $1, $3); } + | fexpr SSLASH fexpr + { $$ = mkexpr(OPSLASH, $1, $3); } + | fexpr SPOWER fexpr + { $$ = mkexpr(OPPOWER, $1, $3); } + | addop fexpr %prec SSTAR + { if($1 == OPMINUS) + $$ = mkexpr(OPNEG, $2, ENULL); + else $$ = $2; + } + | fexpr SCONCAT fexpr + { NO66("concatenation operator //"); + $$ = mkexpr(OPCONCAT, $1, $3); } + ; diff --git a/tools/connec/src/gram.head b/tools/connec/src/gram.head new file mode 100644 index 0000000..be17cd2 --- /dev/null +++ b/tools/connec/src/gram.head @@ -0,0 +1,293 @@ +/**************************************************************** +Copyright 1990, 1993 by AT&T Bell Laboratories, Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +%{ +#include "defs.h" +#include "p1defs.h" + +static int nstars; /* Number of labels in an + alternate return CALL */ +static int datagripe; +static int ndim; +static int vartype; +int new_dcl; +static ftnint varleng; +static struct Dims dims[MAXDIM+1]; +extern struct Labelblock **labarray; /* Labels in an alternate + return CALL */ +extern int maxlablist; + +/* The next two variables are used to verify that each statement might be reached + during runtime. lastwasbranch is tested only in the defintion of the + stat: nonterminal. */ + +int lastwasbranch = NO; +static int thiswasbranch = NO; +extern ftnint yystno; +extern flag intonly; +static chainp datastack; +extern long laststfcn, thisstno; +extern int can_include; /* for netlib */ +extern void endcheck Argdcl((void)); +extern struct Primblock *primchk Argdcl((expptr)); + +#define ESNULL (Extsym *)0 +#define NPNULL (Namep)0 +#define LBNULL (struct Listblock *)0 + + static void +pop_datastack(Void) { + chainp d0 = datastack; + if (d0->datap) + curdtp = (chainp)d0->datap; + datastack = d0->nextp; + d0->nextp = 0; + frchain(&d0); + } + +%} + +/* Specify precedences and associativities. */ + +%union { + int ival; + ftnint lval; + char *charpval; + chainp chval; + tagptr tagval; + expptr expval; + struct Labelblock *labval; + struct Nameblock *namval; + struct Eqvchain *eqvval; + Extsym *extval; + } + +%left SCOMMA +%nonassoc SCOLON +%right SEQUALS +%left SEQV SNEQV +%left SOR +%left SAND +%left SNOT +%nonassoc SLT SGT SLE SGE SEQ SNE +%left SCONCAT +%left SPLUS SMINUS +%left SSTAR SSLASH +%right SPOWER + +%start program +%type thislabel label assignlabel +%type other inelt +%type type typespec typename dcl letter addop relop stop nameeq +%type lengspec +%type filename +%type datavar datavarlist namelistlist funarglist funargs +%type dospec dospecw +%type callarglist arglist args exprlist inlist outlist out2 substring +%type name arg call var +%type lhs expr uexpr opt_expr fexpr unpar_fexpr +%type ubound simple value callarg complex_const simple_const bit_const +%type common comblock entryname progname +%type equivlist + +%% + +program: + | program stat SEOS + ; + +stat: thislabel entry + { +/* stat: is the nonterminal for Fortran statements */ + + lastwasbranch = NO; } + | thislabel spec + | thislabel exec + { /* forbid further statement function definitions... */ + if (parstate == INDATA && laststfcn != thisstno) + parstate = INEXEC; + thisstno++; + if($1 && ($1->labelno==dorange)) + enddo($1->labelno); + if(lastwasbranch && thislabel==NULL) + warn("statement cannot be reached"); + lastwasbranch = thiswasbranch; + thiswasbranch = NO; + if($1) + { + if($1->labtype == LABFORMAT) + err("label already that of a format"); + else + $1->labtype = LABEXEC; + } + freetemps(); + } + | thislabel SINCLUDE filename + { if (can_include) + doinclude( $3 ); + else { + fprintf(diagfile, "Cannot open file %s\n", $3); + done(1); + } + } + | thislabel SEND end_spec + { if ($1) + lastwasbranch = NO; + endcheck(); + endproc(); /* lastwasbranch = NO; -- set in endproc() */ + } + | thislabel SUNKNOWN + { unclassifiable(); + +/* flline flushes the current line, ignoring the rest of the text there */ + + flline(); } + | error + { flline(); needkwd = NO; inioctl = NO; + yyerrok; yyclearin; } + ; + +thislabel: SLABEL + { + if(yystno != 0) + { + $$ = thislabel = mklabel(yystno); + if( ! headerdone ) { + if (procclass == CLUNKNOWN) + procclass = CLMAIN; + puthead(CNULL, procclass); + } + if(thislabel->labdefined) + execerr("label %s already defined", + convic(thislabel->stateno) ); + else { + if(thislabel->blklevel!=0 && thislabel->blklevellabtype!=LABFORMAT) + warn1("there is a branch to label %s from outside block", + convic( (ftnint) (thislabel->stateno) ) ); + thislabel->blklevel = blklevel; + thislabel->labdefined = YES; + if(thislabel->labtype != LABFORMAT) + p1_label((long)(thislabel - labeltab)); + } + } + else $$ = thislabel = NULL; + } + ; + +entry: SPROGRAM new_proc progname + {startproc($3, CLMAIN); } + | SPROGRAM new_proc progname progarglist + { warn("ignoring arguments to main program"); + /* hashclear(); */ + startproc($3, CLMAIN); } + | SBLOCK new_proc progname + { if($3) NO66("named BLOCKDATA"); + startproc($3, CLBLOCK); } + | SSUBROUTINE new_proc entryname arglist + { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); } + | SFUNCTION new_proc entryname arglist + { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); } + | type SFUNCTION new_proc entryname arglist + { entrypt(CLPROC, $1, varleng, $4, $5); } + | SENTRY entryname arglist + { if(parstate==OUTSIDE || procclass==CLMAIN + || procclass==CLBLOCK) + execerr("misplaced entry statement", CNULL); + entrypt(CLENTRY, 0, (ftnint) 0, $2, $3); + } + ; + +new_proc: + { newproc(); } + ; + +entryname: name + { $$ = newentry($1, 1); } + ; + +name: SNAME + { $$ = mkname(token); } + ; + +progname: { $$ = NULL; } + | entryname + ; + +progarglist: + SLPAR SRPAR + | SLPAR progargs SRPAR + ; + +progargs: progarg + | progargs SCOMMA progarg + ; + +progarg: SNAME + | SNAME SEQUALS SNAME + ; + +arglist: + { $$ = 0; } + | SLPAR SRPAR + { NO66(" () argument list"); + $$ = 0; } + | SLPAR args SRPAR + {$$ = $2; } + ; + +args: arg + { $$ = ($1 ? mkchain((char *)$1,CHNULL) : CHNULL ); } + | args SCOMMA arg + { if($3) $1 = $$ = mkchain((char *)$3, $1); } + ; + +arg: name + { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG) + dclerr("name declared as argument after use", $1); + $1->vstg = STGARG; + } + | SSTAR + { NO66("altenate return argument"); + +/* substars means that '*'ed formal parameters should be replaced. + This is used to specify alternate return labels; in theory, only + parameter slots which have '*' should accept the statement labels. + This compiler chooses to ignore the '*'s in the formal declaration, and + always return the proper value anyway. + + This variable is only referred to in proc.c */ + + $$ = 0; substars = YES; } + ; + + + +filename: SHOLLERITH + { + char *s; + s = copyn(toklen+1, token); + s[toklen] = '\0'; + $$ = s; + } + ; diff --git a/tools/connec/src/gram.io b/tools/connec/src/gram.io new file mode 100644 index 0000000..00ff0f2 --- /dev/null +++ b/tools/connec/src/gram.io @@ -0,0 +1,175 @@ + /* Input/Output Statements */ + +io: io1 + { endio(); } + ; + +io1: iofmove ioctl + | iofmove unpar_fexpr + { ioclause(IOSUNIT, $2); endioctl(); } + | iofmove SSTAR + { ioclause(IOSUNIT, ENULL); endioctl(); } + | iofmove SPOWER + { ioclause(IOSUNIT, IOSTDERR); endioctl(); } + | iofctl ioctl + | read ioctl + { doio(CHNULL); } + | read infmt + { doio(CHNULL); } + | read ioctl inlist + { doio(revchain($3)); } + | read infmt SCOMMA inlist + { doio(revchain($4)); } + | read ioctl SCOMMA inlist + { doio(revchain($4)); } + | write ioctl + { doio(CHNULL); } + | write ioctl outlist + { doio(revchain($3)); } + | write ioctl SCOMMA outlist + { doio(revchain($4)); } + | print + { doio(CHNULL); } + | print SCOMMA outlist + { doio(revchain($3)); } + ; + +iofmove: fmkwd end_spec in_ioctl + ; + +fmkwd: SBACKSPACE + { iostmt = IOBACKSPACE; } + | SREWIND + { iostmt = IOREWIND; } + | SENDFILE + { iostmt = IOENDFILE; } + ; + +iofctl: ctlkwd end_spec in_ioctl + ; + +ctlkwd: SINQUIRE + { iostmt = IOINQUIRE; } + | SOPEN + { iostmt = IOOPEN; } + | SCLOSE + { iostmt = IOCLOSE; } + ; + +infmt: unpar_fexpr + { + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, $1); + endioctl(); + } + | SSTAR + { + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } + ; + +ioctl: SLPAR fexpr SRPAR + { + ioclause(IOSUNIT, $2); + endioctl(); + } + | SLPAR ctllist SRPAR + { endioctl(); } + ; + +ctllist: ioclause + | ctllist SCOMMA ioclause + ; + +ioclause: fexpr + { ioclause(IOSPOSITIONAL, $1); } + | SSTAR + { ioclause(IOSPOSITIONAL, ENULL); } + | SPOWER + { ioclause(IOSPOSITIONAL, IOSTDERR); } + | nameeq expr + { ioclause($1, $2); } + | nameeq SSTAR + { ioclause($1, ENULL); } + | nameeq SPOWER + { ioclause($1, IOSTDERR); } + ; + +nameeq: SNAMEEQ + { $$ = iocname(); } + ; + +read: SREAD end_spec in_ioctl + { iostmt = IOREAD; } + ; + +write: SWRITE end_spec in_ioctl + { iostmt = IOWRITE; } + ; + +print: SPRINT end_spec fexpr in_ioctl + { + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, $3); + endioctl(); + } + | SPRINT end_spec SSTAR in_ioctl + { + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } + ; + +inlist: inelt + { $$ = mkchain((char *)$1, CHNULL); } + | inlist SCOMMA inelt + { $$ = mkchain((char *)$3, $1); } + ; + +inelt: lhs + { $$ = (tagptr) $1; } + | SLPAR inlist SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4,revchain($2)); } + ; + +outlist: uexpr + { $$ = mkchain((char *)$1, CHNULL); } + | other + { $$ = mkchain((char *)$1, CHNULL); } + | out2 + ; + +out2: uexpr SCOMMA uexpr + { $$ = mkchain((char *)$3, mkchain((char *)$1, CHNULL) ); } + | uexpr SCOMMA other + { $$ = mkchain((char *)$3, mkchain((char *)$1, CHNULL) ); } + | other SCOMMA uexpr + { $$ = mkchain((char *)$3, mkchain((char *)$1, CHNULL) ); } + | other SCOMMA other + { $$ = mkchain((char *)$3, mkchain((char *)$1, CHNULL) ); } + | out2 SCOMMA uexpr + { $$ = mkchain((char *)$3, $1); } + | out2 SCOMMA other + { $$ = mkchain((char *)$3, $1); } + ; + +other: complex_const + { $$ = (tagptr) $1; } + | SLPAR expr SRPAR + { $$ = (tagptr) $2; } + | SLPAR uexpr SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, mkchain((char *)$2, CHNULL) ); } + | SLPAR other SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, mkchain((char *)$2, CHNULL) ); } + | SLPAR out2 SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, revchain($2)); } + ; + +in_ioctl: + { startioctl(); } + ; diff --git a/tools/connec/src/gram.o b/tools/connec/src/gram.o new file mode 100644 index 0000000000000000000000000000000000000000..ccacb08700d0499c1826ea3fbae0fbaa402f02d0 GIT binary patch literal 55936 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", + "address", + "integer1", + "shortint", + "integer", +#ifdef TYQUAD + "longint", +#endif + "real", + "doublereal", + "complex", + "doublecomplex", + "logical1", + "shortlogical", + "logical", + "char" /* character */ + }; + +int type_pref[NTYPES] = { 0, 0, 3, 5, 7, +#ifdef TYQUAD + 10, +#endif + 8, 11, 9, 12, 1, 4, 6, 2 }; + +char *protorettypes[] = { + "?", "??", "integer1", "shortint", "integer", +#ifdef TYQUAD + "longint", +#endif + "real", "doublereal", + "C_f", "Z_f", "logical1", "shortlogical", "logical", "H_f", "int" + }; + +char *casttypes[TYSUBR+1] = { + "U_fp", "??bug??", "I1_fp", + "J_fp", "I_fp", +#ifdef TYQUAD + "Q_fp", +#endif + "R_fp", "D_fp", "C_fp", "Z_fp", + "L1_fp", "L2_fp", "L_fp", "H_fp", "S_fp" + }; +char *usedcasts[TYSUBR+1]; + +char *dfltarg[] = { + 0, 0, "(integer1 *)0", + "(shortint *)0", "(integer *)0", +#ifdef TYQUAD + "(longint *)0", +#endif + "(real *)0", + "(doublereal *)0", "(complex *)0", "(doublecomplex *)0", + "(logical1 *)0","(shortlogical *)0", "(logical *)0", "(char *)0" + }; + +static char *dflt0proc[] = { + 0, 0, "(integer1 (*)())0", + "(shortint (*)())0", "(integer (*)())0", +#ifdef TYQUAD + "(longint (*)())0", +#endif + "(real (*)())0", + "(doublereal (*)())0", "(complex (*)())0", "(doublecomplex (*)())0", + "(logical1 (*)())0", "(shortlogical (*)())0", + "(logical (*)())0", "(char (*)())0", "(int (*)())0" + }; + +char *dflt1proc[] = { "(U_fp)0", "( ??bug?? )0", "(I1_fp)0", + "(J_fp)0", "(I_fp)0", +#ifdef TYQUAD + "(Q_fp)0", +#endif + "(R_fp)0", "(D_fp)0", "(C_fp)0", "(Z_fp)0", + "(L1_fp)0","(L2_fp)0", + "(L_fp)0", "(H_fp)0", "(S_fp)0" + }; + +char **dfltproc = dflt0proc; + +static char Bug[] = "bug"; + +char *ftn_types[] = { "external", "??", "integer*1", + "integer*2", "integer", +#ifdef TYQUAD + "integer*8", +#endif + "real", + "double precision", "complex", "double complex", + "logical*1", "logical*2", + "logical", "character", "subroutine", + Bug,Bug,Bug,Bug,Bug,Bug,Bug,Bug,Bug, "ftnlen" + }; + +int init_ac[TYSUBR+1] = { 0,0,0,0,0,0,0, +#ifdef TYQUAD + 0, +#endif + 1, 1, 0, 0, 0, 2}; + +int proctype = TYUNKNOWN; +char *procname; +int rtvlabel[NTYPES0]; +Addrp retslot; /* Holds automatic variable which was + allocated the function return value + */ +Addrp xretslot[NTYPES0]; /* for multiple entry points */ +int cxslot = -1; +int chslot = -1; +int chlgslot = -1; +int procclass = CLUNKNOWN; +int nentry; +int nallargs; +int nallchargs; +flag multitype; +ftnint procleng; +long lastiolabno; +long lastlabno; +int lastvarno; +int lastargslot; +int autonum[TYVOID]; +char *av_pfix[TYVOID] = {"??TYUNKNOWN??", "a","i1","s","i", +#ifdef TYQUAD + "i8", +#endif + "r","d","q","z","L1","L2","L","ch", + "??TYSUBR??", "??TYERROR??","ci", "ici", + "o", "cl", "al", "ioin" }; + +extern int maxctl; +struct Ctlframe *ctls; +struct Ctlframe *ctlstack; +struct Ctlframe *lastctl; + +Namep regnamep[MAXREGVAR]; +int highregvar; +int nregvar; + +extern int maxext; +Extsym *extsymtab; +Extsym *nextext; +Extsym *lastext; + +extern int maxequiv; +struct Equivblock *eqvclass; + +extern int maxhash; +struct Hashentry *hashtab; +struct Hashentry *lasthash; + +extern int maxstno; /* Maximum number of statement labels */ +struct Labelblock *labeltab; +struct Labelblock *labtabend; +struct Labelblock *highlabtab; + +int maxdim = MAXDIM; +struct Rplblock *rpllist = NULL; +struct Chain *curdtp = NULL; +flag toomanyinit; +ftnint curdtelt; +chainp templist[TYVOID]; +chainp holdtemps; +int dorange = 0; +struct Entrypoint *entries = NULL; + +chainp chains = NULL; + +flag inioctl; +int iostmt; +int nioctl; +int nequiv = 0; +int eqvstart = 0; +int nintnames = 0; +extern int maxlablist; +struct Labelblock **labarray; + +struct Literal *litpool; +int nliterals; + +char dflttype[26]; +unsigned char hextoi_tab[Table_size], Letters[Table_size]; +char *ei_first, *ei_next, *ei_last; +char *wh_first, *wh_next, *wh_last; +#ifdef TYQUAD +unsigned long ff; +#endif + +#define ALLOCN(n,x) (struct x *) ckalloc((n)*sizeof(struct x)) + + void +fileinit(Void) +{ + register char *s; + register int i, j; + + lastiolabno = 100000; + lastlabno = 0; + lastvarno = 0; + nliterals = 0; + nerr = 0; + + infile = stdin; + + maxtoklen = 502; + token = (char *)ckalloc(maxtoklen+2); + memset(dflttype, tyreal, 26); + memset(dflttype + ('i' - 'a'), tyint, 6); + memset(hextoi_tab, 16, sizeof(hextoi_tab)); + for(i = 0, s = "0123456789abcdef"; *s; i++, s++) + hextoi(*s) = i; + for(i = 10, s = "ABCDEF"; *s; i++, s++) + hextoi(*s) = i; + for(j = 0, s = "abcdefghijklmnopqrstuvwxyz"; i = *s++; j++) + Letters[i] = Letters[i+'A'-'a'] = j; +#ifdef TYQUAD + /* Older C compilers may not understand UL suffixes. */ + /* It would be much simpler to use 0xffffffffUL some places... */ + ff = 0xffff; + ff = (ff << 16) | ff; +#endif + ctls = ALLOCN(maxctl+1, Ctlframe); + extsymtab = ALLOCN(maxext, Extsym); + eqvclass = ALLOCN(maxequiv, Equivblock); + hashtab = ALLOCN(maxhash, Hashentry); + labeltab = ALLOCN(maxstno, Labelblock); + litpool = ALLOCN(maxliterals, Literal); + labarray = (struct Labelblock **)ckalloc(maxlablist* + sizeof(struct Labelblock *)); + fmt_init(); + mem_init(); + np_init(); + + ctlstack = ctls++; + lastctl = ctls + maxctl; + nextext = extsymtab; + lastext = extsymtab + maxext; + lasthash = hashtab + maxhash; + labtabend = labeltab + maxstno; + highlabtab = labeltab; + main_alias[0] = '\0'; + if (forcedouble) + dfltproc[TYREAL] = dfltproc[TYDREAL]; + +/* Initialize the routines for providing C output */ + + out_init (); +} + + void +hashclear(Void) /* clear hash table */ +{ + register struct Hashentry *hp; + register Namep p; + register struct Dimblock *q; + register int i; + + for(hp = hashtab ; hp < lasthash ; ++hp) + if(p = hp->varp) + { + frexpr(p->vleng); + if(q = p->vdim) + { + for(i = 0 ; i < q->ndim ; ++i) + { + frexpr(q->dims[i].dimsize); + frexpr(q->dims[i].dimexpr); + } + frexpr(q->nelt); + frexpr(q->baseoffset); + frexpr(q->basexpr); + free( (charptr) q); + } + if(p->vclass == CLNAMELIST) + frchain( &(p->varxptr.namelist) ); + free( (charptr) p); + hp->varp = NULL; + } + } + + extern struct memblock *curmemblock, *firstmemblock; + extern char *mem_first, *mem_next, *mem_last, *mem0_last; + + void +procinit(Void) +{ + register struct Labelblock *lp; + struct Chain *cp; + int i; + struct memblock; + + curmemblock = firstmemblock; + mem_next = mem_first; + mem_last = mem0_last; + ei_next = ei_first = ei_last = 0; + wh_next = wh_first = wh_last = 0; + iob_list = 0; + for(i = 0; i < 9; i++) + io_structs[i] = 0; + + parstate = OUTSIDE; + headerdone = NO; + blklevel = 1; + saveall = NO; + substars = NO; + nwarn = 0; + thislabel = NULL; + needkwd = 0; + + proctype = TYUNKNOWN; + procname = "MAIN_"; + procclass = CLUNKNOWN; + nentry = 0; + nallargs = nallchargs = 0; + multitype = NO; + retslot = NULL; + for(i = 0; i < NTYPES0; i++) { + frexpr((expptr)xretslot[i]); + xretslot[i] = 0; + } + cxslot = -1; + chslot = -1; + chlgslot = -1; + procleng = 0; + blklevel = 1; + lastargslot = 0; + + for(lp = labeltab ; lp < labtabend ; ++lp) + lp->stateno = 0; + + hashclear(); + +/* Clear the list of newly generated identifiers from the previous + function */ + + frexchain(&new_vars); + frexchain(&used_builtins); + frchain(&assigned_fmts); + frchain(&allargs); + frchain(&earlylabs); + + nintnames = 0; + highlabtab = labeltab; + + ctlstack = ctls - 1; + for(i = TYADDR; i < TYVOID; i++) { + for(cp = templist[i]; cp ; cp = cp->nextp) + free( (charptr) (cp->datap) ); + frchain(templist + i); + autonum[i] = 0; + } + holdtemps = NULL; + dorange = 0; + nregvar = 0; + highregvar = 0; + entries = NULL; + rpllist = NULL; + inioctl = NO; + eqvstart += nequiv; + nequiv = 0; + dcomplex_seen = 0; + + for(i = 0 ; i c2) { + sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2); + err(buff); + } + else { + c1 = letter(c1); + c2 = letter(c2); + if(type < 0) + for(i = c1 ; i<=c2 ; ++i) + implstg[i] = - type; + else { + type = lengtype(type, length); + if(type == TYCHAR) { + if (length < 0) { + err("length (*) in implicit"); + length = 1; + } + } + else if (type != TYLONG) + length = 0; + for(i = c1 ; i<=c2 ; ++i) { + impltype[i] = type; + implleng[i] = length; + } + } + } + } diff --git a/tools/connec/src/init.o b/tools/connec/src/init.o new file mode 100644 index 0000000000000000000000000000000000000000..86315144e4e3405a6d313bcf8f66de5478777a5a GIT binary patch literal 20376 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/intr.c b/tools/connec/src/intr.c new file mode 100644 index 0000000..dcae4db --- /dev/null +++ b/tools/connec/src/intr.c @@ -0,0 +1,1087 @@ +/**************************************************************** +Copyright 1990, 1992, 1994-6, 1998 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" + +union + { + int ijunk; + struct Intrpacked bits; + } packed; + +struct Intrbits + { + char intrgroup /* :3 */; + char intrstuff /* result type or number of generics */; + char intrno /* :7 */; + char dblcmplx; + char dblintrno; /* for -r8 */ + char extflag; /* for -cd, -i90 */ + }; + +/* List of all intrinsic functions. */ + +LOCAL struct Intrblock + { + char intrfname[8]; + struct Intrbits intrval; + } intrtab[ ] = +{ +"int", { INTRCONV, TYLONG }, +"real", { INTRCONV, TYREAL, 1 }, + /* 1 ==> real(TYDCOMPLEX) yields TYDREAL */ +"dble", { INTRCONV, TYDREAL }, +"dreal", { INTRCONV, TYDREAL, 0, 0, 0, 1 }, +"cmplx", { INTRCONV, TYCOMPLEX }, +"dcmplx", { INTRCONV, TYDCOMPLEX, 0, 1 }, +"ifix", { INTRCONV, TYLONG }, +"idint", { INTRCONV, TYLONG }, +"float", { INTRCONV, TYREAL }, +"dfloat", { INTRCONV, TYDREAL }, +"sngl", { INTRCONV, TYREAL }, +"ichar", { INTRCONV, TYLONG }, +"iachar", { INTRCONV, TYLONG }, +"char", { INTRCONV, TYCHAR }, +"achar", { INTRCONV, TYCHAR }, + +/* any MAX or MIN can be used with any types; the compiler will cast them + correctly. So rules against bad syntax in these expressions are not + enforced */ + +"max", { INTRMAX, TYUNKNOWN }, +"max0", { INTRMAX, TYLONG }, +"amax0", { INTRMAX, TYREAL }, +"max1", { INTRMAX, TYLONG }, +"amax1", { INTRMAX, TYREAL }, +"dmax1", { INTRMAX, TYDREAL }, + +"and", { INTRBOOL, TYUNKNOWN, OPBITAND }, +"or", { INTRBOOL, TYUNKNOWN, OPBITOR }, +"xor", { INTRBOOL, TYUNKNOWN, OPBITXOR }, +"not", { INTRBOOL, TYUNKNOWN, OPBITNOT }, +"lshift", { INTRBOOL, TYUNKNOWN, OPLSHIFT }, +"rshift", { INTRBOOL, TYUNKNOWN, OPRSHIFT }, + +"min", { INTRMIN, TYUNKNOWN }, +"min0", { INTRMIN, TYLONG }, +"amin0", { INTRMIN, TYREAL }, +"min1", { INTRMIN, TYLONG }, +"amin1", { INTRMIN, TYREAL }, +"dmin1", { INTRMIN, TYDREAL }, + +"aint", { INTRGEN, 2, 0 }, +"dint", { INTRSPEC, TYDREAL, 1 }, + +"anint", { INTRGEN, 2, 2 }, +"dnint", { INTRSPEC, TYDREAL, 3 }, + +"nint", { INTRGEN, 4, 4 }, +"idnint", { INTRGEN, 2, 6 }, + +"abs", { INTRGEN, 6, 8 }, +"iabs", { INTRGEN, 2, 9 }, +"dabs", { INTRSPEC, TYDREAL, 11 }, +"cabs", { INTRSPEC, TYREAL, 12, 0, 13 }, +"zabs", { INTRSPEC, TYDREAL, 13, 1 }, + +"mod", { INTRGEN, 4, 14 }, +"amod", { INTRSPEC, TYREAL, 16, 0, 17 }, +"dmod", { INTRSPEC, TYDREAL, 17 }, + +"sign", { INTRGEN, 4, 18 }, +"isign", { INTRGEN, 2, 19 }, +"dsign", { INTRSPEC, TYDREAL, 21 }, + +"dim", { INTRGEN, 4, 22 }, +"idim", { INTRGEN, 2, 23 }, +"ddim", { INTRSPEC, TYDREAL, 25 }, + +"dprod", { INTRSPEC, TYDREAL, 26 }, + +"len", { INTRSPEC, TYLONG, 27 }, +"index", { INTRSPEC, TYLONG, 29 }, + +"imag", { INTRGEN, 2, 31 }, +"aimag", { INTRSPEC, TYREAL, 31, 0, 32 }, +"dimag", { INTRSPEC, TYDREAL, 32 }, + +"conjg", { INTRGEN, 2, 33 }, +"dconjg", { INTRSPEC, TYDCOMPLEX, 34, 1 }, + +"sqrt", { INTRGEN, 4, 35 }, +"dsqrt", { INTRSPEC, TYDREAL, 36 }, +"csqrt", { INTRSPEC, TYCOMPLEX, 37, 0, 38 }, +"zsqrt", { INTRSPEC, TYDCOMPLEX, 38, 1 }, + +"exp", { INTRGEN, 4, 39 }, +"dexp", { INTRSPEC, TYDREAL, 40 }, +"cexp", { INTRSPEC, TYCOMPLEX, 41, 0, 42 }, +"zexp", { INTRSPEC, TYDCOMPLEX, 42, 1 }, + +"log", { INTRGEN, 4, 43 }, +"alog", { INTRSPEC, TYREAL, 43, 0, 44 }, +"dlog", { INTRSPEC, TYDREAL, 44 }, +"clog", { INTRSPEC, TYCOMPLEX, 45, 0, 46 }, +"zlog", { INTRSPEC, TYDCOMPLEX, 46, 1 }, + +"log10", { INTRGEN, 2, 47 }, +"alog10", { INTRSPEC, TYREAL, 47, 0, 48 }, +"dlog10", { INTRSPEC, TYDREAL, 48 }, + +"sin", { INTRGEN, 4, 49 }, +"dsin", { INTRSPEC, TYDREAL, 50 }, +"csin", { INTRSPEC, TYCOMPLEX, 51, 0, 52 }, +"zsin", { INTRSPEC, TYDCOMPLEX, 52, 1 }, + +"cos", { INTRGEN, 4, 53 }, +"dcos", { INTRSPEC, TYDREAL, 54 }, +"ccos", { INTRSPEC, TYCOMPLEX, 55, 0, 56 }, +"zcos", { INTRSPEC, TYDCOMPLEX, 56, 1 }, + +"tan", { INTRGEN, 2, 57 }, +"dtan", { INTRSPEC, TYDREAL, 58 }, + +"asin", { INTRGEN, 2, 59 }, +"dasin", { INTRSPEC, TYDREAL, 60 }, + +"acos", { INTRGEN, 2, 61 }, +"dacos", { INTRSPEC, TYDREAL, 62 }, + +"atan", { INTRGEN, 2, 63 }, +"datan", { INTRSPEC, TYDREAL, 64 }, + +"atan2", { INTRGEN, 2, 65 }, +"datan2", { INTRSPEC, TYDREAL, 66 }, + +"sinh", { INTRGEN, 2, 67 }, +"dsinh", { INTRSPEC, TYDREAL, 68 }, + +"cosh", { INTRGEN, 2, 69 }, +"dcosh", { INTRSPEC, TYDREAL, 70 }, + +"tanh", { INTRGEN, 2, 71 }, +"dtanh", { INTRSPEC, TYDREAL, 72 }, + +"lge", { INTRSPEC, TYLOGICAL, 73}, +"lgt", { INTRSPEC, TYLOGICAL, 75}, +"lle", { INTRSPEC, TYLOGICAL, 77}, +"llt", { INTRSPEC, TYLOGICAL, 79}, + +#if 0 +"epbase", { INTRCNST, 4, 0 }, +"epprec", { INTRCNST, 4, 4 }, +"epemin", { INTRCNST, 2, 8 }, +"epemax", { INTRCNST, 2, 10 }, +"eptiny", { INTRCNST, 2, 12 }, +"ephuge", { INTRCNST, 4, 14 }, +"epmrsp", { INTRCNST, 2, 18 }, +#endif + +"fpexpn", { INTRGEN, 4, 81 }, +"fpabsp", { INTRGEN, 2, 85 }, +"fprrsp", { INTRGEN, 2, 87 }, +"fpfrac", { INTRGEN, 2, 89 }, +"fpmake", { INTRGEN, 2, 91 }, +"fpscal", { INTRGEN, 2, 93 }, + +"cdabs", { INTRSPEC, TYDREAL, 13, 1, 0, 1 }, +"cdsqrt", { INTRSPEC, TYDCOMPLEX, 38, 1, 0, 1 }, +"cdexp", { INTRSPEC, TYDCOMPLEX, 42, 1, 0, 1 }, +"cdlog", { INTRSPEC, TYDCOMPLEX, 46, 1, 0, 1 }, +"cdsin", { INTRSPEC, TYDCOMPLEX, 52, 1, 0, 1 }, +"cdcos", { INTRSPEC, TYDCOMPLEX, 56, 1, 0, 1 }, + +"iand", { INTRBOOL, TYUNKNOWN, OPBITAND, 0, 0, 2 }, +"ior", { INTRBOOL, TYUNKNOWN, OPBITOR, 0, 0, 2 }, +"ieor", { INTRBOOL, TYUNKNOWN, OPBITXOR, 0, 0, 2 }, + +"btest", { INTRBGEN, TYLOGICAL, OPBITTEST,0, 0, 2 }, +"ibclr", { INTRBGEN, TYUNKNOWN, OPBITCLR, 0, 0, 2 }, +"ibset", { INTRBGEN, TYUNKNOWN, OPBITSET, 0, 0, 2 }, +"ibits", { INTRBGEN, TYUNKNOWN, OPBITBITS,0, 0, 2 }, +"ishft", { INTRBGEN, TYUNKNOWN, OPBITSH, 0, 0, 2 }, +"ishftc", { INTRBGEN, TYUNKNOWN, OPBITSHC, 0, 0, 2 }, + +"" }; + + +LOCAL struct Specblock + { + char atype; /* Argument type; every arg must have + this type */ + char rtype; /* Result type */ + char nargs; /* Number of arguments */ + char spxname[8]; /* Name of the function in Fortran */ + char othername; /* index into callbyvalue table */ + } spectab[ ] = +{ + { TYREAL,TYREAL,1,"r_int" }, + { TYDREAL,TYDREAL,1,"d_int" }, + + { TYREAL,TYREAL,1,"r_nint" }, + { TYDREAL,TYDREAL,1,"d_nint" }, + + { TYREAL,TYSHORT,1,"h_nint" }, + { TYREAL,TYLONG,1,"i_nint" }, + + { TYDREAL,TYSHORT,1,"h_dnnt" }, + { TYDREAL,TYLONG,1,"i_dnnt" }, + + { TYREAL,TYREAL,1,"r_abs" }, + { TYSHORT,TYSHORT,1,"h_abs" }, + { TYLONG,TYLONG,1,"i_abs" }, + { TYDREAL,TYDREAL,1,"d_abs" }, + { TYCOMPLEX,TYREAL,1,"c_abs" }, + { TYDCOMPLEX,TYDREAL,1,"z_abs" }, + + { TYSHORT,TYSHORT,2,"h_mod" }, + { TYLONG,TYLONG,2,"i_mod" }, + { TYREAL,TYREAL,2,"r_mod" }, + { TYDREAL,TYDREAL,2,"d_mod" }, + + { TYREAL,TYREAL,2,"r_sign" }, + { TYSHORT,TYSHORT,2,"h_sign" }, + { TYLONG,TYLONG,2,"i_sign" }, + { TYDREAL,TYDREAL,2,"d_sign" }, + + { TYREAL,TYREAL,2,"r_dim" }, + { TYSHORT,TYSHORT,2,"h_dim" }, + { TYLONG,TYLONG,2,"i_dim" }, + { TYDREAL,TYDREAL,2,"d_dim" }, + + { TYREAL,TYDREAL,2,"d_prod" }, + + { TYCHAR,TYSHORT,1,"h_len" }, + { TYCHAR,TYLONG,1,"i_len" }, + + { TYCHAR,TYSHORT,2,"h_indx" }, + { TYCHAR,TYLONG,2,"i_indx" }, + + { TYCOMPLEX,TYREAL,1,"r_imag" }, + { TYDCOMPLEX,TYDREAL,1,"d_imag" }, + { TYCOMPLEX,TYCOMPLEX,1,"r_cnjg" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"d_cnjg" }, + + { TYREAL,TYREAL,1,"r_sqrt", 1 }, + { TYDREAL,TYDREAL,1,"d_sqrt", 1 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_sqrt" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_sqrt" }, + + { TYREAL,TYREAL,1,"r_exp", 2 }, + { TYDREAL,TYDREAL,1,"d_exp", 2 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_exp" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_exp" }, + + { TYREAL,TYREAL,1,"r_log", 3 }, + { TYDREAL,TYDREAL,1,"d_log", 3 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_log" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_log" }, + + { TYREAL,TYREAL,1,"r_lg10" }, + { TYDREAL,TYDREAL,1,"d_lg10" }, + + { TYREAL,TYREAL,1,"r_sin", 4 }, + { TYDREAL,TYDREAL,1,"d_sin", 4 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_sin" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_sin" }, + + { TYREAL,TYREAL,1,"r_cos", 5 }, + { TYDREAL,TYDREAL,1,"d_cos", 5 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_cos" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_cos" }, + + { TYREAL,TYREAL,1,"r_tan", 6 }, + { TYDREAL,TYDREAL,1,"d_tan", 6 }, + + { TYREAL,TYREAL,1,"r_asin", 7 }, + { TYDREAL,TYDREAL,1,"d_asin", 7 }, + + { TYREAL,TYREAL,1,"r_acos", 8 }, + { TYDREAL,TYDREAL,1,"d_acos", 8 }, + + { TYREAL,TYREAL,1,"r_atan", 9 }, + { TYDREAL,TYDREAL,1,"d_atan", 9 }, + + { TYREAL,TYREAL,2,"r_atn2", 10 }, + { TYDREAL,TYDREAL,2,"d_atn2", 10 }, + + { TYREAL,TYREAL,1,"r_sinh", 11 }, + { TYDREAL,TYDREAL,1,"d_sinh", 11 }, + + { TYREAL,TYREAL,1,"r_cosh", 12 }, + { TYDREAL,TYDREAL,1,"d_cosh", 12 }, + + { TYREAL,TYREAL,1,"r_tanh", 13 }, + { TYDREAL,TYDREAL,1,"d_tanh", 13 }, + + { TYCHAR,TYLOGICAL,2,"hl_ge" }, + { TYCHAR,TYLOGICAL,2,"l_ge" }, + + { TYCHAR,TYLOGICAL,2,"hl_gt" }, + { TYCHAR,TYLOGICAL,2,"l_gt" }, + + { TYCHAR,TYLOGICAL,2,"hl_le" }, + { TYCHAR,TYLOGICAL,2,"l_le" }, + + { TYCHAR,TYLOGICAL,2,"hl_lt" }, + { TYCHAR,TYLOGICAL,2,"l_lt" }, + + { TYREAL,TYSHORT,1,"hr_expn" }, + { TYREAL,TYLONG,1,"ir_expn" }, + { TYDREAL,TYSHORT,1,"hd_expn" }, + { TYDREAL,TYLONG,1,"id_expn" }, + + { TYREAL,TYREAL,1,"r_absp" }, + { TYDREAL,TYDREAL,1,"d_absp" }, + + { TYREAL,TYDREAL,1,"r_rrsp" }, + { TYDREAL,TYDREAL,1,"d_rrsp" }, + + { TYREAL,TYREAL,1,"r_frac" }, + { TYDREAL,TYDREAL,1,"d_frac" }, + + { TYREAL,TYREAL,2,"r_make" }, + { TYDREAL,TYDREAL,2,"d_make" }, + + { TYREAL,TYREAL,2,"r_scal" }, + { TYDREAL,TYDREAL,2,"d_scal" }, + + { 0 } +} ; + +#if 0 +LOCAL struct Incstblock + { + char atype; + char rtype; + char constno; + } consttab[ ] = +{ + { TYSHORT, TYLONG, 0 }, + { TYLONG, TYLONG, 1 }, + { TYREAL, TYLONG, 2 }, + { TYDREAL, TYLONG, 3 }, + + { TYSHORT, TYLONG, 4 }, + { TYLONG, TYLONG, 5 }, + { TYREAL, TYLONG, 6 }, + { TYDREAL, TYLONG, 7 }, + + { TYREAL, TYLONG, 8 }, + { TYDREAL, TYLONG, 9 }, + + { TYREAL, TYLONG, 10 }, + { TYDREAL, TYLONG, 11 }, + + { TYREAL, TYREAL, 0 }, + { TYDREAL, TYDREAL, 1 }, + + { TYSHORT, TYLONG, 12 }, + { TYLONG, TYLONG, 13 }, + { TYREAL, TYREAL, 2 }, + { TYDREAL, TYDREAL, 3 }, + + { TYREAL, TYREAL, 4 }, + { TYDREAL, TYDREAL, 5 } +}; +#endif + +char *callbyvalue[ ] = + {0, + "sqrt", + "exp", + "log", + "sin", + "cos", + "tan", + "asin", + "acos", + "atan", + "atan2", + "sinh", + "cosh", + "tanh" + }; + + void +r8fix(Void) /* adjust tables for -r8 */ +{ + register struct Intrblock *I; + register struct Specblock *S; + + for(I = intrtab; I->intrfname[0]; I++) + if (I->intrval.intrgroup != INTRGEN) + switch(I->intrval.intrstuff) { + case TYREAL: + I->intrval.intrstuff = TYDREAL; + I->intrval.intrno = I->intrval.dblintrno; + break; + case TYCOMPLEX: + I->intrval.intrstuff = TYDCOMPLEX; + I->intrval.intrno = I->intrval.dblintrno; + I->intrval.dblcmplx = 1; + } + + for(S = spectab; S->atype; S++) + switch(S->atype) { + case TYCOMPLEX: + S->atype = TYDCOMPLEX; + if (S->rtype == TYREAL) + S->rtype = TYDREAL; + else if (S->rtype == TYCOMPLEX) + S->rtype = TYDCOMPLEX; + switch(S->spxname[0]) { + case 'r': + S->spxname[0] = 'd'; + break; + case 'c': + S->spxname[0] = 'z'; + break; + default: + Fatal("r8fix bug"); + } + break; + case TYREAL: + S->atype = TYDREAL; + switch(S->rtype) { + case TYREAL: + S->rtype = TYDREAL; + if (S->spxname[0] != 'r') + Fatal("r8fix bug"); + S->spxname[0] = 'd'; + case TYDREAL: /* d_prod */ + break; + + case TYSHORT: + if (!strcmp(S->spxname, "hr_expn")) + S->spxname[1] = 'd'; + else if (!strcmp(S->spxname, "h_nint")) + strcpy(S->spxname, "h_dnnt"); + else Fatal("r8fix bug"); + break; + + case TYLONG: + if (!strcmp(S->spxname, "ir_expn")) + S->spxname[1] = 'd'; + else if (!strcmp(S->spxname, "i_nint")) + strcpy(S->spxname, "i_dnnt"); + else Fatal("r8fix bug"); + break; + + default: + Fatal("r8fix bug"); + } + } + } + + static expptr +#ifdef KR_headers +foldminmax(ismin, argsp) int ismin; struct Listblock *argsp; +#else +foldminmax(int ismin, struct Listblock *argsp) +#endif +{ +#ifndef NO_LONG_LONG + Llong cq, cq1; +#endif + Constp h; + double cd, cd1; + ftnint ci; + int mtype; + struct Chain *cp, *cpx; + + mtype = argsp->vtype; + cp = cpx = argsp->listp; + h = &((expptr)cp->datap)->constblock; +#ifndef NO_LONG_LONG + if (mtype == TYQUAD) { + cq = h->vtype == TYQUAD ? h->Const.cq : h->Const.ci; + while(cp = cp->nextp) { + h = &((expptr)cp->datap)->constblock; + cq1 = h->vtype == TYQUAD ? h->Const.cq : h->Const.ci; + if (ismin) { + if (cq > cq1) { + cq = cq1; + cpx = cp; + } + } + else { + if (cq < cq1) { + cq = cq1; + cpx = cp; + } + } + } + } + else +#endif + if (ISINT(mtype)) { + ci = h->Const.ci; + if (ismin) + while(cp = cp->nextp) { + h = &((expptr)cp->datap)->constblock; + if (ci > h->Const.ci) { + ci = h->Const.ci; + cpx = cp; + } + } + else + while(cp = cp->nextp) { + h = &((expptr)cp->datap)->constblock; + if (ci < h->Const.ci) { + ci = h->Const.ci; + cpx = cp; + } + } + } + else { + if (ISREAL(h->vtype)) + cd = h->vstg ? atof(h->Const.cds[0]) : h->Const.cd[0]; +#ifndef NO_LONG_LONG + else if (h->vtype == TYQUAD) + cd = h->Const.cq; +#endif + else + cd = h->Const.ci; + while(cp = cp->nextp) { + h = &((expptr)cp->datap)->constblock; + if (ISREAL(h->vtype)) + cd1 = h->vstg ? atof(h->Const.cds[0]) + : h->Const.cd[0]; +#ifndef NO_LONG_LONG + else if (h->vtype == TYQUAD) + cd1 = h->Const.cq; +#endif + else + cd1 = h->Const.ci; + if (ismin) { + if (cd > cd1) { + cd = cd1; + cpx = cp; + } + } + else { + if (cd < cd1) { + cd = cd1; + cpx = cp; + } + } + } + } + h = &((expptr)cpx->datap)->constblock; + cpx->datap = 0; + frexpr((tagptr)argsp); + if (h->vtype != mtype) + return mkconv(mtype, (expptr)h); + return (expptr)h; + } + + + expptr +#ifdef KR_headers +intrcall(np, argsp, nargs) + Namep np; + struct Listblock *argsp; + int nargs; +#else +intrcall(Namep np, struct Listblock *argsp, int nargs) +#endif +{ + int i, rettype; + ftnint k; + Addrp ap; + register struct Specblock *sp; + register struct Chain *cp; + expptr q, ep; + int constargs, mtype, op; + int f1field, f2field, f3field; + char *s; + static char bit_bits[] = "?bit_bits", + bit_shift[] = "?bit_shift", + bit_cshift[] = "?bit_cshift"; + static char *bitop[3] = { bit_bits, bit_shift, bit_cshift }; + static int t_pref[2] = { 'l', 'q' }; + + packed.ijunk = np->vardesc.varno; + f1field = packed.bits.f1; + f2field = packed.bits.f2; + f3field = packed.bits.f3; + if(nargs == 0) + goto badnargs; + + mtype = 0; + constargs = 1; + for(cp = argsp->listp ; cp ; cp = cp->nextp) + { + ep = (expptr)cp->datap; + if (!ISCONST(ep)) + constargs = 0; + else if( ep->headblock.vtype==TYSHORT ) + cp->datap = (char *) mkconv(tyint, ep); + mtype = maxtype(mtype, ep->headblock.vtype); + } + + switch(f1field) + { + case INTRBGEN: + op = f3field; + if( ! ONEOF(mtype, MSKINT) ) + goto badtype; + if (op < OPBITBITS) { + if(nargs != 2) + goto badnargs; + if (op != OPBITTEST) { +#ifdef TYQUAD + if (mtype == TYQUAD) + op += 2; +#endif + goto intrbool2; + } + q = mkexpr(op, (expptr)argsp->listp->datap, + (expptr)argsp->listp->nextp->datap); + q->exprblock.vtype = TYLOGICAL; + goto intrbool2a; + } + if (nargs != 2 && (nargs != 3 || op == OPBITSH)) + goto badnargs; + cp = argsp->listp; + ep = (expptr)cp->datap; + if (ep->headblock.vtype < TYLONG) + cp->datap = (char *)mkconv(TYLONG, ep); + while(cp->nextp) { + cp = cp->nextp; + ep = (expptr)cp->datap; + if (ep->headblock.vtype != TYLONG) + cp->datap = (char *)mkconv(TYLONG, ep); + } + if (op == OPBITSH) { + ep = (expptr)argsp->listp->nextp->datap; + if (ISCONST(ep)) { + if ((k = ep->constblock.Const.ci) < 0) { + q = (expptr)argsp->listp->datap; + if (ISCONST(q)) { + ep->constblock.Const.ci = -k; + op = OPRSHIFT; + goto intrbool2; + } + } + else { + op = OPLSHIFT; + goto intrbool2; + } + } + } + else if (nargs == 2) { + if (op == OPBITBITS) + goto badnargs; + cp->nextp = mkchain((char*)ICON(-1), 0); + } + ep = (expptr)argsp->listp->datap; + i = ep->headblock.vtype; + s = bitop[op - OPBITBITS]; + *s = t_pref[i - TYLONG]; + ap = builtin(i, s, 1); + return fixexpr((Exprp) + mkexpr(OPCCALL, (expptr)ap, (expptr)argsp) ); + + case INTRBOOL: + op = f3field; + if( ! ONEOF(mtype, MSKINT|MSKLOGICAL) ) + goto badtype; + if(op == OPBITNOT) + { + if(nargs != 1) + goto badnargs; + q = mkexpr(OPBITNOT, (expptr)argsp->listp->datap, ENULL); + } + else + { + if(nargs != 2) + goto badnargs; + intrbool2: + q = mkexpr(op, (expptr)argsp->listp->datap, + (expptr)argsp->listp->nextp->datap); + } + intrbool2a: + frchain( &(argsp->listp) ); + free( (charptr) argsp); + return(q); + + case INTRCONV: + rettype = f2field; + switch(rettype) { + case TYLONG: + rettype = tyint; + break; + case TYLOGICAL: + rettype = tylog; + } + if( ISCOMPLEX(rettype) && nargs==2) + { + expptr qr, qi; + qr = (expptr) argsp->listp->datap; + qi = (expptr) argsp->listp->nextp->datap; + if (qr->headblock.vtype == TYDREAL + || qi->headblock.vtype == TYDREAL) + rettype = TYDCOMPLEX; + if(ISCONST(qr) && ISCONST(qi)) + q = mkcxcon(qr,qi); + else q = mkexpr(OPCONV,mkconv(rettype-2,qr), + mkconv(rettype-2,qi)); + } + else if(nargs == 1) { + if (f3field && ((Exprp)argsp->listp->datap)->vtype + == TYDCOMPLEX) + rettype = TYDREAL; + q = mkconv(rettype+100, (expptr)argsp->listp->datap); + if (q->tag == TADDR) + q->addrblock.parenused = 1; + } + else goto badnargs; + + q->headblock.vtype = rettype; + frchain(&(argsp->listp)); + free( (charptr) argsp); + return(q); + + +#if 0 + case INTRCNST: + +/* Machine-dependent f77 stuff that f2c omits: + +intcon contains + radix for short int + radix for long int + radix for single precision + radix for double precision + precision for short int + precision for long int + precision for single precision + precision for double precision + emin for single precision + emin for double precision + emax for single precision + emax for double prcision + largest short int + largest long int + +realcon contains + tiny for single precision + tiny for double precision + huge for single precision + huge for double precision + mrsp (epsilon) for single precision + mrsp (epsilon) for double precision +*/ + { register struct Incstblock *cstp; + extern ftnint intcon[14]; + extern double realcon[6]; + + cstp = consttab + f3field; + for(i=0 ; iatype == mtype) + goto foundconst; + else + ++cstp; + goto badtype; + +foundconst: + switch(cstp->rtype) + { + case TYLONG: + return(mkintcon(intcon[cstp->constno])); + + case TYREAL: + case TYDREAL: + return(mkrealcon(cstp->rtype, + realcon[cstp->constno]) ); + + default: + Fatal("impossible intrinsic constant"); + } + } +#endif + + case INTRGEN: + sp = spectab + f3field; + if(no66flag) + if(sp->atype == mtype) + goto specfunct; + else err66("generic function"); + + for(i=0; iatype == mtype) + goto specfunct; + else + ++sp; + warn1 ("bad argument type to intrinsic %s", np->fvarname); + +/* Made this a warning rather than an error so things like "log (5) ==> + log (5.0)" can be accommodated. When none of these cases matches, the + argument is cast up to the first type in the spectab list; this first + type is assumed to be the "smallest" type, e.g. REAL before DREAL + before COMPLEX, before DCOMPLEX */ + + sp = spectab + f3field; + mtype = sp -> atype; + goto specfunct; + + case INTRSPEC: + sp = spectab + f3field; +specfunct: + if(tyint==TYLONG && ONEOF(sp->rtype,M(TYSHORT)|M(TYLOGICAL)) + && (sp+1)->atype==sp->atype) + ++sp; + + if(nargs != sp->nargs) + goto badnargs; + if(mtype != sp->atype) + goto badtype; + +/* NOTE!! I moved fixargs (YES) into the ELSE branch so that constants in + the inline expression wouldn't get put into the constant table */ + + fixargs (NO, argsp); + cast_args (mtype, argsp -> listp); + + if(q = Inline((int)(sp-spectab), mtype, argsp->listp)) + { + frchain( &(argsp->listp) ); + free( (charptr) argsp); + } else { + + if(sp->othername) { + /* C library routines that return double... */ + /* sp->rtype might be TYREAL */ + ap = builtin(sp->rtype, + callbyvalue[sp->othername], 1); + q = fixexpr((Exprp) + mkexpr(OPCCALL, (expptr)ap, (expptr)argsp) ); + } else { + fixargs(YES, argsp); + ap = builtin(sp->rtype, sp->spxname, 0); + q = fixexpr((Exprp) + mkexpr(OPCALL, (expptr)ap, (expptr)argsp) ); + } /* else */ + } /* else */ + return(q); + + case INTRMIN: + case INTRMAX: + if(nargs < 2) + goto badnargs; + if( ! ONEOF(mtype, MSKINT|MSKREAL) ) + goto badtype; + argsp->vtype = mtype; + if (constargs) + q = foldminmax(f1field==INTRMIN, argsp); + else + q = mkexpr(f1field==INTRMIN ? OPMIN : OPMAX, + (expptr)argsp, ENULL); + + q->headblock.vtype = mtype; + rettype = f2field; + if(rettype == TYLONG) + rettype = tyint; + else if(rettype == TYUNKNOWN) + rettype = mtype; + return( mkconv(rettype, q) ); + + default: + fatali("intrcall: bad intrgroup %d", f1field); + } +badnargs: + errstr("bad number of arguments to intrinsic %s", np->fvarname); + goto bad; + +badtype: + errstr("bad argument type to intrinsic %s", np->fvarname); + +bad: + return( errnode() ); +} + + + + int +#ifdef KR_headers +intrfunct(s) + char *s; +#else +intrfunct(char *s) +#endif +{ + register struct Intrblock *p; + int i; + extern int intr_omit; + + for(p = intrtab; p->intrval.intrgroup!=INTREND ; ++p) + { + if( !strcmp(s, p->intrfname) ) + { + if (i = p->intrval.extflag) { + if (i & intr_omit) + return 0; + if (noextflag) + errext(s); + } + packed.bits.f1 = p->intrval.intrgroup; + packed.bits.f2 = p->intrval.intrstuff; + packed.bits.f3 = p->intrval.intrno; + packed.bits.f4 = p->intrval.dblcmplx; + return(packed.ijunk); + } + } + + return(0); +} + + + + + + Addrp +#ifdef KR_headers +intraddr(np) + Namep np; +#else +intraddr(Namep np) +#endif +{ + Addrp q; + register struct Specblock *sp; + int f3field; + + if(np->vclass!=CLPROC || np->vprocclass!=PINTRINSIC) + fatalstr("intraddr: %s is not intrinsic", np->fvarname); + packed.ijunk = np->vardesc.varno; + f3field = packed.bits.f3; + + switch(packed.bits.f1) + { + case INTRGEN: + /* imag, log, and log10 arent specific functions */ + if(f3field==31 || f3field==43 || f3field==47) + goto bad; + + case INTRSPEC: + sp = spectab + f3field; + if (tyint == TYLONG + && (sp->rtype == TYSHORT || sp->rtype == TYLOGICAL)) + ++sp; + q = builtin(sp->rtype, sp->spxname, + sp->othername ? 1 : 0); + return(q); + + case INTRCONV: + case INTRMIN: + case INTRMAX: + case INTRBOOL: + case INTRCNST: + case INTRBGEN: +bad: + errstr("cannot pass %s as actual", np->fvarname); + return((Addrp)errnode()); + } + fatali("intraddr: impossible f1=%d\n", (int) packed.bits.f1); + /* NOT REACHED */ return 0; +} + + + + void +#ifdef KR_headers +cast_args(maxtype, args) + int maxtype; + chainp args; +#else +cast_args(int maxtype, chainp args) +#endif +{ + for (; args; args = args -> nextp) { + expptr e = (expptr) args->datap; + if (e -> headblock.vtype != maxtype) + if (e -> tag == TCONST) + args->datap = (char *) mkconv(maxtype, e); + else { + Addrp temp = mktmp(maxtype, ENULL); + + puteq(cpexpr((expptr)temp), e); + args->datap = (char *)temp; + } /* else */ + } /* for */ +} /* cast_args */ + + + + expptr +#ifdef KR_headers +Inline(fno, type, args) + int fno; + int type; + struct Chain *args; +#else +Inline(int fno, int type, struct Chain *args) +#endif +{ + register expptr q, t, t1; + + switch(fno) + { + case 8: /* real abs */ + case 9: /* short int abs */ + case 10: /* long int abs */ + case 11: /* double precision abs */ + if( addressable(q = (expptr) args->datap) ) + { + t = q; + q = NULL; + } + else + t = (expptr) mktmp(type,ENULL); + t1 = mkexpr(type == TYREAL && forcedouble ? OPDABS : OPABS, + cpexpr(t), ENULL); + if(q) + t1 = mkexpr(OPCOMMA, mkexpr(OPASSIGN, cpexpr(t),q), t1); + frexpr(t); + return(t1); + + case 26: /* dprod */ + q = mkexpr(OPSTAR, mkconv(TYDREAL,(expptr)args->datap), + (expptr)args->nextp->datap); + return(q); + + case 27: /* len of character string */ + q = (expptr) cpexpr(((tagptr)args->datap)->headblock.vleng); + frexpr((expptr)args->datap); + return mkconv(tyioint, q); + + case 14: /* half-integer mod */ + case 15: /* mod */ + return mkexpr(OPMOD, (expptr) args->datap, + (expptr) args->nextp->datap); + } + return(NULL); +} diff --git a/tools/connec/src/intr.o b/tools/connec/src/intr.o new file mode 100644 index 0000000000000000000000000000000000000000..bbe8c07cad3b5d338e26f4c5f6e2f6993726f3dd GIT binary patch literal 15984 zcmd5?dz4hgnXi8Lz%X|}Fho&XGZ;i1K>-Ic(dl`>o$ROtB#oMdxy5;rEh*{s=^oGd}a0T~6?lLs+wmT1-xlPF{R3a-W%&i=ltucnLZ z^k4f=>d^Oo->-i4)mK$tJ#G!V+B#NvJszQxM_ez;nnr~fSXP#sq}U{8it|M7<5F>& z?co4PrJ2W?szTQORn>b|O|kPwYH|(2nVTC7`<=f4t;)R3cT-zAVjve!%$`%jQUo?iD6Oet4ameXx5Tz2O$L(R+p3`K! zbnuuDEdkwc?fxc!M*q(9QFK{j$obYe#J_L!WnZy}*Z3X`gJu_gV;5e1{hzI`9+@L{ zAIZWYe`4&j1Vd8>62YeSMV2 z+}gbt-eQ3AFNN*GSso|5@GM#{J8{wn!QFgJle@)dR&-u~o;ruD9>ck!y5>TfgXX+!*h4QC%X|$*U?tWce>8Pw? zbd6njH@C|h%ucoTubh`Z6>9W4wRSO6YqqJ_vY^1WpUOYC3zap7t-EsY#@hcH6YY5Q zPi@cJ<9{fe$e-HYc%^e=?wv~<+uHx6Jv?(Y2fRJ(->2O7J0H#sP8HTyj!MRW&l(x@ zs7Sg3f$qt@<8uPJcdE0$#k{C4{o3u4q~1DOu3rMOO{LR37tqzw!h3e%b$jT|>}9Gq zX5MJjuBh=-Z+g^CgE*$4# zuV}HOur*vdM3XQ7YB)cBo^{uGm_&Br*M&C$L< zvOcOi*Djo-2{{^FH?d6SUz*pB(J44}vkSM>)fQKBfDb)s?f$l(;#$UgwD4Fo|7YvS zY5$(qx(_jkSp}`yE`BCVVe_fzA@caRzYc>WqH>r@7v*+%e9lL$k*r5YPqgqT2ihVE zG#OvNZ7nRWEBzMncur5YgiDW|W3|oN|Aw`H1G&&sR~^lr#q|3+Mh^JP9Ack{`@b(k z>_8*jXtnM;W##9iCHb?>yV~=2)YW>ep~o?}`LowM)^M9Qntv}~wVocklY+I_S~uG+ zHeu8-_gCXJ5I%f8%*dW?FFbmz$x}VH4NMSg^KW^b8Tq$-*3h7|*J|zVhain~6gP$2 zi%wlQx6|X>HS;hW&_-J8!X+P~w7oc|j{5Ba3O~^N&WmLlO~=yH`LnIg7UlEqZ@_|G z+(7$9=5-x=T>p?(czWvP3T4c7xx4Y(pZ>rF|(|zd4pDso$yYy-G*(C zU0fB;E%#>cv5U>M_Rx{R(8C`_xl+#>GjJa;4q!gBr`zFfB)MoJG_`w_^rN9O@IR$HwX;Vljb44`%2$xKN4<2Y>c zt1yX4_hBPIn!>q3Pt^fhHmuf@M#eyRczZ$zOs)Y{d>5SPo(*;AR~o+$`2I->C|Up5 zcIwx16w=y+Q6Io8@r0aqL`mpCm8y~EO*W9b-s>!D9ge@RXO~=?Csy?iwK&X15$(|! z4c$Xzq;yDcf)oR{0?ygZp0U*ssCTNdUo}naR||N*63#4a4T83Yw7E47J+t#Vo$+be zxx-CZ^;?^K_Hf4#R`S!df7#0(cWSMX+SX;yWnYaJp0W#%m9A_r-geF|+iHy@aU`tl zgWp+~|e>{Ku617)h<(n;=i~(-lv%`~r7t`Q*nnce; zt=8XRo!6a*$XgA&QETL9g$~+GDCFD1`L_d3^dPO^MWEJwPgwb3C|LJu+Y2vKo!QUW z#a@A}(AxcJ7`BURQE+vwz3k|Y=RvUxCrUWTtRi}8DxpD%9-S!l5m~AYrJ8D`!KcC6 zc}lTLn9*$gU0Lsh^_>&e>3H_w5#(C;{VFp*hfN@Bov~`y*PgMa w&Z^L<^R<41v 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/io.c b/tools/connec/src/io.c new file mode 100644 index 0000000..ed1ed16 --- /dev/null +++ b/tools/connec/src/io.c @@ -0,0 +1,1509 @@ +/**************************************************************** +Copyright 1990, 1991, 1993, 1994, 1996, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* Routines to generate code for I/O statements. + Some corrections and improvements due to David Wasley, U. C. Berkeley +*/ + +/* TEMPORARY */ +#define TYIOINT TYLONG +#define SZIOINT SZLONG + +#include "defs.h" +#include "names.h" +#include "iob.h" + +extern int byterev, inqmask; + +static void dofclose Argdcl((void)); +static void dofinquire Argdcl((void)); +static void dofmove Argdcl((char*)); +static void dofopen Argdcl((void)); +static void doiolist Argdcl((chainp)); +static void ioset Argdcl((int, int, expptr)); +static void ioseta Argdcl((int, Addrp)); +static void iosetc Argdcl((int, expptr)); +static void iosetip Argdcl((int, int)); +static void iosetlc Argdcl((int, int, int)); +static void putio Argdcl((expptr, expptr)); +static void putiocall Argdcl((expptr)); + +iob_data *iob_list; +Addrp io_structs[9]; + +LOCAL char ioroutine[12]; + +LOCAL long ioendlab; +LOCAL long ioerrlab; +LOCAL int endbit; +LOCAL int errbit; +LOCAL long jumplab; +LOCAL long skiplab; +LOCAL int ioformatted; +LOCAL int statstruct = NO; +LOCAL struct Labelblock *skiplabel; +Addrp ioblkp; + +#define UNFORMATTED 0 +#define FORMATTED 1 +#define LISTDIRECTED 2 +#define NAMEDIRECTED 3 + +#define V(z) ioc[z].iocval + +#define IOALL 07777 + +LOCAL struct Ioclist +{ + char *iocname; + int iotype; + expptr iocval; +} +ioc[ ] = +{ + { "", 0 }, + { "unit", IOALL }, + { "fmt", M(IOREAD) | M(IOWRITE) }, + { "err", IOALL }, + { "end", M(IOREAD) }, + { "iostat", IOALL }, + { "rec", M(IOREAD) | M(IOWRITE) }, + { "recl", M(IOOPEN) | M(IOINQUIRE) }, + { "file", M(IOOPEN) | M(IOINQUIRE) }, + { "status", M(IOOPEN) | M(IOCLOSE) }, + { "access", M(IOOPEN) | M(IOINQUIRE) }, + { "form", M(IOOPEN) | M(IOINQUIRE) }, + { "blank", M(IOOPEN) | M(IOINQUIRE) }, + { "exist", M(IOINQUIRE) }, + { "opened", M(IOINQUIRE) }, + { "number", M(IOINQUIRE) }, + { "named", M(IOINQUIRE) }, + { "name", M(IOINQUIRE) }, + { "sequential", M(IOINQUIRE) }, + { "direct", M(IOINQUIRE) }, + { "formatted", M(IOINQUIRE) }, + { "unformatted", M(IOINQUIRE) }, + { "nextrec", M(IOINQUIRE) }, + { "nml", M(IOREAD) | M(IOWRITE) } +}; + +#define NIOS (sizeof(ioc)/sizeof(struct Ioclist) - 1) + +/* #define IOSUNIT 1 */ +/* #define IOSFMT 2 */ +#define IOSERR 3 +#define IOSEND 4 +#define IOSIOSTAT 5 +#define IOSREC 6 +#define IOSRECL 7 +#define IOSFILE 8 +#define IOSSTATUS 9 +#define IOSACCESS 10 +#define IOSFORM 11 +#define IOSBLANK 12 +#define IOSEXISTS 13 +#define IOSOPENED 14 +#define IOSNUMBER 15 +#define IOSNAMED 16 +#define IOSNAME 17 +#define IOSSEQUENTIAL 18 +#define IOSDIRECT 19 +#define IOSFORMATTED 20 +#define IOSUNFORMATTED 21 +#define IOSNEXTREC 22 +#define IOSNML 23 + +#define IOSTP V(IOSIOSTAT) + + +/* offsets in generated structures */ + +#define SZFLAG SZIOINT + +/* offsets for external READ and WRITE statements */ + +#define XERR 0 +#define XUNIT SZFLAG +#define XEND SZFLAG + SZIOINT +#define XFMT 2*SZFLAG + SZIOINT +#define XREC 2*SZFLAG + SZIOINT + SZADDR + +/* offsets for internal READ and WRITE statements */ + +#define XIUNIT SZFLAG +#define XIEND SZFLAG + SZADDR +#define XIFMT 2*SZFLAG + SZADDR +#define XIRLEN 2*SZFLAG + 2*SZADDR +#define XIRNUM 2*SZFLAG + 2*SZADDR + SZIOINT +#define XIREC 2*SZFLAG + 2*SZADDR + 2*SZIOINT + +/* offsets for OPEN statements */ + +#define XFNAME SZFLAG + SZIOINT +#define XFNAMELEN SZFLAG + SZIOINT + SZADDR +#define XSTATUS SZFLAG + 2*SZIOINT + SZADDR +#define XACCESS SZFLAG + 2*SZIOINT + 2*SZADDR +#define XFORMATTED SZFLAG + 2*SZIOINT + 3*SZADDR +#define XRECLEN SZFLAG + 2*SZIOINT + 4*SZADDR +#define XBLANK SZFLAG + 3*SZIOINT + 4*SZADDR + +/* offset for CLOSE statement */ + +#define XCLSTATUS SZFLAG + SZIOINT + +/* offsets for INQUIRE statement */ + +#define XFILE SZFLAG + SZIOINT +#define XFILELEN SZFLAG + SZIOINT + SZADDR +#define XEXISTS SZFLAG + 2*SZIOINT + SZADDR +#define XOPEN SZFLAG + 2*SZIOINT + 2*SZADDR +#define XNUMBER SZFLAG + 2*SZIOINT + 3*SZADDR +#define XNAMED SZFLAG + 2*SZIOINT + 4*SZADDR +#define XNAME SZFLAG + 2*SZIOINT + 5*SZADDR +#define XNAMELEN SZFLAG + 2*SZIOINT + 6*SZADDR +#define XQACCESS SZFLAG + 3*SZIOINT + 6*SZADDR +#define XQACCLEN SZFLAG + 3*SZIOINT + 7*SZADDR +#define XSEQ SZFLAG + 4*SZIOINT + 7*SZADDR +#define XSEQLEN SZFLAG + 4*SZIOINT + 8*SZADDR +#define XDIRECT SZFLAG + 5*SZIOINT + 8*SZADDR +#define XDIRLEN SZFLAG + 5*SZIOINT + 9*SZADDR +#define XFORM SZFLAG + 6*SZIOINT + 9*SZADDR +#define XFORMLEN SZFLAG + 6*SZIOINT + 10*SZADDR +#define XFMTED SZFLAG + 7*SZIOINT + 10*SZADDR +#define XFMTEDLEN SZFLAG + 7*SZIOINT + 11*SZADDR +#define XUNFMT SZFLAG + 8*SZIOINT + 11*SZADDR +#define XUNFMTLEN SZFLAG + 8*SZIOINT + 12*SZADDR +#define XQRECL SZFLAG + 9*SZIOINT + 12*SZADDR +#define XNEXTREC SZFLAG + 9*SZIOINT + 13*SZADDR +#define XQBLANK SZFLAG + 9*SZIOINT + 14*SZADDR +#define XQBLANKLEN SZFLAG + 9*SZIOINT + 15*SZADDR + +LOCAL char *cilist_names[] = { + "cilist", + "cierr", + "ciunit", + "ciend", + "cifmt", + "cirec" + }; +LOCAL char *icilist_names[] = { + "icilist", + "icierr", + "iciunit", + "iciend", + "icifmt", + "icirlen", + "icirnum" + }; +LOCAL char *olist_names[] = { + "olist", + "oerr", + "ounit", + "ofnm", + "ofnmlen", + "osta", + "oacc", + "ofm", + "orl", + "oblnk" + }; +LOCAL char *cllist_names[] = { + "cllist", + "cerr", + "cunit", + "csta" + }; +LOCAL char *alist_names[] = { + "alist", + "aerr", + "aunit" + }; +LOCAL char *inlist_names[] = { + "inlist", + "inerr", + "inunit", + "infile", + "infilen", + "inex", + "inopen", + "innum", + "innamed", + "inname", + "innamlen", + "inacc", + "inacclen", + "inseq", + "inseqlen", + "indir", + "indirlen", + "infmt", + "infmtlen", + "inform", + "informlen", + "inunf", + "inunflen", + "inrecl", + "innrec", + "inblank", + "inblanklen" + }; + +LOCAL char **io_fields; + +#define zork(n,t) n, sizeof(n)/sizeof(char *) - 1, t + +LOCAL io_setup io_stuff[] = { + zork(cilist_names, TYCILIST), /* external read/write */ + zork(inlist_names, TYINLIST), /* inquire */ + zork(olist_names, TYOLIST), /* open */ + zork(cllist_names, TYCLLIST), /* close */ + zork(alist_names, TYALIST), /* rewind */ + zork(alist_names, TYALIST), /* backspace */ + zork(alist_names, TYALIST), /* endfile */ + zork(icilist_names,TYICILIST), /* internal read */ + zork(icilist_names,TYICILIST) /* internal write */ + }; + +#undef zork + + int +#ifdef KR_headers +fmtstmt(lp) + register struct Labelblock *lp; +#else +fmtstmt(register struct Labelblock *lp) +#endif +{ + if(lp == NULL) + { + execerr("unlabeled format statement" , CNULL); + return(-1); + } + if(lp->labtype == LABUNKNOWN) + { + lp->labtype = LABFORMAT; + lp->labelno = (int)newlabel(); + } + else if(lp->labtype != LABFORMAT) + { + execerr("bad format number", CNULL); + return(-1); + } + return(lp->labelno); +} + + + void +#ifdef KR_headers +setfmt(lp) + struct Labelblock *lp; +#else +setfmt(struct Labelblock *lp) +#endif +{ + char *s, *s0, *sc, *se, *t; + int k, n, parity; + + s0 = s = lexline(&n); + se = t = s + n; + + /* warn of trivial errors, e.g. " 11 CONTINUE" (one too few spaces) */ + /* following FORMAT... */ + + if (n <= 0) + warn("No (...) after FORMAT"); + else if (*s != '(') + warni("%c rather than ( after FORMAT", *s); + else if (se[-1] != ')') { + *se = 0; + while(--t > s && *t != ')') ; + if (t <= s) + warn("No ) at end of FORMAT statement"); + else if (se - t > 30) + warn1("Extraneous text at end of FORMAT: ...%s", se-12); + else + warn1("Extraneous text at end of FORMAT: %s", t+1); + t = se; + } + + /* fix MYQUOTES (\002's) and \\'s */ + + parity = 1; + str_fmt['%'] = "%"; + while(s < se) { + k = *(unsigned char *)s++; + if (k == 2) { + if ((parity ^= 1) && *s == 2) { + t -= 2; + ++s; + } + else + t += 3; + } + else { + sc = str_fmt[k]; + while(*++sc) + t++; + } + } + s = s0; + parity = 1; + if (lp) { + lp->fmtstring = t = mem((int)(t - s + 1), 0); + while(s < se) { + k = *(unsigned char *)s++; + if (k == 2) { + if ((parity ^= 1) && *s == 2) + s++; + else { + t[0] = '\\'; + t[1] = '0'; + t[2] = '0'; + t[3] = '2'; + t += 4; + } + } + else { + sc = str_fmt[k]; + do *t++ = *sc++; + while(*sc); + } + } + *t = 0; + } + str_fmt['%'] = "%%"; + flline(); +} + + + void +#ifdef KR_headers +startioctl() +#else +startioctl() +#endif +{ + register int i; + + inioctl = YES; + nioctl = 0; + ioformatted = UNFORMATTED; + for(i = 1 ; i<=NIOS ; ++i) + V(i) = NULL; +} + + static long +newiolabel(Void) { + long rv; + rv = ++lastiolabno; + skiplabel = mklabel(rv); + skiplabel->labdefined = 1; + return rv; + } + + void +endioctl(Void) +{ + int i; + expptr p; + struct io_setup *ios; + + inioctl = NO; + + /* set up for error recovery */ + + ioerrlab = ioendlab = skiplab = jumplab = 0; + + if(p = V(IOSEND)) + if(ISICON(p)) + execlab(ioendlab = p->constblock.Const.ci); + else + err("bad end= clause"); + + if(p = V(IOSERR)) + if(ISICON(p)) + execlab(ioerrlab = p->constblock.Const.ci); + else + err("bad err= clause"); + + if(IOSTP) + if(IOSTP->tag!=TADDR || ! ISINT(IOSTP->addrblock.vtype) ) + { + err("iostat must be an integer variable"); + frexpr(IOSTP); + IOSTP = NULL; + } + + if(iostmt == IOREAD) + { + if(IOSTP) + { + if(ioerrlab && ioendlab && ioerrlab==ioendlab) + jumplab = ioerrlab; + else + skiplab = jumplab = newiolabel(); + } + else { + if(ioerrlab && ioendlab && ioerrlab!=ioendlab) + { + IOSTP = (expptr) mktmp(TYINT, ENULL); + skiplab = jumplab = newiolabel(); + } + else + jumplab = (ioerrlab ? ioerrlab : ioendlab); + } + } + else if(iostmt == IOWRITE) + { + if(IOSTP && !ioerrlab) + skiplab = jumplab = newiolabel(); + else + jumplab = ioerrlab; + } + else + jumplab = ioerrlab; + + endbit = IOSTP!=NULL || ioendlab!=0; /* for use in startrw() */ + errbit = IOSTP!=NULL || ioerrlab!=0; + if (jumplab && !IOSTP) + IOSTP = (expptr) mktmp(TYINT, ENULL); + + if(iostmt!=IOREAD && iostmt!=IOWRITE) + { + ios = io_stuff + iostmt; + io_fields = ios->fields; + ioblkp = io_structs[iostmt]; + if(ioblkp == NULL) + io_structs[iostmt] = ioblkp = + autovar(1, ios->type, ENULL, ""); + ioset(TYIOINT, XERR, ICON(errbit)); + } + + switch(iostmt) + { + case IOOPEN: + dofopen(); + break; + + case IOCLOSE: + dofclose(); + break; + + case IOINQUIRE: + dofinquire(); + break; + + case IOBACKSPACE: + dofmove("f_back"); + break; + + case IOREWIND: + dofmove("f_rew"); + break; + + case IOENDFILE: + dofmove("f_end"); + break; + + case IOREAD: + case IOWRITE: + startrw(); + break; + + default: + fatali("impossible iostmt %d", iostmt); + } + for(i = 1 ; i<=NIOS ; ++i) + if(i!=IOSIOSTAT && V(i)!=NULL) + frexpr(V(i)); +} + + + int +iocname(Void) +{ + register int i; + int found, mask; + + found = 0; + mask = M(iostmt); + for(i = 1 ; i <= NIOS ; ++i) + if(!strcmp(ioc[i].iocname, token)) + if(ioc[i].iotype & mask) + return(i); + else { + found = i; + break; + } + if(found) { + if (iostmt == IOOPEN && !strcmp(ioc[i].iocname, "name")) { + NOEXT("open with \"name=\" treated as \"file=\""); + for(i = 1; strcmp(ioc[i].iocname, "file"); i++); + return i; + } + errstr("invalid control %s for statement", ioc[found].iocname); + } + else + errstr("unknown iocontrol %s", token); + return(IOSBAD); +} + + + void +#ifdef KR_headers +ioclause(n, p) + register int n; + register expptr p; +#else +ioclause(register int n, register expptr p) +#endif +{ + struct Ioclist *iocp; + + ++nioctl; + if(n == IOSBAD) + return; + if(n == IOSPOSITIONAL) + { + n = nioctl; + if (n == IOSFMT) { + if (iostmt == IOOPEN) { + n = IOSFILE; + NOEXT("file= specifier omitted from open"); + } + else if (iostmt < IOREAD) + goto illegal; + } + else if(n > IOSFMT) + { + illegal: + err("illegal positional iocontrol"); + return; + } + } + else if (n == IOSNML) + n = IOSFMT; + + if(p == NULL) + { + if(n == IOSUNIT) + p = (expptr) (iostmt==IOREAD ? IOSTDIN : IOSTDOUT); + else if(n != IOSFMT) + { + err("illegal * iocontrol"); + return; + } + } + if(n == IOSFMT) + ioformatted = (p==NULL ? LISTDIRECTED : FORMATTED); + + iocp = & ioc[n]; + if(iocp->iocval == NULL) + { + if(n!=IOSFMT && ( n!=IOSUNIT || (p && p->headblock.vtype!=TYCHAR) ) ) + p = fixtype(p); + else if (p && p->tag == TPRIM + && p->primblock.namep->vclass == CLUNKNOWN) { + /* kludge made necessary by attempt to infer types + * for untyped external parameters: given an error + * in calling sequences, an integer argument might + * tentatively be assumed TYCHAR; this would otherwise + * be corrected too late in startrw after startrw + * had decided this to be an internal file. + */ + vardcl(p->primblock.namep); + p->primblock.vtype = p->primblock.namep->vtype; + } + iocp->iocval = p; + } + else + errstr("iocontrol %s repeated", iocp->iocname); +} + +/* io list item */ + + void +#ifdef KR_headers +doio(list) + chainp list; +#else +doio(chainp list) +#endif +{ + if(ioformatted == NAMEDIRECTED) + { + if(list) + err("no I/O list allowed in NAMELIST read/write"); + } + else + { + doiolist(list); + ioroutine[0] = 'e'; + if (skiplab) + jumplab = 0; + putiocall( call0(TYINT, ioroutine) ); + } +} + + + + + + LOCAL void +#ifdef KR_headers +doiolist(p0) + chainp p0; +#else +doiolist(chainp p0) +#endif +{ + chainp p; + register tagptr q; + register expptr qe; + register Namep qn; + Addrp tp; + int range; + extern char *ohalign; + + for (p = p0 ; p ; p = p->nextp) + { + q = (tagptr)p->datap; + if(q->tag == TIMPLDO) + { + exdo(range = (int)newlabel(), (Namep)0, + q->impldoblock.impdospec); + doiolist(q->impldoblock.datalist); + enddo(range); + free( (charptr) q); + } + else { + if(q->tag==TPRIM && q->primblock.argsp==NULL + && q->primblock.namep->vdim!=NULL) + { + vardcl(qn = q->primblock.namep); + if(qn->vdim->nelt) { + putio( fixtype(cpexpr(qn->vdim->nelt)), + (expptr)mkscalar(qn) ); + qn->vlastdim = 0; + } + else + err("attempt to i/o array of unknown size"); + } + else if(q->tag==TPRIM && q->primblock.argsp==NULL && + (qe = (expptr) memversion(q->primblock.namep)) ) + putio(ICON(1),qe); + else if (ISCONST(q) && q->constblock.vtype == TYCHAR) { + halign = 0; + putio(ICON(1), qe = fixtype(cpexpr(q))); + halign = ohalign; + } + else if(((qe = fixtype(cpexpr(q)))->tag==TADDR && + (qe->addrblock.uname_tag != UNAM_CONST || + !ISCOMPLEX(qe -> addrblock.vtype))) || + (qe -> tag == TCONST && !ISCOMPLEX(qe -> + headblock.vtype))) { + if (qe -> tag == TCONST) + qe = (expptr) putconst((Constp)qe); + putio(ICON(1), qe); + } + else if(qe->headblock.vtype != TYERROR) + { + if(iostmt == IOWRITE) + { + expptr qvl; + qvl = NULL; + if( ISCHAR(qe) ) + { + qvl = (expptr) + cpexpr(qe->headblock.vleng); + tp = mktmp(qe->headblock.vtype, + ICON(lencat(qe))); + } + else + tp = mktmp(qe->headblock.vtype, + qe->headblock.vleng); + puteq( cpexpr((expptr)tp), qe); + if(qvl) /* put right length on block */ + { + frexpr(tp->vleng); + tp->vleng = qvl; + } + putio(ICON(1), (expptr)tp); + } + else + err("non-left side in READ list"); + } + frexpr(q); + } + } + frchain( &p0 ); +} + + int iocalladdr = TYADDR; /* for fixing TYADDR in saveargtypes */ + int typeconv[TYERROR+1] = { +#ifdef TYQUAD + 0, 1, 11, 2, 3, 14, 4, 5, 6, 7, 12, 13, 8, 9, 10, 15 +#else + 0, 1, 11, 2, 3, 4, 5, 6, 7, 12, 13, 8, 9, 10, 14 +#endif + }; + + LOCAL void +#ifdef KR_headers +putio(nelt, addr) + expptr nelt; + register expptr addr; +#else +putio(expptr nelt, register expptr addr) +#endif +{ + int type; + register expptr q; + register Addrp c = 0; + + type = addr->headblock.vtype; + if(ioformatted!=LISTDIRECTED && ISCOMPLEX(type) ) + { + nelt = mkexpr(OPSTAR, ICON(2), nelt); + type -= (TYCOMPLEX-TYREAL); + } + + /* pass a length with every item. for noncharacter data, fake one */ + if(type != TYCHAR) + { + + if( ISCONST(addr) ) + addr = (expptr) putconst((Constp)addr); + c = ALLOC(Addrblock); + c->tag = TADDR; + c->vtype = TYLENG; + c->vstg = STGAUTO; + c->ntempelt = 1; + c->isarray = 1; + c->memoffset = ICON(0); + c->uname_tag = UNAM_IDENT; + c->charleng = 1; + sprintf(c->user.ident, "(ftnlen)sizeof(%s)", Typename[type]); + addr = mkexpr(OPCHARCAST, addr, ENULL); + } + + nelt = fixtype( mkconv(tyioint,nelt) ); + if(ioformatted == LISTDIRECTED) { + expptr mc = mkconv(tyioint, ICON(typeconv[type])); + q = c ? call4(TYINT, "do_lio", mc, nelt, addr, (expptr)c) + : call3(TYINT, "do_lio", mc, nelt, addr); + } + else { + char *s = (char*)(ioformatted==FORMATTED ? "do_fio" + : !byterev ? "do_uio" + : ONEOF(type, M(TYCHAR)|M(TYINT1)|M(TYLOGICAL1)) + ? "do_ucio" : "do_unio"); + q = c ? call3(TYINT, s, nelt, addr, (expptr)c) + : call2(TYINT, s, nelt, addr); + } + iocalladdr = TYCHAR; + putiocall(q); + iocalladdr = TYADDR; +} + + + + void +endio(Void) +{ + if(skiplab) + { + if (ioformatted != NAMEDIRECTED) + p1_label((long)(skiplabel - labeltab)); + if(ioendlab) { + exif( mkexpr(OPLT, cpexpr(IOSTP), ICON(0))); + exgoto(execlab(ioendlab)); + exendif(); + } + if(ioerrlab) { + exif( mkexpr(iostmt==IOREAD||iostmt==IOWRITE + ? OPGT : OPNE, + cpexpr(IOSTP), ICON(0))); + exgoto(execlab(ioerrlab)); + exendif(); + } + } + + if(IOSTP) + frexpr(IOSTP); +} + + + + LOCAL void +#ifdef KR_headers +putiocall(q) + register expptr q; +#else +putiocall(register expptr q) +#endif +{ + int tyintsave; + + tyintsave = tyint; + tyint = tyioint; /* for -I2 and -i2 */ + + if(IOSTP) + { + q->headblock.vtype = TYINT; + q = fixexpr((Exprp)mkexpr(OPASSIGN, cpexpr(IOSTP), q)); + } + putexpr(q); + if(jumplab) { + exif(mkexpr(OPNE, cpexpr(IOSTP), ICON(0))); + exgoto(execlab(jumplab)); + exendif(); + } + tyint = tyintsave; +} + + void +#ifdef KR_headers +fmtname(np, q) + Namep np; + register Addrp q; +#else +fmtname(Namep np, register Addrp q) +#endif +{ + register int k; + register char *s, *t; + extern chainp assigned_fmts; + + if (!np->vfmt_asg) { + np->vfmt_asg = 1; + assigned_fmts = mkchain((char *)np, assigned_fmts); + } + k = strlen(s = np->fvarname); + if (k < IDENT_LEN - 4) { + q->uname_tag = UNAM_IDENT; + t = q->user.ident; + } + else { + q->uname_tag = UNAM_CHARP; + q->user.Charp = t = mem(k + 5,0); + } + sprintf(t, "%s_fmt", s); + } + + LOCAL Addrp +#ifdef KR_headers +asg_addr(p) + union Expression *p; +#else +asg_addr(union Expression *p) +#endif +{ + register Addrp q; + + if (p->tag != TPRIM) + badtag("asg_addr", p->tag); + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = TYCHAR; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->isarray = 0; + q->memoffset = ICON(0); + fmtname(p->primblock.namep, q); + return q; + } + + void +startrw(Void) +{ + register expptr p; + register Namep np; + register Addrp unitp, fmtp, recp; + register expptr nump; + int iostmt1; + flag intfile, sequential, ok, varfmt; + struct io_setup *ios; + + /* First look at all the parameters and determine what is to be done */ + + ok = YES; + statstruct = YES; + + intfile = NO; + if(p = V(IOSUNIT)) + { + if( ISINT(p->headblock.vtype) ) { + int_unit: + unitp = (Addrp) cpexpr(p); + } + else if(p->headblock.vtype == TYCHAR) + { + if (nioctl == 1 && iostmt == IOREAD) { + /* kludge to recognize READ(format expr) */ + V(IOSFMT) = p; + V(IOSUNIT) = p = (expptr) IOSTDIN; + ioformatted = FORMATTED; + goto int_unit; + } + intfile = YES; + if(p->tag==TPRIM && p->primblock.argsp==NULL && + (np = p->primblock.namep)->vdim!=NULL) + { + vardcl(np); + if(nump = np->vdim->nelt) + { + nump = fixtype(cpexpr(nump)); + if( ! ISCONST(nump) ) { + statstruct = NO; + np->vlastdim = 0; + } + } + else + { + err("attempt to use internal unit array of unknown size"); + ok = NO; + nump = ICON(1); + } + unitp = mkscalar(np); + } + else { + nump = ICON(1); + unitp = (Addrp /*pjw */) fixtype(cpexpr(p)); + } + if(! isstatic((expptr)unitp) ) + statstruct = NO; + } + else { + err("unit specifier not of type integer or character"); + ok = NO; + } + } + else + { + err("bad unit specifier"); + ok = NO; + } + + sequential = YES; + if(p = V(IOSREC)) + if( ISINT(p->headblock.vtype) ) + { + recp = (Addrp) cpexpr(p); + sequential = NO; + } + else { + err("bad REC= clause"); + ok = NO; + } + else + recp = NULL; + + + varfmt = YES; + fmtp = NULL; + if(p = V(IOSFMT)) + { + if(p->tag==TPRIM && p->primblock.argsp==NULL) + { + np = p->primblock.namep; + if(np->vclass == CLNAMELIST) + { + ioformatted = NAMEDIRECTED; + fmtp = (Addrp) fixtype(p); + V(IOSFMT) = (expptr)fmtp; + if (skiplab) + jumplab = 0; + goto endfmt; + } + vardcl(np); + if(np->vdim) + { + if( ! ONEOF(np->vstg, MSKSTATIC) ) + statstruct = NO; + fmtp = mkscalar(np); + goto endfmt; + } + if( ISINT(np->vtype) ) /* ASSIGNed label */ + { + statstruct = NO; + varfmt = YES; + fmtp = asg_addr(p); + goto endfmt; + } + } + p = V(IOSFMT) = fixtype(p); + if(p->headblock.vtype == TYCHAR + /* Since we allow write(6,n) */ + /* we may as well allow write(6,n(2)) */ + || p->tag == TADDR && ISINT(p->addrblock.vtype)) + { + if( ! isstatic(p) ) + statstruct = NO; + fmtp = (Addrp) cpexpr(p); + } + else if( ISICON(p) ) + { + struct Labelblock *lp; + lp = mklabel(p->constblock.Const.ci); + if (fmtstmt(lp) > 0) + { + fmtp = (Addrp)mkaddcon(lp->stateno); + /* lp->stateno for names fmt_nnn */ + lp->fmtlabused = 1; + varfmt = NO; + } + else + ioformatted = UNFORMATTED; + } + else { + err("bad format descriptor"); + ioformatted = UNFORMATTED; + ok = NO; + } + } + else + fmtp = NULL; + +endfmt: + if(intfile) { + if (ioformatted==UNFORMATTED) { + err("unformatted internal I/O not allowed"); + ok = NO; + } + if (recp) { + err("direct internal I/O not allowed"); + ok = NO; + } + } + if(!sequential && ioformatted==LISTDIRECTED) + { + err("direct list-directed I/O not allowed"); + ok = NO; + } + if(!sequential && ioformatted==NAMEDIRECTED) + { + err("direct namelist I/O not allowed"); + ok = NO; + } + + if( ! ok ) { + statstruct = NO; + return; + } + + /* + Now put out the I/O structure, statically if all the clauses + are constants, dynamically otherwise +*/ + + if (intfile) { + ios = io_stuff + iostmt; + iostmt1 = IOREAD; + } + else { + ios = io_stuff; + iostmt1 = 0; + } + io_fields = ios->fields; + if(statstruct) + { + ioblkp = ALLOC(Addrblock); + ioblkp->tag = TADDR; + ioblkp->vtype = ios->type; + ioblkp->vclass = CLVAR; + ioblkp->vstg = STGINIT; + ioblkp->memno = ++lastvarno; + ioblkp->memoffset = ICON(0); + ioblkp -> uname_tag = UNAM_IDENT; + new_iob_data(ios, + temp_name("io_", lastvarno, ioblkp->user.ident)); } + else if(!(ioblkp = io_structs[iostmt1])) + io_structs[iostmt1] = ioblkp = + autovar(1, ios->type, ENULL, ""); + + ioset(TYIOINT, XERR, ICON(errbit)); + if(iostmt == IOREAD) + ioset(TYIOINT, (intfile ? XIEND : XEND), ICON(endbit) ); + + if(intfile) + { + ioset(TYIOINT, XIRNUM, nump); + ioset(TYIOINT, XIRLEN, cpexpr(unitp->vleng) ); + ioseta(XIUNIT, unitp); + } + else + ioset(TYIOINT, XUNIT, (expptr) unitp); + + if(recp) + ioset(TYIOINT, /* intfile ? XIREC : */ XREC, (expptr) recp); + + if(varfmt) + ioseta( intfile ? XIFMT : XFMT , fmtp); + else + ioset(TYADDR, intfile ? XIFMT : XFMT, (expptr) fmtp); + + ioroutine[0] = 's'; + ioroutine[1] = '_'; + ioroutine[2] = iostmt==IOREAD ? 'r' : 'w'; + ioroutine[3] = "ds"[sequential]; + ioroutine[4] = "ufln"[ioformatted]; + ioroutine[5] = "ei"[intfile]; + ioroutine[6] = '\0'; + + putiocall( call1(TYINT, ioroutine, cpexpr((expptr)ioblkp) )); + + if(statstruct) + { + frexpr((expptr)ioblkp); + statstruct = NO; + ioblkp = 0; /* unnecessary */ + } +} + + + + LOCAL void +dofopen(Void) +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + ioset(TYIOINT, XUNIT, cpexpr(p) ); + else + err("bad unit in open"); + if( (p = V(IOSFILE)) ) + if(p->headblock.vtype == TYCHAR) + ioset(TYIOINT, XFNAMELEN, cpexpr(p->headblock.vleng) ); + else + err("bad file in open"); + + iosetc(XFNAME, p); + + if(p = V(IOSRECL)) + if( ISINT(p->headblock.vtype) ) + ioset(TYIOINT, XRECLEN, cpexpr(p) ); + else + err("bad recl"); + else + ioset(TYIOINT, XRECLEN, ICON(0) ); + + iosetc(XSTATUS, V(IOSSTATUS)); + iosetc(XACCESS, V(IOSACCESS)); + iosetc(XFORMATTED, V(IOSFORM)); + iosetc(XBLANK, V(IOSBLANK)); + + putiocall( call1(TYINT, "f_open", cpexpr((expptr)ioblkp) )); +} + + + LOCAL void +dofclose(Void) +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + { + ioset(TYIOINT, XUNIT, cpexpr(p) ); + iosetc(XCLSTATUS, V(IOSSTATUS)); + putiocall( call1(TYINT, "f_clos", cpexpr((expptr)ioblkp)) ); + } + else + err("bad unit in close statement"); +} + + + LOCAL void +dofinquire(Void) +{ + register expptr p; + if(p = V(IOSUNIT)) + { + if( V(IOSFILE) ) + err("inquire by unit or by file, not both"); + ioset(TYIOINT, XUNIT, cpexpr(p) ); + } + else if( ! V(IOSFILE) ) + err("must inquire by unit or by file"); + iosetlc(IOSFILE, XFILE, XFILELEN); + iosetip(IOSEXISTS, XEXISTS); + iosetip(IOSOPENED, XOPEN); + iosetip(IOSNUMBER, XNUMBER); + iosetip(IOSNAMED, XNAMED); + iosetlc(IOSNAME, XNAME, XNAMELEN); + iosetlc(IOSACCESS, XQACCESS, XQACCLEN); + iosetlc(IOSSEQUENTIAL, XSEQ, XSEQLEN); + iosetlc(IOSDIRECT, XDIRECT, XDIRLEN); + iosetlc(IOSFORM, XFORM, XFORMLEN); + iosetlc(IOSFORMATTED, XFMTED, XFMTEDLEN); + iosetlc(IOSUNFORMATTED, XUNFMT, XUNFMTLEN); + iosetip(IOSRECL, XQRECL); + iosetip(IOSNEXTREC, XNEXTREC); + iosetlc(IOSBLANK, XQBLANK, XQBLANKLEN); + + putiocall( call1(TYINT, "f_inqu", cpexpr((expptr)ioblkp) )); +} + + + + LOCAL void +#ifdef KR_headers +dofmove(subname) + char *subname; +#else +dofmove(char *subname) +#endif +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + { + ioset(TYIOINT, XUNIT, cpexpr(p) ); + putiocall( call1(TYINT, subname, cpexpr((expptr)ioblkp) )); + } + else + err("bad unit in I/O motion statement"); +} + +static int ioset_assign = OPASSIGN; + + LOCAL void +#ifdef KR_headers +ioset(type, offset, p) + int type; + int offset; + register expptr p; +#else +ioset(int type, int offset, register expptr p) +#endif +{ + offset /= SZLONG; + if(statstruct && ISCONST(p)) { + register char *s; + switch(type) { + case TYADDR: /* stmt label */ + s = "fmt_"; + break; + case TYIOINT: + s = ""; + break; + default: + badtype("ioset", type); + } + iob_list->fields[offset] = + string_num(s, p->constblock.Const.ci); + frexpr(p); + } + else { + register Addrp q; + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = type; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->isarray = 0; + q->memoffset = ICON(0); + q->uname_tag = UNAM_IDENT; + sprintf(q->user.ident, "%s.%s", + statstruct ? iob_list->name : ioblkp->user.ident, + io_fields[offset + 1]); + if (type == TYADDR && p->tag == TCONST + && p->constblock.vtype == TYADDR) { + /* kludge */ + register Addrp p1; + p1 = ALLOC(Addrblock); + p1->tag = TADDR; + p1->vtype = type; + p1->vstg = STGAUTO; /* wrong, but who cares? */ + p1->ntempelt = 1; + p1->isarray = 0; + p1->memoffset = ICON(0); + p1->uname_tag = UNAM_IDENT; + sprintf(p1->user.ident, "fmt_%ld", + p->constblock.Const.ci); + frexpr(p); + p = (expptr)p1; + } + if (type == TYADDR && p->headblock.vtype == TYCHAR) + q->vtype = TYCHAR; + putexpr(mkexpr(ioset_assign, (expptr)q, p)); + } +} + + + + + LOCAL void +#ifdef KR_headers +iosetc(offset, p) + int offset; + register expptr p; +#else +iosetc(int offset, register expptr p) +#endif +{ + if(p == NULL) + ioset(TYADDR, offset, ICON(0) ); + else if(p->headblock.vtype == TYCHAR) { + p = putx(fixtype((expptr)putchop(cpexpr(p)))); + ioset(TYADDR, offset, addrof(p)); + } + else + err("non-character control clause"); +} + + + + LOCAL void +#ifdef KR_headers +ioseta(offset, p) + int offset; + register Addrp p; +#else +ioseta(int offset, register Addrp p) +#endif +{ + char *s, *s1; + static char who[] = "ioseta"; + expptr e, mo; + Namep np; + ftnint ci; + int k; + char buf[24], buf1[24]; + Extsym *comm; + extern int usedefsforcommon; + + if(statstruct) + { + if (!p) + return; + if (p->tag != TADDR) + badtag(who, p->tag); + offset /= SZLONG; + switch(p->uname_tag) { + case UNAM_NAME: + mo = p->memoffset; + if (mo->tag != TCONST) + badtag("ioseta/memoffset", mo->tag); + np = p->user.name; + np->visused = 1; + ci = mo->constblock.Const.ci - np->voffset; + if (np->vstg == STGCOMMON + && !np->vcommequiv + && !usedefsforcommon) { + comm = &extsymtab[np->vardesc.varno]; + sprintf(buf, "%d.", comm->curno); + k = strlen(buf) + strlen(comm->cextname) + + strlen(np->cvarname); + if (ci) { + sprintf(buf1, "+%ld", ci); + k += strlen(buf1); + } + else + buf1[0] = 0; + s = mem(k + 1, 0); + sprintf(s, "%s%s%s%s", comm->cextname, buf, + np->cvarname, buf1); + } + else if (ci) { + sprintf(buf,"%ld", ci); + s1 = p->user.name->cvarname; + k = strlen(buf) + strlen(s1); + sprintf(s = mem(k+2,0), "%s+%s", s1, buf); + } + else + s = cpstring(np->cvarname); + break; + case UNAM_CONST: + s = tostring(p->user.Const.ccp1.ccp0, + (int)p->vleng->constblock.Const.ci); + break; + default: + badthing("uname_tag", who, p->uname_tag); + } + /* kludge for Hollerith */ + if (p->vtype != TYCHAR) { + s1 = mem(strlen(s)+10,0); + sprintf(s1, "(char *)%s%s", p->isarray ? "" : "&", s); + s = s1; + } + iob_list->fields[offset] = s; + } + else { + if (!p) + e = ICON(0); + else if (p->vtype != TYCHAR) { + NOEXT("non-character variable as format or internal unit"); + e = mkexpr(OPCHARCAST, (expptr)p, ENULL); + } + else + e = addrof((expptr)p); + ioset(TYADDR, offset, e); + } +} + + + + + LOCAL void +#ifdef KR_headers +iosetip(i, offset) + int i; + int offset; +#else +iosetip(int i, int offset) +#endif +{ + register expptr p; + + if(p = V(i)) + if(p->tag==TADDR && + ONEOF(p->addrblock.vtype, inqmask) ) { + ioset_assign = OPASSIGNI; + ioset(TYADDR, offset, addrof(cpexpr(p)) ); + ioset_assign = OPASSIGN; + } + else + errstr("impossible inquire parameter %s", ioc[i].iocname); + else + ioset(TYADDR, offset, ICON(0) ); +} + + + + LOCAL void +#ifdef KR_headers +iosetlc(i, offp, offl) + int i; + int offp; + int offl; +#else +iosetlc(int i, int offp, int offl) +#endif +{ + register expptr p; + if( (p = V(i)) && p->headblock.vtype==TYCHAR) + ioset(TYIOINT, offl, cpexpr(p->headblock.vleng) ); + iosetc(offp, p); +} diff --git a/tools/connec/src/io.o b/tools/connec/src/io.o new file mode 100644 index 0000000000000000000000000000000000000000..58b7eb2588a62e8626e4cf17b26fe5c858acf73f GIT binary patch literal 37808 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', SGT, + 0, 0 }; + +LOCAL struct Dotlist dots[ ] = +{ + "and.", SAND, + "or.", SOR, + "not.", SNOT, + "true.", STRUE, + "false.", SFALSE, + "eq.", SEQ, + "ne.", SNE, + "lt.", SLT, + "le.", SLE, + "gt.", SGT, + "ge.", SGE, + "neqv.", SNEQV, + "eqv.", SEQV, + 0, 0 }; + +LOCAL struct Keylist keys[ ] = +{ + { "assign", SASSIGN }, + { "automatic", SAUTOMATIC, YES }, + { "backspace", SBACKSPACE }, + { "blockdata", SBLOCK }, + { "byte", SBYTE }, + { "call", SCALL }, + { "character", SCHARACTER, YES }, + { "close", SCLOSE, YES }, + { "common", SCOMMON }, + { "complex", SCOMPLEX }, + { "continue", SCONTINUE }, + { "data", SDATA }, + { "dimension", SDIMENSION }, + { "doubleprecision", SDOUBLE }, + { "doublecomplex", SDCOMPLEX, YES }, + { "elseif", SELSEIF, YES }, + { "else", SELSE, YES }, + { "endfile", SENDFILE }, + { "endif", SENDIF, YES }, + { "enddo", SENDDO, YES }, + { "end", SEND }, + { "entry", SENTRY, YES }, + { "equivalence", SEQUIV }, + { "external", SEXTERNAL }, + { "format", SFORMAT }, + { "function", SFUNCTION }, + { "goto", SGOTO }, + { "implicit", SIMPLICIT, YES }, + { "include", SINCLUDE, YES }, + { "inquire", SINQUIRE, YES }, + { "intrinsic", SINTRINSIC, YES }, + { "integer", SINTEGER }, + { "logical", SLOGICAL }, + { "namelist", SNAMELIST, YES }, + { "none", SUNDEFINED, YES }, + { "open", SOPEN, YES }, + { "parameter", SPARAM, YES }, + { "pause", SPAUSE }, + { "print", SPRINT }, + { "program", SPROGRAM, YES }, + { "punch", SPUNCH, YES }, + { "read", SREAD }, + { "real", SREAL }, + { "return", SRETURN }, + { "rewind", SREWIND }, + { "save", SSAVE, YES }, + { "static", SSTATIC, YES }, + { "stop", SSTOP }, + { "subroutine", SSUBROUTINE }, + { "then", STHEN, YES }, + { "undefined", SUNDEFINED, YES }, + { "while", SWHILE, YES }, + { "write", SWRITE }, + { 0, 0 } +}; + +static void analyz Argdcl((void)); +static void crunch Argdcl((void)); +static int getcd Argdcl((char*, int)); +static int getcds Argdcl((void)); +static int getkwd Argdcl((void)); +static int gettok Argdcl((void)); +static void store_comment Argdcl((char*)); +LOCAL char *stbuf[3]; + + int +#ifdef KR_headers +inilex(name) + char *name; +#else +inilex(char *name) +#endif +{ + stbuf[0] = Alloc(3*P1_STMTBUFSIZE); + stbuf[1] = stbuf[0] + P1_STMTBUFSIZE; + stbuf[2] = stbuf[1] + P1_STMTBUFSIZE; + nincl = 0; + inclp = NULL; + doinclude(name); + lexstate = NEWSTMT; + return(NO); +} + + + +/* throw away the rest of the current line */ + void +flline(Void) +{ + lexstate = RETEOS; +} + + + + char * +#ifdef KR_headers +lexline(n) + int *n; +#else +lexline(int *n) +#endif +{ + *n = (lastch - nextch) + 1; + return(nextch); +} + + + + + void +#ifdef KR_headers +doinclude(name) + char *name; +#else +doinclude(char *name) +#endif +{ + FILEP fp; + struct Inclfile *t; + char *name0, *lastslash, *s, *s0, *temp; + int j, k; + chainp I; + extern chainp Iargs; + + err_lineno = -1; + if(inclp) + { + inclp->incllno = thislin; + inclp->inclcode = code; + inclp->inclstno = nxtstno; + if(nextcd && (j = endcd - nextcd) > 0) + inclp->incllinp = copyn(inclp->incllen = j, nextcd); + else + inclp->incllinp = 0; + } + nextcd = NULL; + + if(++nincl >= MAXINCLUDES) + Fatal("includes nested too deep"); + if(name[0] == '\0') + fp = stdin; + else if(name[0] == '/' || inclp == NULL +#ifdef MSDOS + || name[0] == '\\' + || name[1] == ':' +#endif + ) + fp = fopen(name, textread); + else { + lastslash = NULL; + s = s0 = inclp->inclname; +#ifdef MSDOS + if (s[1] == ':') + lastslash = s + 1; +#endif + for(; *s ; ++s) + if(*s == '/' +#ifdef MSDOS + || *s == '\\' +#endif + ) + lastslash = s; + name0 = name; + if(lastslash) { + k = lastslash - s0 + 1; + temp = Alloc(k + strlen(name) + 1); + strncpy(temp, s0, k); + strcpy(temp+k, name); + name = temp; + } + fp = fopen(name, textread); + if (!fp && (I = Iargs)) { + k = strlen(name0) + 2; + for(; I; I = I->nextp) { + j = strlen(s = I->datap); + name = Alloc(j + k); + strcpy(name, s); + switch(s[j-1]) { + case '/': +#ifdef MSDOS + case ':': + case '\\': +#endif + break; + default: + name[j++] = '/'; + } + strcpy(name+j, name0); + if (fp = fopen(name, textread)) { + free(name0); + goto havefp; + } + free(name); + name = name0; + } + } + } + if (fp) + { + havefp: + t = inclp; + inclp = ALLOC(Inclfile); + inclp->inclnext = t; + prevlin = thislin = lineno = 0; + infname = inclp->inclname = name; + infile = inclp->inclfp = fp; + lastline = 0; + putlineno(); + lastline = 0; + } + else + { + fprintf(diagfile, "Cannot open file %s\n", name); + done(1); + } +} + + + + + LOCAL int +popinclude(Void) +{ + struct Inclfile *t; + register char *p; + register int k; + + if(infile != stdin) + clf(&infile, infname, 1); /* Close the input file */ + free(infname); + + --nincl; + err_lineno = -1; + t = inclp->inclnext; + free( (charptr) inclp); + inclp = t; + if(inclp == NULL) { + infname = 0; + return(NO); + } + + infile = inclp->inclfp; + infname = inclp->inclname; + lineno = prevlin = thislin = inclp->incllno; + code = inclp->inclcode; + stno = nxtstno = inclp->inclstno; + if(inclp->incllinp) + { + lastline = 0; + putlineno(); + lastline = lineno; + endcd = nextcd = sbuf; + k = inclp->incllen; + p = inclp->incllinp; + while(--k >= 0) + *endcd++ = *p++; + free( (charptr) (inclp->incllinp) ); + } + else + nextcd = NULL; + return(YES); +} + + + void +#ifdef KR_headers +p1_line_number(line_number) + long line_number; +#else +p1_line_number(long line_number) +#endif +{ + if (lastfile != lastfile0) { + p1puts(P1_FILENAME, fbuf); + lastfile0 = lastfile; + } + fprintf(pass1_file, "%d: %ld\n", P1_SET_LINE, line_number); + } + + static void +putlineno(Void) +{ + extern int gflag; + register char *s0, *s1; + + if (gflag) { + if (lastline) + p1_line_number(lastline); + lastline = firstline; + if (lastfile != infname) + if (lastfile = infname) { + strncpy(fbuf, lastfile, sizeof(fbuf)); + fbuf[sizeof(fbuf)-1] = 0; + } + else + fbuf[0] = 0; + } + if (addftnsrc) { + if (laststb && *laststb) { + for(s1 = laststb; *s1; s1++) { + for(s0 = s1; *s1 != '\n'; s1++) + if (*s1 == '*' && s1[1] == '/') + *s1 = '+'; + *s1 = 0; + p1puts(P1_FORTRAN, s0); + } + *laststb = 0; /* prevent trouble after EOF */ + } + laststb = stb0; + } + } + + int +yylex(Void) +{ + static int tokno; + int retval; + + switch(lexstate) + { + case NEWSTMT : /* need a new statement */ + retval = getcds(); + putlineno(); + if(retval == STEOF) { + retval = SEOF; + break; + } /* if getcds() == STEOF */ + crunch(); + tokno = 0; + lexstate = FIRSTTOKEN; + yystno = stno; + stno = nxtstno; + toklen = 0; + retval = SLABEL; + break; + +first: + case FIRSTTOKEN : /* first step on a statement */ + analyz(); + lexstate = OTHERTOKEN; + tokno = 1; + retval = stkey; + break; + + case OTHERTOKEN : /* return next token */ + if(nextch > lastch) + goto reteos; + ++tokno; + if( (stkey==SLOGIF || stkey==SELSEIF) && parlev==0 && tokno>3) + goto first; + + if(stkey==SASSIGN && tokno==3 && nextch sbuf) + { + q = nextcd; + p = sbuf; + while(q < endcd) + *p++ = *q++; + endcd = p; + } + +/* Be aware that the input (i.e. the string at the address nextcd) is NOT + NULL-terminated */ + +/* This loop merges all continuations into one long statement, AND puts the next + card to be read at the end of the buffer (i.e. it stores the look-ahead card + when there's room) */ + + ncont = 0; + for(;;) { + nextcd = endcd; + if (ncont >= maxcont || nextcd+66 > send) + contmax(); + linestart[ncont++] = nextcd; + if ((code = getcd(nextcd,0)) != STCONTINUE) + break; + if (ncont == 20 && noextflag) { + lineno = thislin; + errext("more than 19 continuation lines"); + } + } + nextch = sbuf; + lastch = nextcd - 1; + + lineno = prevlin; + prevlin = thislin; + if (infname2) { + free(infname); + infname = infname2; + if (inclp) + inclp->inclname = infname; + } + infname2 = infname1; + infname1 = 0; + return(STINITIAL); +} + + static void +#ifdef KR_headers +bang(a, b, c, d, e) + char *a; + char *b; + char *c; + register char *d; + register char *e; +#else +bang(char *a, char *b, char *c, register char *d, register char *e) +#endif + /* save ! comments */ +{ + char buf[COMMENT_BUFFER_SIZE + 1]; + register char *p, *pe; + + p = buf; + pe = buf + COMMENT_BUFFER_SIZE; + *pe = 0; + while(a < b) + if (!(*p++ = *a++)) + p[-1] = 0; + if (b < c) + *p++ = '\t'; + while(d < e) { + if (!(*p++ = *d++)) + p[-1] = ' '; + if (p == pe) { + store_comment(buf); + p = buf; + } + } + if (p > buf) { + while(--p >= buf && *p == ' '); + p[1] = 0; + store_comment(buf); + } + } + + +/* getcd - Get next input card + + This function reads the next input card from global file pointer infile. +It assumes that b points to currently empty storage somewhere in sbuf */ + + LOCAL int +#ifdef KR_headers +getcd(b, nocont) + register char *b; + int nocont; +#else +getcd(register char *b, int nocont) +#endif +{ + register int c; + register char *p, *bend; + int speclin; /* Special line - true when the line is allowed + to have more than 66 characters (e.g. the + "&" shorthand for continuation, use of a "\t" + to skip part of the label columns) */ + static char a[6]; /* Statement label buffer */ + static char *aend = a+6; + static char *stb, *stbend; + static int nst; + char *atend, *endcd0; + extern int warn72; + char buf72[24]; + int amp, i; + char storage[COMMENT_BUFFER_SIZE + 1]; + char *pointer; + long L; + +top: + endcd = b; + bend = b+66; + amp = speclin = NO; + atend = aend; + +/* Handle the continuation shorthand of "&" in the first column, which stands + for " x" */ + + if( (c = getc(infile)) == '&') + { + a[0] = c; + a[1] = 0; + a[5] = 'x'; + amp = speclin = YES; + bend = send; + p = aend; + } + +/* Handle the Comment cards (a 'C', 'c', '*', or '!' in the first column). */ + + else if(comstart[c & (Table_size-1)]) + { + if (feof (infile) +#ifdef EOF_CHAR + || c == EOF_CHAR +#endif + ) + return STEOF; + + if (c == '#') { + *endcd++ = c; + while((c = getc(infile)) != '\n') + if (c == EOF) + return STEOF; + else if (endcd < shend) + *endcd++ = c; + ++thislin; + *endcd = 0; + if (b[1] == ' ') + p = b + 2; + else if (!strncmp(b,"#line ",6)) + p = b + 6; + else { + bad_cpp: + lineno = thislin; + errstr("Bad # line: \"%s\"", b); + goto top; + } + if (*p < '1' || *p > '9') + goto bad_cpp; + L = *p - '0'; + while((c = *++p) >= '0' && c <= '9') + L = 10*L + c - '0'; + while(c == ' ') + c = *++p; + if (!c) { + /* accept "# 1234" */ + thislin = L - 1; + goto top; + } + if (c != '"') + goto bad_cpp; + bend = p; + while(*++p != '"') + if (!*p) + goto bad_cpp; + *p = 0; + i = p - bend++; + thislin = L - 1; + if (!infname1 || strcmp(infname1, bend)) { + if (infname1) + free(infname1); + if (infname && !strcmp(infname, bend)) { + infname1 = 0; + goto top; + } + lastfile = 0; + infname1 = Alloc(i); + strcpy(infname1, bend); + if (!infname) { + infname = infname1; + infname1 = 0; + } + } + goto top; + } + + storage[COMMENT_BUFFER_SIZE] = c = '\0'; + pointer = storage; + while( !feof (infile) && (*pointer++ = c = getc(infile)) != '\n') { + +/* Handle obscure end of file conditions on many machines */ + + if (feof (infile) && (c == '\377' || c == EOF)) { + pointer--; + break; + } /* if (feof (infile)) */ + + if (c == '\0') + *(pointer - 1) = ' '; + + if (pointer == &storage[COMMENT_BUFFER_SIZE]) { + store_comment (storage); + pointer = storage; + } /* if (pointer == BUFFER_SIZE) */ + } /* while */ + + if (pointer > storage) { + if (c == '\n') + +/* Get rid of the newline */ + + pointer[-1] = 0; + else + *pointer = 0; + + store_comment (storage); + } /* if */ + + if (feof (infile)) + if (c != '\n') /* To allow the line index to + increment correctly */ + return STEOF; + + ++thislin; + goto top; + } + + else if(c != EOF) + { + +/* Load buffer a with the statement label */ + + /* a tab in columns 1-6 skips to column 7 */ + ungetc(c, infile); + for(p=a; p= 23) + strcpy(buf72+20, "..."); + lineno = thislin + 1; + errstr("text after column 72: %s", buf72); + } + if(c == EOF) + return(STEOF); + } + + endcd0 = endcd; + if( ! speclin ) + while(endcd < bend) + *endcd++ = BLANK; + } + +/* The flow of control usually gets to this line (unless an earlier RETURN has + been taken) */ + + ++thislin; + + /* Fortran 77 specifies that a 0 in column 6 */ + /* does not signify continuation */ + + if( !isspace(a[5]) && a[5]!='0') { + if (!amp) + for(p = a; p < aend;) + if (*p++ == '!' && p != aend) + goto initcheck; + if (addftnsrc && stb) { + if (stbend > stb + 7) { /* otherwise forget col 1-6 */ + /* kludge around funny p1gets behavior */ + *stb++ = '$'; + if (amp) + *stb++ = '&'; + else + for(p = a; p < atend;) + *stb++ = *p++; + } + if (endcd0 - b > stbend - stb) { + if (stb > stbend) + stb = stbend; + endcd0 = b + (stbend - stb); + } + for(p = b; p < endcd0;) + *stb++ = *p++; + *stb++ = '\n'; + *stb = 0; + } + if (nocont) { + lineno = thislin; + errstr("illegal continuation card (starts \"%.6s\")",a); + } + else if (!amp && strncmp(a," ",5)) { + lineno = thislin; + errstr("labeled continuation line (starts \"%.6s\")",a); + } + return(STCONTINUE); + } +initcheck: + for(p=a; p= linestart[k]) + if (++k >= maxcont) + contmax(); + j0 = linestart[k]; + if (!addftnsrc) + bang(sbuf,sbuf,sbuf,i+1,j0); + i = j0-1; + continue; + } + +/* Keep everything in a quoted string */ + + if(*i=='\'' || *i=='"') + { + int len = 0; + + quote = *i; + *j = MYQUOTE; /* special marker */ + for(;;) + { + if(++i > lastch) + { + err("unbalanced quotes; closing quote supplied"); + if (j >= lastch) + j = lastch - 1; + break; + } + if(*i == quote) + if(i maxtoklen) + adjtoklen(len); + j[1] = MYQUOTE; + j += 2; + prvstr = j; + } + else if( (*i=='h' || *i=='H') && j>prvstr) /* test for Hollerith strings */ + { + j0 = j - 1; + if( ! isdigit(*j0)) goto copychar; + nh = *j0 - '0'; + ten = 10; + j1 = prvstr; + if (j1 > sbuf && j1[-1] == MYQUOTE) + --j1; + if (j1+4 < j) + j1 = j-4; + for(;;) { + if (j0-- <= j1) + goto copychar; + if( ! isdigit(*j0 ) ) break; + nh += ten * (*j0-'0'); + ten*=10; + } +/* A Hollerith string must be preceded by a punctuation mark. + '*' is possible only as repetition factor in a data statement + not, in particular, in character*2h . + To avoid some confusion with missing commas in FORMAT statements, + treat a preceding string as a punctuation mark. + */ + + if( !(*j0=='*'&&sbuf[0]=='d') && *j0!='/' + && *j0!='(' && *j0!=',' && *j0!='=' && *j0!='.' + && *j0 != MYQUOTE) + goto copychar; + nh0 = nh; + if(i+nh > lastch) + { + erri("%dH too big", nh); + nh = lastch - i; + nh0 = -1; + } + if (nh > maxtoklen) + adjtoklen(nh); + j0[1] = MYQUOTE; /* special marker */ + j = j0 + 1; + while(nh-- > 0) + { + if (++i > lastch) { + hol_overflow: + if (nh0 >= 0) + erri("escapes make %dH too big", + nh0); + break; + } + if(*i == '\\' && use_bs) { + if (++i > lastch) + goto hol_overflow; + *i = escapes[*(unsigned char *)i]; + } + *++j = *i; + } + j[1] = MYQUOTE; + j+=2; + prvstr = j; + } + else { + if(*i == '(') parseen = ++parlev; + else if(*i == ')') --parlev; + else if(parlev == 0) + if(*i == '=') expeql = 1; + else if(*i == ',') expcom = 1; +copychar: /*not a string or space -- copy, shifting case if necessary */ + if(shiftcase && isupper(*i)) + *j++ = tolower(*i); + else *j++ = *i; + } + } + lastch = j - 1; + nextch = sbuf; +} + + LOCAL void +analyz(Void) +{ + register char *i; + + if(parlev != 0) + { + err("unbalanced parentheses, statement skipped"); + stkey = SUNKNOWN; + lastch = sbuf - 1; /* prevent double error msg */ + return; + } + if(nextch+2<=lastch && nextch[0]=='i' && nextch[1]=='f' && nextch[2]=='(') + { + /* assignment or if statement -- look at character after balancing paren */ + parlev = 1; + for(i=nextch+3 ; i<=lastch; ++i) + if(*i == (MYQUOTE)) + { + while(*++i != MYQUOTE) + ; + } + else if(*i == '(') + ++parlev; + else if(*i == ')') + { + if(--parlev == 0) + break; + } + if(i >= lastch) + stkey = SLOGIF; + else if(i[1] == '=') + stkey = SLET; + else if( isdigit(i[1]) ) + stkey = SARITHIF; + else stkey = SLOGIF; + if(stkey != SLET) + nextch += 2; + } + else if(expeql) /* may be an assignment */ + { + if(expcom && nextch= '0' && nextch[2] <= '9') + || nextch[2] == ',' + || nextch[2] == 'w')) + { + stkey = SDO; + nextch += 2; + needwkey = 1; + } + /* otherwise search for keyword */ + else { + stkey = getkwd(); + if(stkey==SGOTO && lastch>=nextch) + if(nextch[0]=='(') + stkey = SCOMPGOTO; + else if(isalpha_(* USC nextch)) + stkey = SASGOTO; + } + parlev = 0; +} + + + + LOCAL int +getkwd(Void) +{ + register char *i, *j; + register struct Keylist *pk, *pend; + int k; + + if(! isalpha_(* USC nextch) ) + return(SUNKNOWN); + k = letter(nextch[0]); + if(pk = keystart[k]) + for(pend = keyend[k] ; pk<=pend ; ++pk ) + { + i = pk->keyname; + j = nextch; + while(*++i==*++j && *i!='\0') + ; + if(*i=='\0' && j<=lastch+1) + { + nextch = j; + if(no66flag && pk->notinf66) + errstr("Not a Fortran 66 keyword: %s", + pk->keyname); + return(pk->keyval); + } + } + return(SUNKNOWN); +} + + void +initkey(Void) +{ + register struct Keylist *p; + register int i,j; + register char *s; + + for(i = 0 ; i<26 ; ++i) + keystart[i] = NULL; + + for(p = keys ; p->keyname ; ++p) { + j = letter(p->keyname[0]); + if(keystart[j] == NULL) + keystart[j] = p; + keyend[j] = p; + } + i = (maxcontin + 2) * 66; + sbuf = (char *)ckalloc(i + 70 + MAX_SHARPLINE_LEN); + send = sbuf + i; + shend = send + MAX_SHARPLINE_LEN; + maxcont = maxcontin + 1; + linestart = (char **)ckalloc(maxcont*sizeof(char*)); + comstart['c'] = comstart['C'] = comstart['*'] = comstart['!'] = + comstart['#'] = 1; +#ifdef EOF_CHAR + comstart[EOF_CHAR] = 1; +#endif + s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; + while(i = *s++) + anum_buf[i] = 1; + s = "0123456789"; + while(i = *s++) + anum_buf[i] = 2; + } + + LOCAL int +#ifdef KR_headers +hexcheck(key) + int key; +#else +hexcheck(int key) +#endif +{ + register int radix; + register char *p; + char *kind; + + switch(key) { + case 'z': + case 'Z': + case 'x': + case 'X': + radix = 16; + key = SHEXCON; + kind = "hexadecimal"; + break; + case 'o': + case 'O': + radix = 8; + key = SOCTCON; + kind = "octal"; + break; + case 'b': + case 'B': + radix = 2; + key = SBITCON; + kind = "binary"; + break; + default: + err("bad bit identifier"); + return(SNAME); + } + for(p = token; *p; p++) + if (hextoi(*p) >= radix) { + errstr("invalid %s character", kind); + break; + } + return key; + } + +/* gettok -- moves the right amount of text from nextch into the token + buffer. token initially contains garbage (leftovers from the prev token) */ + + LOCAL int +gettok(Void) +{ + int havdot, havexp, havdbl; + int radix, val; + struct Punctlist *pp; + struct Dotlist *pd; + register int ch; + static char Exp_mi[] = "X**-Y treated as X**(-Y)", + Exp_pl[] = "X**+Y treated as X**(+Y)"; + + char *i, *j, *n1, *p; + + ch = * USC nextch; + if(ch == (MYQUOTE)) + { + ++nextch; + p = token; + while(*nextch != MYQUOTE) + *p++ = *nextch++; + toklen = p - token; + *p = 0; + /* allow octal, binary, hex constants of the form 'abc'x (etc.) */ + if (++nextch <= lastch && isalpha_(val = * USC nextch)) { + ++nextch; + return hexcheck(val); + } + return (SHOLLERITH); + } + + if(needkwd) + { + needkwd = 0; + return( getkwd() ); + } + + for(pp=puncts; pp->punchar; ++pp) + if(ch == pp->punchar) { + val = pp->punval; + if (++nextch <= lastch) + switch(ch) { + case '/': + switch(*nextch) { + case '/': + nextch++; + val = SCONCAT; + break; + case '=': + goto sne; + default: + if (new_dcl && parlev == 0) + val = SSLASHD; + } + return val; + case '*': + if (*nextch == '*') { + nextch++; + if (noextflag + && nextch <= lastch) + switch(*nextch) { + case '-': + errext(Exp_mi); + break; + case '+': + errext(Exp_pl); + } + return SPOWER; + } + break; + case '<': + switch(*nextch) { + case '=': + nextch++; + val = SLE; + break; + case '>': + sne: + nextch++; + val = SNE; + } + goto extchk; + case '=': + if (*nextch == '=') { + nextch++; + val = SEQ; + goto extchk; + } + break; + case '>': + if (*nextch == '=') { + nextch++; + val = SGE; + } + extchk: + NOEXT("Fortran 8x comparison operator"); + return val; + } + else if (ch == '/' && new_dcl && parlev == 0) + return SSLASHD; + switch(val) { + case SLPAR: + ++parlev; + break; + case SRPAR: + --parlev; + } + return(val); + } + if(ch == '.') + if(nextch >= lastch) goto badchar; + else if(isdigit(nextch[1])) goto numconst; + else { + for(pd=dots ; (j=pd->dotname) ; ++pd) + { + for(i=nextch+1 ; i<=lastch ; ++i) + if(*i != *j) break; + else if(*i != '.') ++j; + else { + nextch = i+1; + return(pd->dotval); + } + } + goto badchar; + } + if( isalpha_(ch) ) + { + p = token; + *p++ = *nextch++; + while(nextch<=lastch) + if( isalnum_(* USC nextch) ) + *p++ = *nextch++; + else break; + toklen = p - token; + *p = 0; + if (needwkey) { + needwkey = 0; + if (toklen == 5 + && nextch <= lastch && *nextch == '(' /*)*/ + && !strcmp(token,"while")) + return(SWHILE); + } + if(inioctl && nextch<=lastch && *nextch=='=') + { + ++nextch; + return(SNAMEEQ); + } + if(toklen>8 && eqn(8,token,"function") + && isalpha_(* USC (token+8)) && + nextch MAXNAMELEN) + { + char buff[2*MAXNAMELEN+50]; + if (toklen >= MAXNAMELEN+10) + sprintf(buff, + "name %.*s... too long, truncated to %.*s", + MAXNAMELEN+6, token, MAXNAMELEN, token); + else + sprintf(buff, + "name %s too long, truncated to %.*s", + token, MAXNAMELEN, token); + err(buff); + toklen = MAXNAMELEN; + token[MAXNAMELEN] = '\0'; + } + if(toklen==1 && *nextch==MYQUOTE) { + val = token[0]; + ++nextch; + for(p = token ; *nextch!=MYQUOTE ; ) + *p++ = *nextch++; + ++nextch; + toklen = p - token; + *p = 0; + return hexcheck(val); + } + return(SNAME); + } + + if (isdigit(ch)) { + + /* Check for NAG's special hex constant */ + + if (nextch[1] == '#' && nextch < lastch + || nextch[2] == '#' && isdigit(nextch[1]) + && lastch - nextch >= 2) { + + radix = atoi (nextch); + if (*++nextch != '#') + nextch++; + if (radix != 2 && radix != 8 && radix != 16) { + erri("invalid base %d for constant, defaulting to hex", + radix); + radix = 16; + } /* if */ + if (++nextch > lastch) + goto badchar; + for (p = token; hextoi(*nextch) < radix;) { + *p++ = *nextch++; + if (nextch > lastch) + break; + } + toklen = p - token; + *p = 0; + return (radix == 16) ? SHEXCON : ((radix == 8) ? SOCTCON : + SBITCON); + } + } + else + goto badchar; +numconst: + havdot = NO; + havexp = NO; + havdbl = NO; + for(n1 = nextch ; nextch<=lastch ; ++nextch) + { + if(*nextch == '.') + if(havdot) break; + else if(nextch+2<=lastch && isalpha_(* USC (nextch+1)) + && isalpha_(* USC (nextch+2))) + break; + else havdot = YES; + else if( ! isdigit(* USC nextch) ) { + if( !intonly && (*nextch=='d' || *nextch=='e') ) { + p = nextch; + havexp = YES; + if(*nextch == 'd') + havdbl = YES; + if(nextch cblast) { + ncb = 0; + if (cbcur) { + cbcur->last = cbnext; + ncb = cbcur->next; + } + if (!ncb) { + ncb = (comment_buf *) Alloc(sizeof(comment_buf)); + if (cbcur) + cbcur->next = ncb; + else { + cbfirst = ncb; + cbinit = ncb->buf; + } + ncb->next = 0; + } + cbcur = ncb; + cbnext = ncb->buf; + cblast = cbnext + COMMENT_BUF_STORE; + } + strcpy(cbnext, str); + cbnext += len; + } + + static void +flush_comments(Void) +{ + register char *s, *s1; + register comment_buf *cb; + if (cbnext == cbinit) + return; + cbcur->last = cbnext; + for(cb = cbfirst;; cb = cb->next) { + for(s = cb->buf; s < cb->last; s = s1) { + /* compute s1 = new s value first, since */ + /* p1_comment may insert nulls into s */ + s1 = s + strlen(s) + 1; + p1_comment(s); + } + if (cb == cbcur) + break; + } + cbcur = cbfirst; + cbnext = cbinit; + cblast = cbnext + COMMENT_BUF_STORE; + } + + void +unclassifiable(Void) +{ + register char *s, *se; + + s = sbuf; + se = lastch; + if (se < sbuf) + return; + lastch = s - 1; + if (++se - s > 10) + se = s + 10; + for(; s < se; s++) + if (*s == MYQUOTE) { + se = s; + break; + } + *se = 0; + errstr("unclassifiable statement (starts \"%s\")", sbuf); + } + + void +endcheck(Void) +{ + if (nextch <= lastch) + warn("ignoring text after \"end\"."); + lexstate = RETEOS; + } diff --git a/tools/connec/src/lex.o b/tools/connec/src/lex.o new file mode 100644 index 0000000000000000000000000000000000000000..2aa064a0fb74661986568549574556d6cec992c8 GIT binary patch literal 41944 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/machdefs.h b/tools/connec/src/machdefs.h new file mode 100644 index 0000000..3ab8961 --- /dev/null +++ b/tools/connec/src/machdefs.h @@ -0,0 +1,31 @@ +#define TYLENG TYLONG /* char string length field */ + +#define TYINT TYLONG +#define SZADDR 4 +#define SZSHORT 2 +#define SZINT 4 + +#define SZLONG 4 +#define SZLENG SZLONG + +#define SZDREAL 8 + +/* Alignment restrictions */ + +#define ALIADDR SZADDR +#define ALISHORT SZSHORT +#define ALILONG 4 +#define ALIDOUBLE 8 +#define ALIINT ALILONG +#define ALILENG ALILONG + +#define BLANKCOMMON "_BLNK__" /* Name for the unnamed + common block; this is unique + because of underscores */ + +#define LABELFMT "%s:\n" + +#define MAXREGVAR 4 +#define TYIREG TYLONG +#define MSKIREG (M(TYSHORT)|M(TYLONG)) /* allowed types of DO indicies + which can be put in registers */ diff --git a/tools/connec/src/main.c b/tools/connec/src/main.c new file mode 100644 index 0000000..977113d --- /dev/null +++ b/tools/connec/src/main.c @@ -0,0 +1,792 @@ +/**************************************************************** +Copyright 1990-1996, 2000-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +extern char F2C_version[]; + +#include "defs.h" +#include "parse.h" + +int complex_seen, dcomplex_seen; + +LOCAL int Max_ftn_files; + +int badargs; +char **ftn_files; +int current_ftn_file = 0; + +flag ftn66flag = NO; +flag nowarnflag = NO; +flag noextflag = NO; +flag no66flag = NO; /* Must also set noextflag to this + same value */ +flag zflag = YES; /* recognize double complex intrinsics */ +flag debugflag = NO; +flag onetripflag = NO; +flag shiftcase = YES; +flag undeftype = NO; +flag checksubs = NO; +flag r8flag = NO; +flag use_bs = YES; +flag keepsubs = NO; +flag byterev = NO; +int intr_omit; +static int no_cd, no_i90; +#ifdef TYQUAD +flag use_tyquad = YES; +#ifndef NO_LONG_LONG +flag allow_i8c = YES; +#endif +#endif +int tyreal = TYREAL; +int tycomplex = TYCOMPLEX; + +int maxregvar = MAXREGVAR; /* if maxregvar > MAXREGVAR, error */ +int maxequiv = MAXEQUIV; +int maxext = MAXEXT; +int maxstno = MAXSTNO; +int maxctl = MAXCTL; +int maxhash = MAXHASH; +int maxliterals = MAXLITERALS; +int maxcontin = MAXCONTIN; +int maxlablist = MAXLABLIST; +int extcomm, ext1comm, useauto; +int can_include = YES; /* so we can disable includes for netlib */ + +static char *def_i2 = ""; + +static int useshortints = NO; /* YES => tyint = TYSHORT */ +static int uselongints = NO; /* YES => tyint = TYLONG */ +int addftnsrc = NO; /* Include ftn source in output */ +int usedefsforcommon = NO; /* Use #defines for common reference */ +int forcedouble = YES; /* force real functions to double */ +int dneg = NO; /* f77 treatment of unary minus */ +int Ansi = YES; +int def_equivs = YES; +int tyioint = TYLONG; +int szleng = SZLENG; +int inqmask = M(TYLONG)|M(TYLOGICAL); +int wordalign = NO; +int forcereal = NO; +int warn72 = NO; +static int help, showver, skipC, skipversion; +char *file_name, *filename0, *parens; +int Castargs = 1; +static int Castargs1; +static int typedefs = 0; +int chars_per_wd, gflag, protostatus; +int infertypes = 1; +char used_rets[TYSUBR+1]; +extern char *tmpdir; +static int h0align = 0; +char *halign, *ohalign; +int krparens = NO; +int hsize; /* for padding under -h */ +int htype; /* for wr_equiv_init under -h */ +int trapuv; +chainp Iargs; + +#define f2c_entry(swit,count,type,store,size) \ + p_entry ("-", swit, 0, count, type, store, size) + +static arg_info table[] = { + f2c_entry ("w66", P_NO_ARGS, P_INT, &ftn66flag, YES), + f2c_entry ("w", P_NO_ARGS, P_INT, &nowarnflag, YES), + f2c_entry ("66", P_NO_ARGS, P_INT, &no66flag, YES), + f2c_entry ("1", P_NO_ARGS, P_INT, &onetripflag, YES), + f2c_entry ("onetrip", P_NO_ARGS, P_INT, &onetripflag, YES), + f2c_entry ("I2", P_NO_ARGS, P_INT, &useshortints, YES), + f2c_entry ("I4", P_NO_ARGS, P_INT, &uselongints, YES), + f2c_entry ("U", P_NO_ARGS, P_INT, &shiftcase, NO), + f2c_entry ("u", P_NO_ARGS, P_INT, &undeftype, YES), + f2c_entry ("O", P_ONE_ARG, P_INT, &maxregvar, 0), + f2c_entry ("C", P_NO_ARGS, P_INT, &checksubs, YES), + f2c_entry ("Nq", P_ONE_ARG, P_INT, &maxequiv, 0), + f2c_entry ("Nx", P_ONE_ARG, P_INT, &maxext, 0), + f2c_entry ("Ns", P_ONE_ARG, P_INT, &maxstno, 0), + f2c_entry ("Nc", P_ONE_ARG, P_INT, &maxctl, 0), + f2c_entry ("Nn", P_ONE_ARG, P_INT, &maxhash, 0), + f2c_entry ("NL", P_ONE_ARG, P_INT, &maxliterals, 0), + f2c_entry ("NC", P_ONE_ARG, P_INT, &maxcontin, 0), + f2c_entry ("Nl", P_ONE_ARG, P_INT, &maxlablist, 0), + f2c_entry ("c", P_NO_ARGS, P_INT, &addftnsrc, YES), + f2c_entry ("p", P_NO_ARGS, P_INT, &usedefsforcommon, YES), + f2c_entry ("R", P_NO_ARGS, P_INT, &forcedouble, NO), + f2c_entry ("!R", P_NO_ARGS, P_INT, &forcedouble, YES), + f2c_entry ("A", P_NO_ARGS, P_INT, &Ansi, YES), + f2c_entry ("K", P_NO_ARGS, P_INT, &Ansi, NO), + f2c_entry ("ext", P_NO_ARGS, P_INT, &noextflag, YES), + f2c_entry ("z", P_NO_ARGS, P_INT, &zflag, NO), + f2c_entry ("a", P_NO_ARGS, P_INT, &useauto, YES), + f2c_entry ("r8", P_NO_ARGS, P_INT, &r8flag, YES), + f2c_entry ("i2", P_NO_ARGS, P_INT, &tyioint, NO), + f2c_entry ("w8", P_NO_ARGS, P_INT, &wordalign, YES), + f2c_entry ("!I", P_NO_ARGS, P_INT, &can_include, NO), + f2c_entry ("W", P_ONE_ARG, P_INT, &chars_per_wd, 0), + f2c_entry ("g", P_NO_ARGS, P_INT, &gflag, YES), + f2c_entry ("T", P_ONE_ARG, P_STRING, &tmpdir, 0), + f2c_entry ("E", P_NO_ARGS, P_INT, &extcomm, 1), + f2c_entry ("e1c", P_NO_ARGS, P_INT, &ext1comm, 1), + f2c_entry ("ec", P_NO_ARGS, P_INT, &ext1comm, 2), + f2c_entry ("C++", P_NO_ARGS, P_INT, &Ansi, 2), + f2c_entry ("P", P_NO_ARGS, P_INT, &Castargs, 3), + f2c_entry ("Ps", P_NO_ARGS, P_INT, &protostatus, 1), + f2c_entry ("!P", P_NO_ARGS, P_INT, &Castargs, 0), + f2c_entry ("!c", P_NO_ARGS, P_INT, &skipC, 1), + f2c_entry ("!it", P_NO_ARGS, P_INT, &infertypes, 0), + f2c_entry ("h", P_NO_ARGS, P_INT, &h0align, 1), + f2c_entry ("hd", P_NO_ARGS, P_INT, &h0align, 2), + f2c_entry ("kr", P_NO_ARGS, P_INT, &krparens, 1), + f2c_entry ("krd", P_NO_ARGS, P_INT, &krparens, 2), + f2c_entry ("!bs", P_NO_ARGS, P_INT, &use_bs, NO), + f2c_entry ("r", P_NO_ARGS, P_INT, &forcereal, YES), + f2c_entry ("72", P_NO_ARGS, P_INT, &warn72, 1), + f2c_entry ("f", P_NO_ARGS, P_INT, &warn72, 2), + f2c_entry ("s", P_NO_ARGS, P_INT, &keepsubs, 1), + f2c_entry ("d", P_ONE_ARG, P_STRING, &outbuf, 0), + f2c_entry ("cd", P_NO_ARGS, P_INT, &no_cd, 1), + f2c_entry ("i90", P_NO_ARGS, P_INT, &no_i90, 2), + f2c_entry ("trapuv", P_NO_ARGS, P_INT, &trapuv, 1), +#ifdef TYQUAD +#ifndef NO_LONG_LONG + f2c_entry ("!i8const", P_NO_ARGS, P_INT, &allow_i8c, NO), +#endif + f2c_entry ("!i8", P_NO_ARGS, P_INT, &use_tyquad, NO), +#endif + + /* options omitted from man pages */ + + /* -b ==> for unformatted I/O, call do_unio (for noncharacter */ + /* data of length > 1 byte) and do_ucio (for the rest) rather */ + /* than do_uio. This permits modifying libI77 to byte-reverse */ + /* numeric data. */ + + f2c_entry ("b", P_NO_ARGS, P_INT, &byterev, YES), + + /* -ev ==> implement equivalence with initialized pointers */ + f2c_entry ("ev", P_NO_ARGS, P_INT, &def_equivs, NO), + + /* -!it used to be the default when -it was more agressive */ + + f2c_entry ("it", P_NO_ARGS, P_INT, &infertypes, 1), + + /* -Pd is similar to -P, but omits :ref: lines */ + f2c_entry ("Pd", P_NO_ARGS, P_INT, &Castargs, 2), + + /* -t ==> emit typedefs (under -A or -C++) for procedure + argument types used. This is meant for netlib's + f2c service, so -A and -C++ will work with older + versions of f2c.h + */ + f2c_entry ("t", P_NO_ARGS, P_INT, &typedefs, 1), + + /* -!V ==> omit version msg (to facilitate using diff in + regression testing) + */ + f2c_entry ("!V", P_NO_ARGS, P_INT, &skipversion, 1), + + /* -Dnnn = debug level nnn */ + + f2c_entry ("D", P_ONE_ARG, P_INT, &debugflag, YES), + + /* -dneg ==> under (default) -!R, imitate f77's bizarre */ + /* treatment of unary minus of REAL expressions by */ + /* promoting them to DOUBLE PRECISION . */ + + f2c_entry ("dneg", P_NO_ARGS, P_INT, &dneg, YES), + + /* -?, --help, -v, --version */ + + f2c_entry ("?", P_NO_ARGS, P_INT, &help, YES), + f2c_entry ("-help", P_NO_ARGS, P_INT, &help, YES), + + f2c_entry ("v", P_NO_ARGS, P_INT, &showver, YES), + f2c_entry ("-version", P_NO_ARGS, P_INT, &showver, YES) + +}; /* table */ + +extern char *c_functions; /* "c_functions" */ +extern char *coutput; /* "c_output" */ +extern char *initfname; /* "raw_data" */ +extern char *blkdfname; /* "block_data" */ +extern char *p1_file; /* "p1_file" */ +extern char *p1_bakfile; /* "p1_file.BAK" */ +extern char *sortfname; /* "init_file" */ +extern char *proto_fname; /* "proto_file" */ +FILE *protofile; + + void +set_externs(Void) +{ + static char *hset[3] = { 0, "integer", "doublereal" }; + +/* Adjust the global flags according to the command line parameters */ + + if (chars_per_wd > 0) { + typesize[TYADDR] = typesize[TYLONG] = typesize[TYREAL] = + typesize[TYLOGICAL] = chars_per_wd; + typesize[TYINT1] = typesize[TYLOGICAL1] = 1; + typesize[TYDREAL] = typesize[TYCOMPLEX] = chars_per_wd << 1; + typesize[TYDCOMPLEX] = chars_per_wd << 2; + typesize[TYSHORT] = typesize[TYLOGICAL2] = chars_per_wd >> 1; + typesize[TYCILIST] = 5*chars_per_wd; + typesize[TYICILIST] = 6*chars_per_wd; + typesize[TYOLIST] = 9*chars_per_wd; + typesize[TYCLLIST] = 3*chars_per_wd; + typesize[TYALIST] = 2*chars_per_wd; + typesize[TYINLIST] = 26*chars_per_wd; + } + + if (wordalign) + typealign[TYDREAL] = typealign[TYDCOMPLEX] = typealign[TYREAL]; + if (!tyioint) { + tyioint = TYSHORT; + szleng = typesize[TYSHORT]; + def_i2 = "#define f2c_i2 1\n"; + inqmask = M(TYSHORT)|M(TYLOGICAL2); + goto checklong; + } + else + szleng = typesize[TYLONG]; + if (useshortints) { + /* inqmask = M(TYLONG); */ + /* used to disallow LOGICAL in INQUIRE under -I2 */ + checklong: + protorettypes[TYLOGICAL] = "shortlogical"; + casttypes[TYLOGICAL] = "K_fp"; + if (uselongints) + err ("Can't use both long and short ints"); + else { + tyint = tylogical = TYSHORT; + tylog = TYLOGICAL2; + } + } + else if (uselongints) + tyint = TYLONG; + + if (h0align) { + if (tyint == TYLONG && wordalign) + h0align = 1; + ohalign = halign = hset[h0align]; + htype = h0align == 1 ? tyint : TYDREAL; + hsize = typesize[htype]; + } + + if (no66flag) + noextflag = no66flag; + if (noextflag) + zflag = 0; + + if (r8flag) { + tyreal = TYDREAL; + tycomplex = TYDCOMPLEX; + r8fix(); + } + if (forcedouble) { + protorettypes[TYREAL] = "E_f"; + casttypes[TYREAL] = "E_fp"; + } + else + dneg = 0; + +#ifndef NO_LONG_LONG + if (!use_tyquad) + allow_i8c = 0; +#endif + + if (maxregvar > MAXREGVAR) { + warni("-O%d: too many register variables", maxregvar); + maxregvar = MAXREGVAR; + } /* if maxregvar > MAXREGVAR */ + +/* Check the list of input files */ + + { + int bad, i, cur_max = Max_ftn_files; + + for (i = bad = 0; i < cur_max && ftn_files[i]; i++) + if (ftn_files[i][0] == '-') { + errstr ("Invalid flag '%s'", ftn_files[i]); + bad++; + } + if (bad) + exit(1); + + } /* block */ +} /* set_externs */ + + + static int +comm2dcl(Void) +{ + Extsym *ext; + if (ext1comm) + for(ext = extsymtab; ext < nextext; ext++) + if (ext->extstg == STGCOMMON && !ext->extinit) + return ext1comm; + return 0; + } + + static void +#ifdef KR_headers +write_typedefs(outfile) + FILE *outfile; +#else +write_typedefs(FILE *outfile) +#endif +{ + register int i; + register char *s, *p = 0; + static char st[4] = { TYREAL, TYCOMPLEX, TYDCOMPLEX, TYCHAR }; + static char stl[4] = { 'E', 'C', 'Z', 'H' }; + + for(i = 0; i <= TYSUBR; i++) + if (s = usedcasts[i]) { + if (!p) { + p = (char*)(Ansi == 1 ? "()" : "(...)"); + nice_printf(outfile, + "/* Types for casting procedure arguments: */\ +\n\n#ifndef F2C_proc_par_types\n"); + if (i == 0) { + nice_printf(outfile, + "typedef int /* Unknown procedure type */ (*%s)%s;\n", + s, p); + continue; + } + } + nice_printf(outfile, "typedef %s (*%s)%s;\n", + c_type_decl(i,1), s, p); + } + for(i = !forcedouble; i < 4; i++) + if (used_rets[st[i]]) + nice_printf(outfile, + "typedef %s %c_f; /* %s function */\n", + p = (char*)(i ? "VOID" : "doublereal"), + stl[i], ftn_types[st[i]]); + if (p) + nice_printf(outfile, "#endif\n\n"); + } + + static void +#ifdef KR_headers +commonprotos(outfile) + register FILE *outfile; +#else +commonprotos(register FILE *outfile) +#endif +{ + register Extsym *e, *ee; + register Argtypes *at; + Atype *a, *ae; + int k; + extern int proc_protochanges; + + if (!outfile) + return; + for (e = extsymtab, ee = nextext; e < ee; e++) + if (e->extstg == STGCOMMON && e->allextp) + nice_printf(outfile, "/* comlen %s %ld */\n", + e->cextname, e->maxleng); + if (Castargs1 < 3) + return; + + /* -Pr: special comments conveying current knowledge + of external references */ + + k = proc_protochanges; + for (e = extsymtab, ee = nextext; e < ee; e++) + if (e->extstg == STGEXT + && e->cextname != e->fextname) /* not a library function */ + if (at = e->arginfo) { + if ((!e->extinit || at->changes & 1) + /* not defined here or + changed since definition */ + && at->nargs >= 0) { + nice_printf(outfile, "/*:ref: %s %d %d", + e->cextname, e->extype, at->nargs); + a = at->atypes; + for(ae = a + at->nargs; a < ae; a++) + nice_printf(outfile, " %d", a->type); + nice_printf(outfile, " */\n"); + if (at->changes & 1) + k++; + } + } + else if (e->extype) + /* typed external, never invoked */ + nice_printf(outfile, "/*:ref: %s %d :*/\n", + e->cextname, e->extype); + if (k) { + nice_printf(outfile, + "/* Rerunning f2c -P may change prototypes or declarations. */\n"); + if (nerr) + return; + if (protostatus) + done(4); + if (protofile != stdout) { + fprintf(diagfile, + "Rerunning \"f2c -P ... %s %s\" may change prototypes or declarations.\n", + filename0, proto_fname); + fflush(diagfile); + } + } + } + + static int +#ifdef KR_headers +I_args(argc, a) + int argc; + char **a; +#else +I_args(int argc, char **a) +#endif +{ + char **a0, **a1, **ae, *s; + + ae = a + argc; + a0 = a; + for(a1 = ++a; a < ae; a++) { + if (!(s = *a)) + break; + if (*s == '-' && s[1] == 'I' && s[2] + && (s[3] || s[2] != '2' && s[2] != '4')) + Iargs = mkchain(s+2, Iargs); + else + *a1++ = s; + } + Iargs = revchain(Iargs); + *a1 = 0; + return a1 - a0; + } + + static void +omit_non_f(Void) +{ + /* complain about ftn_files that do not end in .f or .F */ + + char *s, *s1; + int i, k; + + for(i = k = 0; s = ftn_files[k]; k++) { + s1 = s + strlen(s); + if (s1 - s >= 3) { + s1 -= 2; + if (*s1 == '.') switch(s1[1]) { + case 'f': + case 'F': + ftn_files[i++] = s; + continue; + } + } + fprintf(diagfile, "\"%s\" does not end in .f or .F\n", s); + } + if (i != k) { + fflush(diagfile); + if (!i) + exit(1); + ftn_files[i] = 0; + } + } + + static void +show_version(Void) +{ + printf("f2c (Fortran to C Translator) version %s.\n", F2C_version); + } + + static void +#ifdef KR_headers +show_help(progname) char *progname; +#else +show_help(char *progname) +#endif +{ + show_version(); + if (!progname) + progname = "f2c"; + printf("Usage: %s [ option ... ] [file ...]\n%s%s%s%s%s%s%s", + progname, + "For usage details, see the man page, f2c.1.\n", + "For technical details, see the f2c report.\n", + "Both are available from netlib, e.g.,\n", + "\thttps://www.netlib.org/f2c/f2c.1\n", + "\thttps://www.netlib.org/f2c/f2c.pdf\nor\n", + "\thttps://ampl.com/netlib/f2c/f2c.1\n", + "\thttps://ampl.com/netlib/f2c/f2c.pdf\n"); + } + + int retcode = 0; + + int +#ifdef KR_headers +main(argc, argv) + int argc; + char **argv; +#else +main(int argc, char **argv) +#endif +{ + int c2d, k; + FILE *c_output; + char *cdfilename; + static char stderrbuf[BUFSIZ]; + extern char **dfltproc, *dflt1proc[]; + extern char link_msg[]; + + diagfile = stderr; + setbuf(stderr, stderrbuf); /* arrange for fast error msgs */ + + argkludge(&argc, &argv); /* for _WIN32 */ + argc = I_args(argc, argv); /* extract -I args */ + Max_ftn_files = argc - 1; + ftn_files = (char **)ckalloc((argc+1)*sizeof(char *)); + + parse_args (argc, argv, table, sizeof(table)/sizeof(arg_info), + ftn_files, Max_ftn_files); + if (badargs) + return 1; + if (help) { + show_help(argv[0]); + return 0; + } + if (showver && !ftn_files[0]) { + show_version(); + return 0; + } + intr_omit = no_cd | no_i90; + if (keepsubs && checksubs) { + warn("-C suppresses -s\n"); + keepsubs = 0; + } + if (!can_include && ext1comm == 2) + ext1comm = 1; + if (ext1comm && !extcomm) + extcomm = 2; + if (protostatus) + Castargs = 3; + Castargs1 = Castargs; + if (!Ansi) { + Castargs = 0; + parens = "()"; + } + else if (!Castargs) + parens = (char*)(Ansi == 1 ? "()" : "(...)"); + else + dfltproc = dflt1proc; + + outbuf_adjust(); + set_externs(); + fileinit(); + read_Pfiles(ftn_files); + omit_non_f(); + + for(k = 0; ftn_files[k+1]; k++) + if (dofork(ftn_files[k])) + break; + filename0 = file_name = ftn_files[current_ftn_file = k]; + + set_tmp_names(); + sigcatch(0); + + c_file = opf(c_functions, textwrite); + pass1_file=opf(p1_file, binwrite); + initkey(); + if (file_name && *file_name) { + cdfilename = coutput; + if (debugflag != 1) { + coutput = c_name(file_name,'c'); + cdfilename = copys(outbtail); + if (Castargs1 >= 2) + proto_fname = c_name(file_name,'P'); + } + if (skipC) + coutput = 0; + else if (!(c_output = fopen(coutput, textwrite))) { + file_name = coutput; + coutput = 0; /* don't delete read-only .c file */ + fatalstr("can't open %.86s", file_name); + } + + if (Castargs1 >= 2 + && !(protofile = fopen(proto_fname, textwrite))) + fatalstr("Can't open %.84s\n", proto_fname); + } + else { + file_name = ""; + cdfilename = "f2c_out.c"; + c_output = stdout; + coutput = 0; + if (Castargs1 >= 2) { + protofile = stdout; + if (!skipC) + printf("#ifdef P_R_O_T_O_T_Y_P_E_S\n"); + } + } + + if(inilex( copys(file_name) )) + done(1); + if (filename0) { + fprintf(diagfile, "%s:\n", file_name); + fflush(diagfile); + } + + procinit(); + if(k = yyparse()) + { + fprintf(diagfile, "Bad parse, return code %d\n", k); + done(1); + } + + commonprotos(protofile); + if (protofile == stdout && !skipC) + printf("#endif\n\n"); + + if (nerr || skipC) + goto C_skipped; + + +/* Write out the declarations which are global to this file */ + + if ((c2d = comm2dcl()) == 1) + nice_printf(c_output, "/*>>>'/dev/null'<<<*/\n\n\ +/* Split this into several files by piping it through\n\n\ +sed \"s/^\\/\\*>>>'\\(.*\\)'<<<\\*\\/\\$/cat >'\\1' <<'\\/*<<<\\1>>>*\\/'/\" | /bin/sh\n\ + */\n\ +/*<<>>*/\n\ +/*>>>'%s'<<<*/\n", cdfilename); + if (gflag) + nice_printf (c_output, "#line 1 \"%s\"\n", file_name); + if (!skipversion) { + nice_printf (c_output, "/* %s -- translated by f2c ", file_name); + nice_printf (c_output, "(version %s).\n", F2C_version); + nice_printf (c_output, + " You must link the resulting object file with libf2c:\n\ + %s\n*/\n\n", link_msg); + } + if (Ansi == 2) + nice_printf(c_output, + "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); + nice_printf (c_output, "%s#include \"f2c.h\"\n\n", def_i2); + if (trapuv) + nice_printf(c_output, "extern void _uninit_f2c(%s);\n%s\n\n", + Ansi ? "void*,int,long" : "", "extern double _0;"); + if (gflag) + nice_printf (c_output, "#line 1 \"%s\"\n", file_name); + if (Castargs && typedefs) + write_typedefs(c_output); + nice_printf (c_file, "\n"); + fclose (c_file); + c_file = c_output; /* HACK to get the next indenting + to work */ + wr_common_decls (c_output); + if (blkdfile) + list_init_data(&blkdfile, blkdfname, c_output); + wr_globals (c_output); + if ((c_file = fopen (c_functions, textread)) == (FILE *) NULL) + Fatal("main - couldn't reopen c_functions"); + ffilecopy (c_file, c_output); + if (*main_alias) { + nice_printf (c_output, "/* Main program alias */ "); + nice_printf (c_output, "int %s () { MAIN__ ();%s }\n", + main_alias, Ansi ? " return 0;" : ""); + } + if (Ansi == 2) + nice_printf(c_output, + "#ifdef __cplusplus\n\t}\n#endif\n"); + if (c2d) { + if (c2d == 1) + fprintf(c_output, "/*<<<%s>>>*/\n", cdfilename); + else + fclose(c_output); + def_commons(c_output); + } + if (c2d != 2) + fclose (c_output); + + C_skipped: + if(parstate != OUTSIDE) + { + warn("missing final end statement"); + endproc(); + nerr = 1; + } + done(nerr ? 1 : 0); + /* NOT REACHED */ return 0; +} + + + FILEP +#ifdef KR_headers +opf(fn, mode) + char *fn; + char *mode; +#else +opf(char *fn, char *mode) +#endif +{ + FILEP fp; + if( fp = fopen(fn, mode) ) + return(fp); + + fatalstr("cannot open intermediate file %s", fn); + /* NOT REACHED */ return 0; +} + + + void +#ifdef KR_headers +clf(p, what, quit) + FILEP *p; + char *what; + int quit; +#else +clf(FILEP *p, char *what, int quit) +#endif +{ + if(p!=NULL && *p!=NULL && *p!=stdout) + { + if(ferror(*p)) { + fprintf(stderr, "I/O error on %s\n", what); + if (quit) + done(3); + retcode = 3; + } + fclose(*p); + } + *p = NULL; +} + + + void +#ifdef KR_headers +done(k) + int k; +#else +done(int k) +#endif +{ + clf(&initfile, "initfile", 0); + clf(&c_file, "c_file", 0); + clf(&pass1_file, "pass1_file", 0); + Un_link_all(k); + exit(k|retcode); +} diff --git a/tools/connec/src/main.o b/tools/connec/src/main.o new file mode 100644 index 0000000000000000000000000000000000000000..027a0532b73cf66062944c8101d60c839eabe919 GIT binary patch literal 35440 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.in + $(YACC) $(YFLAGS) gram.in + @echo "(There should be 4 shift/reduce conflicts.)" + sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c + rm -f gram.in y.tab.c + +$(OBJECTSd): defs.h ftypes.h defines.h machdefs.h sysdep.h + +tokdefs.h: tokens + grep -n . tokdefs.h + +cds.o: sysdep.h +exec.o: p1defs.h names.h +expr.o: output.h niceprintf.h names.h +format.o: p1defs.h format.h output.h niceprintf.h names.h iob.h +formatdata.o: format.h output.h niceprintf.h names.h +gram.o: p1defs.h +init.o: output.h niceprintf.h iob.h +intr.o: names.h +io.o: names.h iob.h +lex.o : tokdefs.h p1defs.h +main.o: parse.h usignal.h +mem.o: iob.h +names.o: iob.h names.h output.h niceprintf.h +niceprintf.o: defs.h names.h output.h niceprintf.h +output.o: output.h niceprintf.h names.h +p1output.o: p1defs.h output.h niceprintf.h names.h +parse_args.o: parse.h +proc.o: tokdefs.h names.h niceprintf.h output.h p1defs.h +put.o: names.h pccdefs.h p1defs.h +putpcc.o: names.h +vax.o: defs.h output.h pccdefs.h +output.h: niceprintf.h +sysdep.o: sysdep.c sysdep.hd + +put.o putpcc.o: pccdefs.h + +sysdep.hd: + if $(CC) sysdeptest.c; then echo '/*OK*/' > sysdep.hd;\ + elif $(CC) -DNO_MKDTEMP sysdeptest.c; then echo '#define NO_MKDTEMP' >sysdep.hd;\ + else echo '#define NO_MKDTEMP' >sysdep.hd; echo '#define NO_MKSTEMP' >>sysdep.hd; fi + rm -f a.out + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +#f2c.1: f2c.1t +# nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + rm -f *.o f2c sysdep.hd tokdefs.h f2c.t + +veryclean: clean + rm -f xsum + +b = Notice README cds.c data.c defines.h defs.h equiv.c error.c \ + exec.c expr.c f2c.1 f2c.1t f2c.h format.c format.h formatdata.c \ + ftypes.h gram.c gram.dcl gram.exec gram.expr gram.head gram.io \ + init.c intr.c io.c iob.h lex.c machdefs.h main.c makefile.u makefile.vc \ + malloc.c mem.c memset.c misc.c names.c names.h niceprintf.c \ + niceprintf.h output.c output.h p1defs.h p1output.c \ + parse.h parse_args.c pccdefs.h pread.c proc.c put.c putpcc.c \ + sysdep.c sysdep.h sysdeptest.c tokens usignal.h vax.c version.c xsum.c + +xsum: xsum.c + $(CC) $(CFLAGS) -o xsum xsum.c + +#Check validity of transmitted source... +xsum.out: xsum $b + ./xsum $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out + +#On non-Unix systems that end lines with carriage-return/newline pairs, +#use "make xsumr.out" rather than "make xsum.out". The -r flag ignores +#carriage-return characters. +xsumr.out: xsum $b + ./xsum -r $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsumr.out diff --git a/tools/connec/src/makefile.u b/tools/connec/src/makefile.u new file mode 100644 index 0000000..e9f9c5e --- /dev/null +++ b/tools/connec/src/makefile.u @@ -0,0 +1,116 @@ +# Makefile for f2c, a Fortran 77 to C converter + +.SUFFIXES: .c .o +CC = cc +CFLAGS = -O +SHELL = /bin/sh +YACC = yacc +YFLAGS = + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +OBJECTSd = main.o init.o gram.o lex.o proc.o equiv.o data.o format.o \ + expr.o exec.o intr.o io.o misc.o error.o mem.o names.o \ + output.o p1output.o pread.o put.o putpcc.o vax.o formatdata.o \ + parse_args.o niceprintf.o cds.o sysdep.o version.o + +MALLOC = +# To use the malloc whose source accompanies the f2c source, add malloc.o +# to the right-hand side of the "MALLOC =" line above, so it becomes +# MALLOC = malloc.o +# This gives faster execution on some systems, but some other systems do +# not tolerate replacement of the system's malloc. + +OBJECTS = $(OBJECTSd) $(MALLOC) + +all: xsum.out f2c + +f2c: $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) -o f2c + +# The following used to be a rule for gram.c rather than gram1.c, but +# there are too many broken variants of yacc around, so now we +# distribute a correctly functioning gram.c (derived with a Unix variant +# of the yacc from plan9). + +gram1.c: gram.head gram.dcl gram.expr gram.exec gram.io defs.h tokdefs.h + ( sed gram.in + $(YACC) $(YFLAGS) gram.in + @echo "(There should be 4 shift/reduce conflicts.)" + sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c + rm -f gram.in y.tab.c + +$(OBJECTSd): defs.h ftypes.h defines.h machdefs.h sysdep.h + +tokdefs.h: tokens + grep -n . tokdefs.h + +cds.o: sysdep.h +exec.o: p1defs.h names.h +expr.o: output.h niceprintf.h names.h +format.o: p1defs.h format.h output.h niceprintf.h names.h iob.h +formatdata.o: format.h output.h niceprintf.h names.h +gram.o: p1defs.h +init.o: output.h niceprintf.h iob.h +intr.o: names.h +io.o: names.h iob.h +lex.o : tokdefs.h p1defs.h +main.o: parse.h usignal.h +mem.o: iob.h +names.o: iob.h names.h output.h niceprintf.h +niceprintf.o: defs.h names.h output.h niceprintf.h +output.o: output.h niceprintf.h names.h +p1output.o: p1defs.h output.h niceprintf.h names.h +parse_args.o: parse.h +proc.o: tokdefs.h names.h niceprintf.h output.h p1defs.h +put.o: names.h pccdefs.h p1defs.h +putpcc.o: names.h +vax.o: defs.h output.h pccdefs.h +output.h: niceprintf.h +sysdep.o: sysdep.c sysdep.hd + +put.o putpcc.o: pccdefs.h + +sysdep.hd: + if $(CC) sysdeptest.c; then echo '/*OK*/' > sysdep.hd;\ + elif $(CC) -DNO_MKDTEMP sysdeptest.c; then echo '#define NO_MKDTEMP' >sysdep.hd;\ + else echo '#define NO_MKDTEMP' >sysdep.hd; echo '#define NO_MKSTEMP' >>sysdep.hd; fi + rm -f a.out + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +#f2c.1: f2c.1t +# nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + rm -f *.o f2c sysdep.hd tokdefs.h f2c.t + +veryclean: clean + rm -f xsum + +b = Notice README cds.c data.c defines.h defs.h equiv.c error.c \ + exec.c expr.c f2c.1 f2c.1t f2c.h format.c format.h formatdata.c \ + ftypes.h gram.c gram.dcl gram.exec gram.expr gram.head gram.io \ + init.c intr.c io.c iob.h lex.c machdefs.h main.c makefile.u makefile.vc \ + malloc.c mem.c memset.c misc.c names.c names.h niceprintf.c \ + niceprintf.h output.c output.h p1defs.h p1output.c \ + parse.h parse_args.c pccdefs.h pread.c proc.c put.c putpcc.c \ + sysdep.c sysdep.h sysdeptest.c tokens usignal.h vax.c version.c xsum.c + +xsum: xsum.c + $(CC) $(CFLAGS) -o xsum xsum.c + +#Check validity of transmitted source... +xsum.out: xsum $b + ./xsum $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out + +#On non-Unix systems that end lines with carriage-return/newline pairs, +#use "make xsumr.out" rather than "make xsum.out". The -r flag ignores +#carriage-return characters. +xsumr.out: xsum $b + ./xsum -r $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsumr.out diff --git a/tools/connec/src/makefile.vc b/tools/connec/src/makefile.vc new file mode 100644 index 0000000..e79a6ca --- /dev/null +++ b/tools/connec/src/makefile.vc @@ -0,0 +1,76 @@ +# Microsoft Visual C++ Makefile for f2c, a Fortran 77 to C converter +# Invoke with "nmake -f makefile.vc", or execute the commands +# copy makefile.vc makefile +# nmake . + +CC = cl +CFLAGS = -Ot1 -nologo -DNO_LONG_LONG + +.c.obj: + $(CC) -c $(CFLAGS) $*.c + +OBJECTS = main.obj init.obj gram.obj lex.obj proc.obj equiv.obj data.obj format.obj \ + expr.obj exec.obj intr.obj io.obj misc.obj error.obj mem.obj names.obj \ + output.obj p1output.obj pread.obj put.obj putpcc.obj vax.obj formatdata.obj \ + parse_args.obj niceprintf.obj cds.obj sysdep.obj version.obj + +checkfirst: xsum.out + +f2c.exe: $(OBJECTS) + $(CC) -Fef2c.exe $(OBJECTS) setargv.obj + +$(OBJECTS): defs.h ftypes.h defines.h machdefs.h sysdep.h + +cds.obj: sysdep.h +exec.obj: p1defs.h names.h +expr.obj: output.h niceprintf.h names.h +format.obj: p1defs.h format.h output.h niceprintf.h names.h iob.h +formatdata.obj: format.h output.h niceprintf.h names.h +gram.obj: p1defs.h +init.obj: output.h niceprintf.h iob.h +intr.obj: names.h +io.obj: names.h iob.h +lex.obj : tokdefs.h p1defs.h +main.obj: parse.h usignal.h +mem.obj: iob.h +names.obj: iob.h names.h output.h niceprintf.h +niceprintf.obj: defs.h names.h output.h niceprintf.h +output.obj: output.h niceprintf.h names.h +p1output.obj: p1defs.h output.h niceprintf.h names.h +parse_args.obj: parse.h +proc.obj: tokdefs.h names.h niceprintf.h output.h p1defs.h +put.obj: names.h pccdefs.h p1defs.h +putpcc.obj: names.h +vax.obj: defs.h output.h pccdefs.h +output.h: niceprintf.h + +put.obj putpcc.obj: pccdefs.h + +clean: + deltree /Y *.obj f2c.exe + +veryclean: clean + deltree /Y xsum.exe + +b = Notice README cds.c data.c defines.h defs.h equiv.c error.c \ + exec.c expr.c f2c.1 f2c.1t f2c.h format.c format.h formatdata.c \ + ftypes.h gram.c gram.dcl gram.exec gram.expr gram.head gram.io \ + init.c intr.c io.c iob.h lex.c machdefs.h main.c makefile.u makefile.vc \ + malloc.c mem.c memset.c misc.c names.c names.h niceprintf.c \ + niceprintf.h output.c output.h p1defs.h p1output.c \ + parse.h parse_args.c pccdefs.h pread.c proc.c put.c putpcc.c \ + sysdep.c sysdep.h sysdeptest.c tokens usignal.h vax.c version.c xsum.c + +xsum.exe: xsum.c + $(CC) $(CFLAGS) -DMSDOS xsum.c + +#Check validity of transmitted source... +# Unfortunately, conditional execution is hard here, since fc does not set a +# nonzero exit code when files differ. + +xsum.out: xsum.exe $b + xsum $b >xsum1.out + fc xsum0.out xsum1.out + @echo If fc showed no differences, manually rename xsum1.out xsum.out: + @echo if xsum.out exists, first "del xsum.out"; then "ren xsum1.out xsum.out". + @echo Once you are happy that your source is OK, "nmake -f makefile.vc f2c.exe". diff --git a/tools/connec/src/malloc.c b/tools/connec/src/malloc.c new file mode 100644 index 0000000..f0e7f61 --- /dev/null +++ b/tools/connec/src/malloc.c @@ -0,0 +1,184 @@ +/**************************************************************** +Copyright 1990, 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#ifndef CRAY +#define STACKMIN 512 +#define MINBLK (2*sizeof(struct mem) + 16) +#define F _malloc_free_ +#define SBGULP 8192 +#include "string.h" /* for memcpy */ + +#ifdef KR_headers +#define Char char +#define Unsigned unsigned +#define Int /*int*/ +#else +#define Char void +#define Unsigned size_t +#define Int int +#endif + +typedef struct mem { + struct mem *next; + Unsigned len; + } mem; + +mem *F; + + Char * +#ifdef KR_headers +malloc(size) + register Unsigned size; +#else +malloc(register Unsigned size) +#endif +{ + register mem *p, *q, *r, *s; + unsigned register k, m; + extern Char *sbrk(Int); + char *top, *top1; + + size = (size+7) & ~7; + r = (mem *) &F; + for (p = F, q = 0; p; r = p, p = p->next) { + if ((k = p->len) >= size && (!q || m > k)) { + m = k; + q = p; + s = r; + } + } + if (q) { + if (q->len - size >= MINBLK) { /* split block */ + p = (mem *) (((char *) (q+1)) + size); + p->next = q->next; + p->len = q->len - size - sizeof(mem); + s->next = p; + q->len = size; + } + else + s->next = q->next; + } + else { + top = (Char *)(((long)sbrk(0) + 7) & ~7); + if (F && (char *)(F+1) + F->len == top) { + q = F; + F = F->next; + } + else + q = (mem *) top; + top1 = (char *)(q+1) + size; + if (sbrk((int)(top1-top+SBGULP)) == (Char *) -1) + return 0; + r = (mem *)top1; + r->len = SBGULP - sizeof(mem); + r->next = F; + F = r; + q->len = size; + } + return (Char *) (q+1); + } + + void +#ifdef KR_headers +free(f) + Char *f; +#else +free(Char *f) +#endif +{ + mem *p, *q, *r; + char *pn, *qn; + + if (!f) return; + q = (mem *) ((char *)f - sizeof(mem)); + qn = (char *)f + q->len; + for (p = F, r = (mem *) &F; ; r = p, p = p->next) { + if (qn == (Char *) p) { + q->len += p->len + sizeof(mem); + p = p->next; + } + pn = p ? ((char *) (p+1)) + p->len : 0; + if (pn == (Char *) q) { + p->len += sizeof(mem) + q->len; + q->len = 0; + q->next = p; + r->next = p; + break; + } + if (pn < (char *) q) { + r->next = q; + q->next = p; + break; + } + } + } + + Char * +#ifdef KR_headers +realloc(f, size) + Char *f; + Unsigned size; +#else +realloc(Char *f, Unsigned size) +#endif +{ + mem *p; + Char *q, *f1; + Unsigned s1; + + if (!f) return malloc(size); + p = (mem *) ((char *)f - sizeof(mem)); + s1 = p->len; + free(f); + if (s1 > size) + s1 = size + 7 & ~7; + if (!p->len) { + f1 = (Char *)(p->next + 1); + /* til 20160114 was memcpy(f1, f, s1); */ + memmove(f1, f, s1); + f = f1; + } + q = malloc(size); + if (q && q != f) + memcpy(q, f, s1); + return q; + } + +/* The following (calloc) should really be in a separate file, */ +/* but defining it here sometimes avoids confusion on systems */ +/* that do not provide calloc in its own file. */ + + Char * +#ifdef KR_headers +calloc(n, m) Unsigned m, n; +#else +calloc(Unsigned n, Unsigned m) +#endif +{ + Char *rv; + rv = malloc(n *= m); + if (n && rv) + memset(rv, 0, n); + return rv; + } +#endif diff --git a/tools/connec/src/mem.c b/tools/connec/src/mem.c new file mode 100644 index 0000000..0366692 --- /dev/null +++ b/tools/connec/src/mem.c @@ -0,0 +1,272 @@ +/**************************************************************** +Copyright 1990, 1991, 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "iob.h" + +#define MEMBSIZE 32000 +#define GMEMBSIZE 16000 + +#ifdef _WIN32 +#undef MSDOS +#endif + + char * +#ifdef KR_headers +gmem(n, round) + int n; + int round; +#else +gmem(int n, int round) +#endif +{ + static char *last, *next; + char *rv; + if (round) +#ifdef CRAY + if ((Addr)next & 0xe000000000000000) + next = (char *)(((Addr)next & 0x1fffffffffffffff) + 1); +#else +#ifdef MSDOS + if ((int)next & 1) + next++; +#else + next = (char *)(((Addr)next + sizeof(char *)-1) + & ~((Addr)sizeof(char *)-1)); +#endif +#endif + rv = next; + if ((next += n) > last) { + rv = Alloc(n + GMEMBSIZE); + + next = rv + n; + last = next + GMEMBSIZE; + } + return rv; + } + + struct memblock { + struct memblock *next; + char buf[MEMBSIZE]; + }; + typedef struct memblock memblock; + + static memblock *mem0; + memblock *curmemblock, *firstmemblock; + + char *mem_first, *mem_next, *mem_last, *mem0_last; + + void +mem_init(Void) +{ + curmemblock = firstmemblock = mem0 + = (memblock *)Alloc(sizeof(memblock)); + mem_first = mem0->buf; + mem_next = mem0->buf; + mem_last = mem0->buf + MEMBSIZE; + mem0_last = mem0->buf + MEMBSIZE; + mem0->next = 0; + } + + char * +#ifdef KR_headers +mem(n, round) + int n; + int round; +#else +mem(int n, int round) +#endif +{ + memblock *b; + register char *rv, *s; + + if (round) +#ifdef CRAY + if ((Addr)mem_next & 0xe000000000000000) + mem_next = (char *)(((Addr)mem_next & 0x1fffffffffffffff) + 1); +#else +#ifdef MSDOS + if ((int)mem_next & 1) + mem_next++; +#else + mem_next = (char *)(((Addr)mem_next + sizeof(char *)-1) + & ~((Addr)sizeof(char *)-1)); +#endif +#endif + rv = mem_next; + s = rv + n; + if (s >= mem_last) { + if (n > MEMBSIZE) { + fprintf(stderr, "mem(%d) failure!\n", n); + exit(1); + } + if (!(b = curmemblock->next)) { + b = (memblock *)Alloc(sizeof(memblock)); + curmemblock->next = b; + b->next = 0; + } + curmemblock = b; + rv = b->buf; + mem_last = rv + sizeof(b->buf); + s = rv + n; + } + mem_next = s; + return rv; + } + + char * +#ifdef KR_headers +tostring(s, n) + register char *s; + int n; +#else +tostring(register char *s, int n) +#endif +{ + register char *s1, *se, **sf; + char *rv, *s0; + register int k = n + 2, t; + + sf = str_fmt; + sf['%'] = "%"; + s0 = s; + se = s + n; + for(; s < se; s++) { + t = *(unsigned char *)s; + s1 = sf[t]; + while(*++s1) + k++; + } + sf['%'] = "%%"; + rv = s1 = mem(k,0); + *s1++ = '"'; + for(s = s0; s < se; s++) { + t = *(unsigned char *)s; + sprintf(s1, sf[t], t); + s1 += strlen(s1); + } + *s1 = 0; + return rv; + } + + char * +#ifdef KR_headers +cpstring(s) + register char *s; +#else +cpstring(register char *s) +#endif +{ + return strcpy(mem(strlen(s)+1,0), s); + } + + void +#ifdef KR_headers +new_iob_data(ios, name) + register io_setup *ios; + char *name; +#else +new_iob_data(register io_setup *ios, char *name) +#endif +{ + register iob_data *iod; + register char **s, **se; + + iod = (iob_data *) + mem(sizeof(iob_data) + ios->nelt*sizeof(char *), 1); + iod->next = iob_list; + iob_list = iod; + iod->type = ios->fields[0]; + iod->name = cpstring(name); + s = iod->fields; + se = s + ios->nelt; + while(s < se) + *s++ = "0"; + *s = 0; + } + + char * +#ifdef KR_headers +string_num(pfx, n) + char *pfx; + long n; +#else +string_num(char *pfx, long n) +#endif +{ + char buf[32]; + sprintf(buf, "%s%ld", pfx, n); + /* can't trust return type of sprintf -- BSD gets it wrong */ + return strcpy(mem(strlen(buf)+1,0), buf); + } + +static defines *define_list; + + void +#ifdef KR_headers +def_start(outfile, s1, s2, post) + FILE *outfile; + char *s1; + char *s2; + char *post; +#else +def_start(FILE *outfile, char *s1, char *s2, char *post) +#endif +{ + defines *d; + int n, n1; + extern int in_define; + + n = n1 = strlen(s1); + if (s2) + n += strlen(s2); + d = (defines *)mem(sizeof(defines)+n, 1); + d->next = define_list; + define_list = d; + strcpy(d->defname, s1); + if (s2) + strcpy(d->defname + n1, s2); + in_define = 1; + nice_printf(outfile, "#define %s", d->defname); + if (post) + nice_printf(outfile, " %s", post); + } + + void +#ifdef KR_headers +other_undefs(outfile) + FILE *outfile; +#else +other_undefs(FILE *outfile) +#endif +{ + defines *d; + if (d = define_list) { + define_list = 0; + nice_printf(outfile, "\n"); + do + nice_printf(outfile, "#undef %s\n", d->defname); + while(d = d->next); + nice_printf(outfile, "\n"); + } + } diff --git a/tools/connec/src/mem.o b/tools/connec/src/mem.o new file mode 100644 index 0000000000000000000000000000000000000000..451ca6ed9152fc8801106ed9dc0dc515dfa4dbb7 GIT binary patch literal 6320 zcmbW5e{fV+702)Hreqsov!&6dQgkWAhPG@sC4oe+leZyoQx{>VsBd?J3*;?ofMLiysijV;Dz zW7FntZvWfa6XcFN!EzeXFY~}VyzQmh;{BVHH*kvGo^qCfuBkoR$&A{g$Gb|Y3D!vk zK6!GQL8#3q}aUTg|Po3CoyGDRd&z%1Jl+mDf?fuwc#yR8^$op&Nrji@5aRg zVndV`QdEo|c*EL4uM>CO5y*XQDvqR_2A6kJG;dKfl_p+VKo$yrR+~U?6RVAmB%_(p z#)g5VvBAFKkwPxBsD?GLh6a{k4f%$V0k(J`GdP^h#2WGpPYqjK$P%J*4P)y%IzAt3 z+}vNtT7}rkcuPF7Ye2dQPK( zJNs+dT@>rX)RWx^Rb#pD-nu?*8bg+&-a*Vl3eX))x1LTTNIG_D#>s4@OH^R>*1Y}-|6A^OCI-d@m|pU zBs?6|5Sw!i-9%)*wvN40V=LuqE+rD#m=7-yhn-%bCErgf@1f@=c4=CzhsqE6@F#uv z4}ADfeE83N_-5kp^QV+U#CbtEzR0u1JK@7$_2FlU!~S;p-ih;u*dKlL-|^v7($2WJ zP|0(L7?x@_KXF!I+^3|zIEzTV&PRWt)W1uOKnIRDRaZxwcVYY%uPlz)oC(gWMnLjG0oxZu*C+4b9swu{X}=L zbRjoWhKgtv%5YB<;2jDHQz&mw4G6A4vt!+ zlh<_8`KhB7%*e5La=&FcNbHo+386Iq>8Uj7-( zNx(5zivI$T1YEasO3-WhOFsM!jqBsSt8qQ9t3G@ly>}3=|MeQz{ambZ+<{bF_h>w( zahwkjtji*Lls?V}2>9*vD30?1;$6oFB!{1RT)Q+rm)ew_y&7Lae2J_->ETL$LgV-W zqxfl!>vmq#IKItF|ANM$ulRg8PJ*}^=uv!woj`M~#J2Z~(wpy2snjPHX6gM?}+<_Gz z@zH-w)7RsDT;nLJc)#nze=IpNJ>H-D=s)k_>br7AgT-_5b7tiqR^8Lp>6QcCheeG8+p5f|V z_MwNX`&UdmPhd;kvqn5z-J4iEzkAf`>!;kxx%rSP|NksTT@ix!mq$A>$gOhS z+?uPa%E<9;#+tU%qf0vuQIhwi;TkGq9JLSY(MW=`3S1r+Kti^9##LNSx2m$csRWze z{=Krl8b@_dvcommequiv; + if ((mask & M(STGCOMMON))) + return !name->vcommequiv; + } + return ONEOF(stg, mask); + } + + +/* op_assign -- given a binary opcode, return the associated assignment + operator */ + + int +#ifdef KR_headers +op_assign(opcode) + int opcode; +#else +op_assign(int opcode) +#endif +{ + int retval = -1; + + switch (opcode) { + case OPPLUS: retval = OPPLUSEQ; break; + case OPMINUS: retval = OPMINUSEQ; break; + case OPSTAR: retval = OPSTAREQ; break; + case OPSLASH: retval = OPSLASHEQ; break; + case OPMOD: retval = OPMODEQ; break; + case OPLSHIFT: retval = OPLSHIFTEQ; break; + case OPRSHIFT: retval = OPRSHIFTEQ; break; + case OPBITAND: retval = OPBITANDEQ; break; + case OPBITXOR: retval = OPBITXOREQ; break; + case OPBITOR: retval = OPBITOREQ; break; + default: + erri ("op_assign: bad opcode '%d'", opcode); + break; + } /* switch */ + + return retval; +} /* op_assign */ + + + char * +#ifdef KR_headers +Alloc(n) + int n; +#else +Alloc(int n) +#endif + /* error-checking version of malloc */ + /* ckalloc initializes memory to 0; Alloc does not */ +{ + char errbuf[32]; + register char *rv; + + rv = (char*)malloc(n); + if (!rv) { + sprintf(errbuf, "malloc(%d) failure!", n); + Fatal(errbuf); + } + return rv; + } + + void +#ifdef KR_headers +cpn(n, a, b) + register int n; + register char *a; + register char *b; +#else +cpn(register int n, register char *a, register char *b) +#endif +{ + while(--n >= 0) + *b++ = *a++; +} + + + int +#ifdef KR_headers +eqn(n, a, b) + register int n; + register char *a; + register char *b; +#else +eqn(register int n, register char *a, register char *b) +#endif +{ + while(--n >= 0) + if(*a++ != *b++) + return(NO); + return(YES); +} + + + + + + + int +#ifdef KR_headers +cmpstr(a, b, la, lb) + register char *a; + register char *b; + ftnint la; + ftnint lb; +#else +cmpstr(register char *a, register char *b, ftnint la, ftnint lb) +#endif + /* compare two strings */ +{ + register char *aend, *bend; + aend = a + la; + bend = b + lb; + + + if(la <= lb) + { + while(a < aend) + if(*a != *b) + return( *a - *b ); + else + { + ++a; + ++b; + } + + while(b < bend) + if(*b != ' ') + return(' ' - *b); + else + ++b; + } + + else + { + while(b < bend) + if(*a != *b) + return( *a - *b ); + else + { + ++a; + ++b; + } + while(a < aend) + if(*a != ' ') + return(*a - ' '); + else + ++a; + } + return(0); +} + + +/* hookup -- Same as LISP NCONC, that is a destructive append of two lists */ + + chainp +#ifdef KR_headers +hookup(x, y) + register chainp x; + register chainp y; +#else +hookup(register chainp x, register chainp y) +#endif +{ + register chainp p; + + if(x == NULL) + return(y); + + for(p = x ; p->nextp ; p = p->nextp) + ; + p->nextp = y; + return(x); +} + + + + struct Listblock * +#ifdef KR_headers +mklist(p) + chainp p; +#else +mklist(chainp p) +#endif +{ + register struct Listblock *q; + + q = ALLOC(Listblock); + q->tag = TLIST; + q->listp = p; + return(q); +} + + + chainp +#ifdef KR_headers +mkchain(p, q) + register char * p; + register chainp q; +#else +mkchain(register char * p, register chainp q) +#endif +{ + register chainp r; + + if(chains) + { + r = chains; + chains = chains->nextp; + } + else + r = ALLOC(Chain); + + r->datap = p; + r->nextp = q; + return(r); +} + + chainp +#ifdef KR_headers +revchain(next) + register chainp next; +#else +revchain(register chainp next) +#endif +{ + register chainp p, prev = 0; + + while(p = next) { + next = p->nextp; + p->nextp = prev; + prev = p; + } + return prev; + } + + +/* addunder -- turn a cvarname into an external name */ +/* The cvarname may already end in _ (to avoid C keywords); */ +/* if not, it has room for appending an _. */ + + char * +#ifdef KR_headers +addunder(s) + register char *s; +#else +addunder(register char *s) +#endif +{ + register int c, i, j; + char *s0 = s; + + i = j = 0; + while(c = *s++) + if (c == '_') + i++, j++; + else + i = 0; + if (!i) { + *s-- = 0; + *s = '_'; + } + else if (j == 2) + s[-2] = 0; + return( s0 ); + } + + +/* copyn -- return a new copy of the input Fortran-string */ + + char * +#ifdef KR_headers +copyn(n, s) + register int n; + register char *s; +#else +copyn(register int n, register char *s) +#endif +{ + register char *p, *q; + + p = q = (char *) Alloc(n); + while(--n >= 0) + *q++ = *s++; + return(p); +} + + + +/* copys -- return a new copy of the input C-string */ + + char * +#ifdef KR_headers +copys(s) + char *s; +#else +copys(char *s) +#endif +{ + return( copyn( strlen(s)+1 , s) ); +} + + + +/* convci -- Convert Fortran-string to integer; assumes that input is a + legal number, with no trailing blanks */ + + ftnint +#ifdef KR_headers +convci(n, s) + register int n; + register char *s; +#else +convci(register int n, register char *s) +#endif +{ + ftnint sum, t; + char buff[100], *s0; + int n0; + + s0 = s; + n0 = n; + sum = 0; + while(n-- > 0) { + /* sum = 10*sum + (*s++ - '0'); */ + t = *s++ - '0'; + if (sum > LONG_MAX/10) { + ovfl: + if (n0 > 60) + n0 = 60; + sprintf(buff, "integer constant %.*s truncated.", + n0, s0); + err(buff); + return LONG_MAX; + } + sum *= 10; + if (sum > LONG_MAX - t) + goto ovfl; + sum += t; + } + return(sum); + } + +/* convic - Convert Integer constant to string */ + + char * +#ifdef KR_headers +convic(n) + ftnint n; +#else +convic(ftnint n) +#endif +{ + static char s[20]; + register char *t; + + s[19] = '\0'; + t = s+19; + + do { + *--t = '0' + n%10; + n /= 10; + } while(n > 0); + + return(t); +} + + + +/* mkname -- add a new identifier to the environment, including the closed + hash table. */ + + Namep +#ifdef KR_headers +mkname(s) + register char *s; +#else +mkname(register char *s) +#endif +{ + struct Hashentry *hp; + register Namep q; + register int c, hash, i; + register char *t; + char *s0; + char errbuf[64]; + + hash = i = 0; + s0 = s; + while(c = *s++) { + hash += c; + if (c == '_') + i = 2; + } + if (!i && in_vector(s0,c_keywords,n_keywords) >= 0) + i = 2; + hash %= maxhash; + +/* Add the name to the closed hash table */ + + hp = hashtab + hash; + + while(q = hp->varp) + if( hash == hp->hashval && !strcmp(s0,q->fvarname) ) + return(q); + else if(++hp >= lasthash) + hp = hashtab; + + if(++nintnames >= maxhash-1) + many("names", 'n', maxhash); /* Fatal error */ + hp->varp = q = ALLOC(Nameblock); + hp->hashval = hash; + q->tag = TNAME; /* TNAME means the tag type is NAME */ + c = s - s0; + if (c > 7 && noextflag) { + sprintf(errbuf, "\"%.35s%s\" over 6 characters long", s0, + c > 36 ? "..." : ""); + errext(errbuf); + } + q->fvarname = strcpy(mem(c,0), s0); + t = q->cvarname = mem(c + i + 1, 0); + s = s0; + /* add __ to the end of any name containing _ and to any C keyword */ + while(*t = *s++) + t++; + if (i) { + do *t++ = '_'; + while(--i > 0); + *t = 0; + } + return(q); +} + + + struct Labelblock * +#ifdef KR_headers +mklabel(l) + ftnint l; +#else +mklabel(ftnint l) +#endif +{ + register struct Labelblock *lp; + + if(l <= 0) + return(NULL); + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if(lp->stateno == l) + return(lp); + + if(++highlabtab > labtabend) + many("statement labels", 's', maxstno); + + lp->stateno = l; + lp->labelno = (int)newlabel(); + lp->blklevel = 0; + lp->labused = NO; + lp->fmtlabused = NO; + lp->labdefined = NO; + lp->labinacc = NO; + lp->labtype = LABUNKNOWN; + lp->fmtstring = 0; + return(lp); +} + + long +newlabel(Void) +{ + return ++lastlabno; +} + + +/* this label appears in a branch context */ + + struct Labelblock * +#ifdef KR_headers +execlab(stateno) + ftnint stateno; +#else +execlab(ftnint stateno) +#endif +{ + register struct Labelblock *lp; + + if(lp = mklabel(stateno)) + { + if(lp->labinacc) + warn1("illegal branch to inner block, statement label %s", + convic(stateno) ); + else if(lp->labdefined == NO) + lp->blklevel = blklevel; + if(lp->labtype == LABFORMAT) + err("may not branch to a format"); + else + lp->labtype = LABEXEC; + } + else + execerr("illegal label %s", convic(stateno)); + + return(lp); +} + + +/* find or put a name in the external symbol table */ + + Extsym * +#ifdef KR_headers +mkext1(f, s) + char *f; + char *s; +#else +mkext1(char *f, char *s) +#endif +{ + Extsym *p; + + for(p = extsymtab ; pcextname)) + return( p ); + + if(nextext >= lastext) + many("external symbols", 'x', maxext); + + nextext->fextname = strcpy(gmem(strlen(f)+1,0), f); + nextext->cextname = f == s + ? nextext->fextname + : strcpy(gmem(strlen(s)+1,0), s); + nextext->extstg = STGUNKNOWN; + nextext->extp = 0; + nextext->allextp = 0; + nextext->extleng = 0; + nextext->maxleng = 0; + nextext->extinit = 0; + nextext->curno = nextext->maxno = 0; + return( nextext++ ); +} + + + Extsym * +#ifdef KR_headers +mkext(f, s) + char *f; + char *s; +#else +mkext(char *f, char *s) +#endif +{ + Extsym *e = mkext1(f, s); + if (e->extstg == STGCOMMON) + errstr("%.52s cannot be a subprogram: it is a common block.",f); + return e; + } + + Addrp +#ifdef KR_headers +builtin(t, s, dbi) + int t; + char *s; + int dbi; +#else +builtin(int t, char *s, int dbi) +#endif +{ + register Extsym *p; + register Addrp q; + extern chainp used_builtins; + + p = mkext(s,s); + if(p->extstg == STGUNKNOWN) + p->extstg = STGEXT; + else if(p->extstg != STGEXT) + { + errstr("improper use of builtin %s", s); + return(0); + } + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = t; + q->vclass = CLPROC; + q->vstg = STGEXT; + q->memno = p - extsymtab; + q->dbl_builtin = dbi; + +/* A NULL pointer here tells you to use memno to check the external + symbol table */ + + q -> uname_tag = UNAM_EXTERN; + +/* Add to the list of used builtins */ + + if (dbi >= 0) + add_extern_to_list (q, &used_builtins); + return(q); +} + + + void +#ifdef KR_headers +add_extern_to_list(addr, list_store) + Addrp addr; + chainp *list_store; +#else +add_extern_to_list(Addrp addr, chainp *list_store) +#endif +{ + chainp last = CHNULL; + chainp list; + int memno; + + if (list_store == (chainp *) NULL || addr == (Addrp) NULL) + return; + + list = *list_store; + memno = addr -> memno; + + for (;list; last = list, list = list -> nextp) { + Addrp This = (Addrp) (list -> datap); + + if (This -> tag == TADDR && This -> uname_tag == UNAM_EXTERN && + This -> memno == memno) + return; + } /* for */ + + if (*list_store == CHNULL) + *list_store = mkchain((char *)cpexpr((expptr)addr), CHNULL); + else + last->nextp = mkchain((char *)cpexpr((expptr)addr), CHNULL); + +} /* add_extern_to_list */ + + + void +#ifdef KR_headers +frchain(p) + register chainp *p; +#else +frchain(register chainp *p) +#endif +{ + register chainp q; + + if(p==0 || *p==0) + return; + + for(q = *p; q->nextp ; q = q->nextp) + ; + q->nextp = chains; + chains = *p; + *p = 0; +} + + void +#ifdef KR_headers +frexchain(p) + register chainp *p; +#else +frexchain(register chainp *p) +#endif +{ + register chainp q, r; + + if (q = *p) { + for(;;q = r) { + frexpr((expptr)q->datap); + if (!(r = q->nextp)) + break; + } + q->nextp = chains; + chains = *p; + *p = 0; + } + } + + + tagptr +#ifdef KR_headers +cpblock(n, p) + register int n; + register char *p; +#else +cpblock(register int n, register char *p) +#endif +{ + register ptr q; + + memcpy((char *)(q = ckalloc(n)), (char *)p, n); + return( (tagptr) q); +} + + + + ftnint +#ifdef KR_headers +lmax(a, b) + ftnint a; + ftnint b; +#else +lmax(ftnint a, ftnint b) +#endif +{ + return( a>b ? a : b); +} + + ftnint +#ifdef KR_headers +lmin(a, b) + ftnint a; + ftnint b; +#else +lmin(ftnint a, ftnint b) +#endif +{ + return(a < b ? a : b); +} + + + + int +#ifdef KR_headers +maxtype(t1, t2) + int t1; + int t2; +#else +maxtype(int t1, int t2) +#endif +{ + int t; + + t = t1 >= t2 ? t1 : t2; + if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) ) + t = TYDCOMPLEX; + return(t); +} + + + +/* return log base 2 of n if n a power of 2; otherwise -1 */ + int +#ifdef KR_headers +log_2(n) + ftnint n; +#else +log_2(ftnint n) +#endif +{ + int k; + + /* trick based on binary representation */ + + if(n<=0 || (n & (n-1))!=0) + return(-1); + + for(k = 0 ; n >>= 1 ; ++k) + ; + return(k); +} + + + void +frrpl(Void) +{ + struct Rplblock *rp; + + while(rpllist) + { + rp = rpllist->rplnextp; + free( (charptr) rpllist); + rpllist = rp; + } +} + + + +/* Call a Fortran function with an arbitrary list of arguments */ + +int callk_kludge; + + expptr +#ifdef KR_headers +callk(type, name, args) + int type; + char *name; + chainp args; +#else +callk(int type, char *name, chainp args) +#endif +{ + register expptr p; + + p = mkexpr(OPCALL, + (expptr)builtin(callk_kludge ? callk_kludge : type, name, 0), + (expptr)args); + p->exprblock.vtype = type; + return(p); +} + + + + expptr +#ifdef KR_headers +call4(type, name, arg1, arg2, arg3, arg4) + int type; + char *name; + expptr arg1; + expptr arg2; + expptr arg3; + expptr arg4; +#else +call4(int type, char *name, expptr arg1, expptr arg2, expptr arg3, expptr arg4) +#endif +{ + struct Listblock *args; + args = mklist( mkchain((char *)arg1, + mkchain((char *)arg2, + mkchain((char *)arg3, + mkchain((char *)arg4, CHNULL)) ) ) ); + return( callk(type, name, (chainp)args) ); +} + + + + + expptr +#ifdef KR_headers +call3(type, name, arg1, arg2, arg3) + int type; + char *name; + expptr arg1; + expptr arg2; + expptr arg3; +#else +call3(int type, char *name, expptr arg1, expptr arg2, expptr arg3) +#endif +{ + struct Listblock *args; + args = mklist( mkchain((char *)arg1, + mkchain((char *)arg2, + mkchain((char *)arg3, CHNULL) ) ) ); + return( callk(type, name, (chainp)args) ); +} + + + + + + expptr +#ifdef KR_headers +call2(type, name, arg1, arg2) + int type; + char *name; + expptr arg1; + expptr arg2; +#else +call2(int type, char *name, expptr arg1, expptr arg2) +#endif +{ + struct Listblock *args; + + args = mklist( mkchain((char *)arg1, mkchain((char *)arg2, CHNULL) ) ); + return( callk(type,name, (chainp)args) ); +} + + + + + expptr +#ifdef KR_headers +call1(type, name, arg) + int type; + char *name; + expptr arg; +#else +call1(int type, char *name, expptr arg) +#endif +{ + return( callk(type,name, (chainp)mklist(mkchain((char *)arg,CHNULL)) )); +} + + + expptr +#ifdef KR_headers +call0(type, name) + int type; + char *name; +#else +call0(int type, char *name) +#endif +{ + return( callk(type, name, CHNULL) ); +} + + + + struct Impldoblock * +#ifdef KR_headers +mkiodo(dospec, list) + chainp dospec; + chainp list; +#else +mkiodo(chainp dospec, chainp list) +#endif +{ + register struct Impldoblock *q; + + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + q->impdospec = dospec; + q->datalist = list; + return(q); +} + + + + +/* ckalloc -- Allocate 1 memory unit of size n, checking for out of + memory error */ + + ptr +#ifdef KR_headers +ckalloc(n) + register int n; +#else +ckalloc(register int n) +#endif +{ + register ptr p; + p = (ptr)calloc(1, (unsigned) n); + if (p || !n) + return(p); + fprintf(stderr, "failing to get %d bytes\n",n); + Fatal("out of memory"); + /* NOT REACHED */ return 0; +} + + + int +#ifdef KR_headers +isaddr(p) + register expptr p; +#else +isaddr(register expptr p) +#endif +{ + if(p->tag == TADDR) + return(YES); + if(p->tag == TEXPR) + switch(p->exprblock.opcode) + { + case OPCOMMA: + return( isaddr(p->exprblock.rightp) ); + + case OPASSIGN: + case OPASSIGNI: + case OPPLUSEQ: + case OPMINUSEQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + return( isaddr(p->exprblock.leftp) ); + } + return(NO); +} + + + + int +#ifdef KR_headers +isstatic(p) + register expptr p; +#else +isstatic(register expptr p) +#endif +{ + extern int useauto; + if(p->headblock.vleng && !ISCONST(p->headblock.vleng)) + return(NO); + + switch(p->tag) + { + case TCONST: + return(YES); + + case TADDR: + if(ONEOF(p->addrblock.vstg,MSKSTATIC) && + ISCONST(p->addrblock.memoffset) && !useauto) + return(YES); + + default: + return(NO); + } +} + + + +/* addressable -- return True iff it is a constant value, or can be + referenced by constant values */ + + int +#ifdef KR_headers +addressable(p) expptr p; +#else +addressable(expptr p) +#endif +{ + if (p) + switch(p->tag) { + case TCONST: + return(YES); + + case TADDR: + return( addressable(p->addrblock.memoffset) ); + } + return(NO); + } + + +/* isnegative_const -- returns true if the constant is negative. Returns + false for imaginary and nonnumeric constants */ + + int +#ifdef KR_headers +isnegative_const(cp) + struct Constblock *cp; +#else +isnegative_const(struct Constblock *cp) +#endif +{ + int retval; + + if (cp == NULL) + return 0; + + switch (cp -> vtype) { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + retval = cp -> Const.ci < 0; + break; + case TYREAL: + case TYDREAL: + retval = cp->vstg ? *cp->Const.cds[0] == '-' + : cp->Const.cd[0] < 0.0; + break; + default: + + retval = 0; + break; + } /* switch */ + + return retval; +} /* isnegative_const */ + + void +#ifdef KR_headers +negate_const(cp) + Constp cp; +#else +negate_const(Constp cp) +#endif +{ + if (cp == (struct Constblock *) NULL) + return; + + switch (cp -> vtype) { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + cp -> Const.ci = - cp -> Const.ci; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if (cp->vstg) + switch(*cp->Const.cds[1]) { + case '-': + ++cp->Const.cds[1]; + break; + case '0': + break; + default: + --cp->Const.cds[1]; + } + else + cp->Const.cd[1] = -cp->Const.cd[1]; + /* no break */ + case TYREAL: + case TYDREAL: + if (cp->vstg) + switch(*cp->Const.cds[0]) { + case '-': + ++cp->Const.cds[0]; + break; + case '0': + break; + default: + --cp->Const.cds[0]; + } + else + cp->Const.cd[0] = -cp->Const.cd[0]; + break; + case TYCHAR: + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + erri ("negate_const: can't negate type '%d'", cp -> vtype); + break; + default: + erri ("negate_const: bad type '%d'", + cp -> vtype); + break; + } /* switch */ +} /* negate_const */ + + void +#ifdef KR_headers +ffilecopy(infp, outfp) FILE *infp, *outfp; +#else +ffilecopy(FILE *infp, FILE *outfp) +#endif +{ + int c; + while (!feof(infp)) { + c = getc(infp); + if (!feof(infp)) + putc(c, outfp); + } + } + + +/* in_vector -- verifies whether str is in c_keywords. + If so, the index is returned else -1 is returned. + c_keywords must be in alphabetical order (as defined by strcmp). +*/ + + int +#ifdef KR_headers +in_vector(str, keywds, n) + char *str; + char **keywds; + register int n; +#else +in_vector(char *str, char **keywds, register int n) +#endif +{ + register char **K = keywds; + register int n1, t; + + do { + n1 = n >> 1; + if (!(t = strcmp(str, K[n1]))) + return K - keywds + n1; + if (t < 0) + n = n1; + else { + n -= ++n1; + K += n1; + } + } + while(n > 0); + + return -1; + } /* in_vector */ + + + int +#ifdef KR_headers +is_negatable(Const) + Constp Const; +#else +is_negatable(Constp Const) +#endif +{ + int retval = 0; + if (Const != (Constp) NULL) + switch (Const -> vtype) { + case TYINT1: + retval = Const -> Const.ci >= -BIGGEST_CHAR; + break; + case TYSHORT: + retval = Const -> Const.ci >= -BIGGEST_SHORT; + break; + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + retval = Const -> Const.ci >= -BIGGEST_LONG; + break; + case TYREAL: + case TYDREAL: + case TYCOMPLEX: + case TYDCOMPLEX: + retval = 1; + break; + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + case TYCHAR: + case TYSUBR: + default: + retval = 0; + break; + } /* switch */ + + return retval; +} /* is_negatable */ + + void +#ifdef KR_headers +backup(fname, bname) + char *fname; + char *bname; +#else +backup(char *fname, char *bname) +#endif +{ + FILE *b, *f; + static char couldnt[] = "Couldn't open %.80s"; + + if (!(f = fopen(fname, binread))) { + warn1(couldnt, fname); + return; + } + if (!(b = fopen(bname, binwrite))) { + warn1(couldnt, bname); + return; + } + ffilecopy(f, b); + fclose(f); + fclose(b); + } + + +/* struct_eq -- returns YES if structures have the same field names and + types, NO otherwise */ + + int +#ifdef KR_headers +struct_eq(s1, s2) + chainp s1; + chainp s2; +#else +struct_eq(chainp s1, chainp s2) +#endif +{ + struct Dimblock *d1, *d2; + Constp cp1, cp2; + + if (s1 == CHNULL && s2 == CHNULL) + return YES; + for(; s1 && s2; s1 = s1->nextp, s2 = s2->nextp) { + register Namep v1 = (Namep) s1 -> datap; + register Namep v2 = (Namep) s2 -> datap; + + if (v1 == (Namep) NULL || v1 -> tag != TNAME || + v2 == (Namep) NULL || v2 -> tag != TNAME) + return NO; + + if (v1->vtype != v2->vtype || v1->vclass != v2->vclass + || strcmp(v1->fvarname, v2->fvarname)) + return NO; + + /* compare dimensions (needed for comparing COMMON blocks) */ + + if (d1 = v1->vdim) { + if (!(cp1 = (Constp)d1->nelt) || cp1->tag != TCONST + || !(d2 = v2->vdim) + || !(cp2 = (Constp)d2->nelt) || cp2->tag != TCONST + || cp1->Const.ci != cp2->Const.ci) + return NO; + } + else if (v2->vdim) + return NO; + } /* while s1 != CHNULL && s2 != CHNULL */ + + return s1 == CHNULL && s2 == CHNULL; +} /* struct_eq */ + + static int +#ifdef KR_headers +int_trunc(n0, s0) int n0; char *s0; +#else +int_trunc(int n0, char *s0) +#endif +{ + char buff[100]; + + if (n0 > 60) + n0 = 60; + sprintf(buff, "integer constant %.*s truncated.", n0, s0); + err(buff); + return 1; + } + + tagptr +#ifdef KR_headers +mkintqcon(n, s) int n; char *s; +#else +mkintqcon(int n, char *s) +#endif +{ +#ifdef NO_LONG_LONG + return mkintcon(convci(n, s)); +#else +#ifndef LLONG_MAX +#ifdef LONGLONG_MAX +#define LLONG_MAX LONGLONG_MAX +#else +#define LLONG_MAX 0x7fffffffffffffffLL +#endif +#endif + Constp p; + Llong sum, t; + char *s0; + int n0, warned = 0; + + s0 = s; + n0 = n; + sum = 0; + while(n-- > 0) { + /* sum = 10*sum + (*s++ - '0'); */ + t = *s++ - '0'; + if (sum > LLONG_MAX/10) { + ovfl: + warned = int_trunc(n0,s0); + sum = LLONG_MAX; + break; + } + sum *= 10; + if (sum > LLONG_MAX - t) + goto ovfl; + sum += t; + } + p = mkconst(tyint); + if (sum > LONG_MAX) { + if (allow_i8c) { + p->vtype = TYQUAD; + p->Const.cq = sum; + } + else { + p->Const.ci = LONG_MAX; + if (!warned) + int_trunc(n0,s0); + } + } + else + p->Const.ci = (ftnint) sum; + return (tagptr)p; +#endif + } diff --git a/tools/connec/src/misc.o b/tools/connec/src/misc.o new file mode 100644 index 0000000000000000000000000000000000000000..199270dee84056e58ac5ae4ace206d33b3f8a664 GIT binary patch literal 21064 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 B`pEzQ literal 0 HcmV?d00001 diff --git a/tools/connec/src/mkfile.plan9 b/tools/connec/src/mkfile.plan9 new file mode 100644 index 0000000..7346612 --- /dev/null +++ b/tools/connec/src/mkfile.plan9 @@ -0,0 +1,107 @@ +# Plan 9 mkfile for f2c, a Fortran 77 to C converter + +gram.in + $YACC $YFLAGS gram.in + @echo "(There should be 4 shift/reduce conflicts.)" + sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c + rm -f gram.in y.tab.c + +$OBJECTSd: defs.h ftypes.h defines.h machdefs.h sysdep.h + +tokdefs.h: tokens + grep -n . tokdefs.h + +cds.$O: sysdep.h +exec.$O: p1defs.h names.h +expr.$O: output.h niceprintf.h names.h +format.$O: p1defs.h format.h output.h niceprintf.h names.h iob.h +formatdata.$O: format.h output.h niceprintf.h names.h +gram.$O: p1defs.h +init.$O: output.h niceprintf.h iob.h +intr.$O: names.h +io.$O: names.h iob.h +lex.$O : tokdefs.h p1defs.h +main.$O: parse.h usignal.h +mem.$O: iob.h +names.$O: iob.h names.h output.h niceprintf.h +niceprintf.$O: defs.h names.h output.h niceprintf.h +output.$O: output.h niceprintf.h names.h +p1output.$O: p1defs.h output.h niceprintf.h names.h +parse_args.$O: parse.h +proc.$O: tokdefs.h names.h niceprintf.h output.h p1defs.h +put.$O: names.h pccdefs.h p1defs.h +putpcc.$O: names.h +vax.$O: defs.h output.h pccdefs.h +output.h: niceprintf.h + +put.$O putpcc.$O: pccdefs.h + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +#f2c.1: f2c.1t +# nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + rm -f *.$O f2c tokdefs.h f2c.t + +veryclean: clean + rm -f xsum + +b = Notice README cds.c data.c defines.h defs.h equiv.c error.c \ + exec.c expr.c f2c.1 f2c.1t f2c.h format.c format.h formatdata.c \ + ftypes.h gram.c gram.dcl gram.exec gram.expr gram.head gram.io \ + init.c intr.c io.c iob.h lex.c machdefs.h main.c \ + malloc.c mem.c memset.c misc.c names.c names.h niceprintf.c \ + niceprintf.h output.c output.h p1defs.h p1output.c \ + parse.h parse_args.c pccdefs.h pread.c proc.c put.c putpcc.c \ + sysdep.c sysdep.h tokens usignal.h vax.c version.c xsum.c + +xsum: xsum.c + $CC $CFLAGS -o xsum xsum.c + +#Check validity of transmitted source... +xsum.out: xsum $b + ./xsum $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsum.out + +#On non-Unix systems that end lines with carriage-return/newline pairs, +#use "make xsumr.out" rather than "make xsum.out". The -r flag ignores +#carriage-return characters. +xsumr.out: xsum $b + ./xsum -r $b >xsum1.out + cmp xsum0.out xsum1.out && mv xsum1.out xsumr.out diff --git a/tools/connec/src/names.c b/tools/connec/src/names.c new file mode 100644 index 0000000..373f656 --- /dev/null +++ b/tools/connec/src/names.c @@ -0,0 +1,835 @@ +/**************************************************************** +Copyright 1990, 1992 - 1996, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" +#include "iob.h" + + +/* Names generated by the translator are guaranteed to be unique from the + Fortan names because Fortran does not allow underscores in identifiers, + and all of the system generated names do have underscores. The various + naming conventions are outlined below: + + FORMAT APPLICATION + ---------------------------------------------------------------------- + io_# temporaries generated by IO calls; these will + contain the device number (e.g. 5, 6, 0) + ret_val function return value, required for complex and + character functions. + ret_val_len length of the return value in character functions + + ssss_len length of character argument "ssss" + + c_# member of the literal pool, where # is an + arbitrary label assigned by the system + cs_# short integer constant in the literal pool + t_# expression temporary, # is the depth of arguments + on the stack. + L# label "#", given by user in the Fortran program. + This is unique because Fortran labels are numeric + pad_# label on an init field required for alignment + xxx_init label on a common block union, if a block data + requires a separate declaration +*/ + +/* generate variable references */ + + char * +#ifdef KR_headers +c_type_decl(type, is_extern) + int type; + int is_extern; +#else +c_type_decl(int type, int is_extern) +#endif +{ + static char buff[100]; + + switch (type) { + case TYREAL: if (!is_extern || !forcedouble) + { strcpy (buff, "real");break; } + case TYDREAL: strcpy (buff, "doublereal"); break; + case TYCOMPLEX: if (is_extern) + strcpy (buff, "/* Complex */ VOID"); + else + strcpy (buff, "complex"); + break; + case TYDCOMPLEX:if (is_extern) + strcpy (buff, "/* Double Complex */ VOID"); + else + strcpy (buff, "doublecomplex"); + break; + case TYADDR: + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: strcpy(buff, Typename[type]); + break; + case TYCHAR: if (is_extern) + strcpy (buff, "/* Character */ VOID"); + else + strcpy (buff, "char"); + break; + + case TYUNKNOWN: strcpy (buff, "UNKNOWN"); + +/* If a procedure's type is unknown, assume it's a subroutine */ + + if (!is_extern) + break; + +/* Subroutines must return an INT, because they might return a label + value. Even if one doesn't, the caller will EXPECT it to. */ + + case TYSUBR: strcpy (buff, "/* Subroutine */ int"); + break; + case TYERROR: strcpy (buff, "ERROR"); break; + case TYVOID: strcpy (buff, "void"); break; + case TYCILIST: strcpy (buff, "cilist"); break; + case TYICILIST: strcpy (buff, "icilist"); break; + case TYOLIST: strcpy (buff, "olist"); break; + case TYCLLIST: strcpy (buff, "cllist"); break; + case TYALIST: strcpy (buff, "alist"); break; + case TYINLIST: strcpy (buff, "inlist"); break; + case TYFTNLEN: strcpy (buff, "ftnlen"); break; + default: sprintf (buff, "BAD DECL '%d'", type); + break; + } /* switch */ + + return buff; +} /* c_type_decl */ + + + char * +new_func_length(Void) +{ return "ret_val_len"; } + + char * +#ifdef KR_headers +new_arg_length(arg) + Namep arg; +#else +new_arg_length(Namep arg) +#endif +{ + static char buf[64]; + char *fmt = "%s_len", *s = arg->fvarname; + switch(*s) { + case 'r': + if (!strcmp(s+1, "et_val")) + goto adjust_fmt; + break; + case 'h': + case 'i': + if (!s[1]) { + adjust_fmt: + fmt = "%s_length"; /* avoid conflict with libF77 */ + } + } + sprintf (buf, fmt, s); + return buf; +} /* new_arg_length */ + + +/* declare_new_addr -- Add a new local variable to the function, given a + pointer to an Addrblock structure (which must have the uname_tag set) + This list of idents will be printed in reverse (i.e., chronological) + order */ + + void +#ifdef KR_headers +declare_new_addr(addrp) + struct Addrblock *addrp; +#else +declare_new_addr(struct Addrblock *addrp) +#endif +{ + extern chainp new_vars; + + new_vars = mkchain((char *)cpexpr((expptr)addrp), new_vars); +} /* declare_new_addr */ + + + void +#ifdef KR_headers +wr_nv_ident_help(outfile, addrp) + FILE *outfile; + struct Addrblock *addrp; +#else +wr_nv_ident_help(FILE *outfile, struct Addrblock *addrp) +#endif +{ + int eltcount = 0; + + if (addrp == (struct Addrblock *) NULL) + return; + + if (addrp -> isarray) { + frexpr (addrp -> memoffset); + addrp -> memoffset = ICON(0); + eltcount = addrp -> ntempelt; + addrp -> ntempelt = 0; + addrp -> isarray = 0; + } /* if */ + out_addr (outfile, addrp); + if (eltcount) + nice_printf (outfile, "[%d]", eltcount); +} /* wr_nv_ident_help */ + + int +#ifdef KR_headers +nv_type_help(addrp) + struct Addrblock *addrp; +#else +nv_type_help(struct Addrblock *addrp) +#endif +{ + if (addrp == (struct Addrblock *) NULL) + return -1; + + return addrp -> vtype; +} /* nv_type_help */ + + +/* lit_name -- returns a unique identifier for the given literal. Make + the label useful, when possible. For example: + + 1 -> c_1 (constant 1) + 2 -> c_2 (constant 2) + 1000 -> c_1000 (constant 1000) + 1000000 -> c_b (big constant number) + 1.2 -> c_1_2 (constant 1.2) + 1.234345 -> c_b (big constant number) + -1 -> c_n1 (constant -1) + -1.0 -> c_n1_0 (constant -1.0) + .true. -> c_true (constant true) + .false. -> c_false (constant false) + default -> c_b (default label) +*/ + + char * +#ifdef KR_headers +lit_name(litp) + struct Literal *litp; +#else +lit_name(struct Literal *litp) +#endif +{ + static char buf[CONST_IDENT_MAX]; + ftnint val; + char *fmt; + + if (litp == (struct Literal *) NULL) + return NULL; + + switch (litp -> littype) { + case TYINT1: + val = litp -> litval.litival; + if (val >= 256 || val < -255) + sprintf (buf, "ci1_b%ld", litp -> litnum); + else if (val < 0) + sprintf (buf, "ci1_n%ld", -val); + else + sprintf(buf, "ci1__%ld", val); + break; + case TYSHORT: + val = litp -> litval.litival; + if (val >= 32768 || val <= -32769) + sprintf (buf, "cs_b%ld", litp -> litnum); + else if (val < 0) + sprintf (buf, "cs_n%ld", -val); + else + sprintf (buf, "cs__%ld", val); + break; + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + val = litp -> litval.litival; + if (val >= 100000 || val <= -10000) + sprintf (buf, "c_b%ld", litp -> litnum); + else if (val < 0) + sprintf (buf, "c_n%ld", -val); + else + sprintf (buf, "c__%ld", val); + break; + case TYLOGICAL1: + fmt = "cl1_%s"; + goto spr_logical; + case TYLOGICAL2: + fmt = "cl2_%s"; + goto spr_logical; + case TYLOGICAL: + fmt = "c_%s"; + spr_logical: + sprintf (buf, fmt, (litp -> litval.litival + ? "true" : "false")); + break; + case TYREAL: + case TYDREAL: + /* Given a limit of 6 or 8 character on external names, */ + /* few f.p. values can be meaningfully encoded in the */ + /* constant name. Just going with the default cb_# */ + /* seems to be the best course for floating-point */ + /* constants. */ + case TYCHAR: + /* Shouldn't be any of these */ + case TYADDR: + case TYCOMPLEX: + case TYDCOMPLEX: + case TYSUBR: + default: + sprintf (buf, "c_b%ld", litp -> litnum); + } /* switch */ + return buf; +} /* lit_name */ + + + + char * +#ifdef KR_headers +comm_union_name(count) + int count; +#else +comm_union_name(int count) +#endif +{ + static char buf[12]; + + sprintf(buf, "%d", count); + return buf; + } + + + + +/* wr_globals -- after every function has been translated, we need to + output the global declarations, such as the static table of constant + values */ + + void +#ifdef KR_headers +wr_globals(outfile) + FILE *outfile; +#else +wr_globals(FILE *outfile) +#endif +{ + struct Literal *litp, *lastlit; + extern int hsize; + char *litname; + int did_one, t; + struct Constblock cb; + ftnint x, y; + + if (nliterals == 0) + return; + + lastlit = litpool + nliterals; + did_one = 0; + for (litp = litpool; litp < lastlit; litp++) { + if (!litp->lituse) + continue; + litname = lit_name(litp); + if (!did_one) { + margin_printf(outfile, "/* Table of constant values */\n\n"); + did_one = 1; + } + cb.vtype = litp->littype; + if (litp->littype == TYCHAR) { + x = litp->litval.litival2[0] + litp->litval.litival2[1]; + if (y = x % hsize) + x += y = hsize - y; + nice_printf(outfile, + "static struct { %s fill; char val[%ld+1];", halign, x); + nice_printf(outfile, " char fill2[%ld];", hsize - 1); + nice_printf(outfile, " } %s_st = { 0,", litname); + cb.vleng = ICON(litp->litval.litival2[0]); + cb.Const.ccp = litp->cds[0]; + cb.Const.ccp1.blanks = litp->litval.litival2[1] + y; + cb.vtype = TYCHAR; + out_const(outfile, &cb); + frexpr(cb.vleng); + nice_printf(outfile, " };\n"); + nice_printf(outfile, "#define %s %s_st.val\n", litname, litname); + continue; + } + nice_printf(outfile, "static %s %s = ", + c_type_decl(litp->littype,0), litname); + + t = litp->littype; + if (ONEOF(t, MSKREAL|MSKCOMPLEX)) { + cb.vstg = 1; + cb.Const.cds[0] = litp->cds[0]; + cb.Const.cds[1] = litp->cds[1]; + } + else { + memcpy((char *)&cb.Const, (char *)&litp->litval, + sizeof(cb.Const)); + cb.vstg = 0; + } + out_const(outfile, &cb); + + nice_printf (outfile, ";\n"); + } /* for */ + if (did_one) + nice_printf (outfile, "\n"); +} /* wr_globals */ + + ftnint +#ifdef KR_headers +commlen(vl) + register chainp vl; +#else +commlen(register chainp vl) +#endif +{ + ftnint size; + int type; + struct Dimblock *t; + Namep v; + + while(vl->nextp) + vl = vl->nextp; + v = (Namep)vl->datap; + type = v->vtype; + if (type == TYCHAR) + size = v->vleng->constblock.Const.ci; + else + size = typesize[type]; + if ((t = v->vdim) && ISCONST(t->nelt)) + size *= t->nelt->constblock.Const.ci; + return size + v->voffset; + } + + static void /* Pad common block if an EQUIVALENCE extended it. */ +#ifdef KR_headers +pad_common(c) + Extsym *c; +#else +pad_common(Extsym *c) +#endif +{ + register chainp cvl; + register Namep v; + long L = c->maxleng; + int type; + struct Dimblock *t; + int szshort = typesize[TYSHORT]; + + for(cvl = c->allextp; cvl; cvl = cvl->nextp) + if (commlen((chainp)cvl->datap) >= L) + return; + v = ALLOC(Nameblock); + v->vtype = type = L % szshort ? TYCHAR + : type_choice[L/szshort % 4]; + v->vstg = STGCOMMON; + v->vclass = CLVAR; + v->tag = TNAME; + v->vdim = t = ALLOC(Dimblock); + t->ndim = 1; + t->dims[0].dimsize = ICON(L / typesize[type]); + v->fvarname = v->cvarname = "eqv_pad"; + if (type == TYCHAR) + v->vleng = ICON(1); + c->allextp = mkchain((char *)mkchain((char *)v, CHNULL), c->allextp); + } + + +/* wr_common_decls -- outputs the common declarations in one of three + formats. If all references to a common block look the same (field + names and types agree), only one actual declaration will appear. + Otherwise, the same block will require many structs. If there is no + block data, these structs will be union'ed together (so the linker + knows the size of the largest one). If there IS a block data, only + that version will be associated with the variable, others will only be + defined as types, so the pointer can be cast to it. e.g. + + FORTRAN C +---------------------------------------------------------------------- + common /com1/ a, b, c struct { real a, b, c; } com1_; + + common /com1/ a, b, c union { + common /com1/ i, j, k struct { real a, b, c; } _1; + struct { integer i, j, k; } _2; + } com1_; + + common /com1/ a, b, c struct com1_1_ { real a, b, c; }; + block data struct { integer i, j, k; } com1_ = + common /com1/ i, j, k { 1, 2, 3 }; + data i/1/, j/2/, k/3/ + + + All of these versions will be followed by #defines, since the code in + the function bodies can't know ahead of time which of these options + will be taken */ + +/* Macros for deciding the output type */ + +#define ONE_STRUCT 1 +#define UNION_STRUCT 2 +#define INIT_STRUCT 3 + + void +#ifdef KR_headers +wr_common_decls(outfile) + FILE *outfile; +#else +wr_common_decls(FILE *outfile) +#endif +{ + Extsym *ext; + extern int extcomm; + static char *Extern[4] = {"", "Extern ", "extern "}; + char *E, *E0 = Extern[extcomm]; + int did_one = 0; + + for (ext = extsymtab; ext < nextext; ext++) { + if (ext -> extstg == STGCOMMON && ext->allextp) { + chainp comm; + int count = 1; + int which; /* which display to use; + ONE_STRUCT, UNION or INIT */ + + if (!did_one) + nice_printf (outfile, "/* Common Block Declarations */\n\n"); + + pad_common(ext); + +/* Construct the proper, condensed list of structs; eliminate duplicates + from the initial list ext -> allextp */ + + comm = ext->allextp = revchain(ext->allextp); + + if (ext -> extinit) + which = INIT_STRUCT; + else if (comm->nextp) { + which = UNION_STRUCT; + nice_printf (outfile, "%sunion {\n", E0); + next_tab (outfile); + E = ""; + } + else { + which = ONE_STRUCT; + E = E0; + } + + for (; comm; comm = comm -> nextp, count++) { + + if (which == INIT_STRUCT) + nice_printf (outfile, "struct %s%d_ {\n", + ext->cextname, count); + else + nice_printf (outfile, "%sstruct {\n", E); + + next_tab (c_file); + + wr_struct (outfile, (chainp) comm -> datap); + + prev_tab (c_file); + if (which == UNION_STRUCT) + nice_printf (outfile, "} _%d;\n", count); + else if (which == ONE_STRUCT) + nice_printf (outfile, "} %s;\n", ext->cextname); + else + nice_printf (outfile, "};\n"); + } /* for */ + + if (which == UNION_STRUCT) { + prev_tab (c_file); + nice_printf (outfile, "} %s;\n", ext->cextname); + } /* if */ + did_one = 1; + nice_printf (outfile, "\n"); + + for (count = 1, comm = ext -> allextp; comm; + comm = comm -> nextp, count++) { + def_start(outfile, ext->cextname, + comm_union_name(count), ""); + switch (which) { + case ONE_STRUCT: + extern_out (outfile, ext); + break; + case UNION_STRUCT: + nice_printf (outfile, "("); + extern_out (outfile, ext); + nice_printf(outfile, "._%d)", count); + break; + case INIT_STRUCT: + nice_printf (outfile, "(*(struct "); + extern_out (outfile, ext); + nice_printf (outfile, "%d_ *) &", count); + extern_out (outfile, ext); + nice_printf (outfile, ")"); + break; + } /* switch */ + nice_printf (outfile, "\n"); + } /* for count = 1, comm = ext -> allextp */ + nice_printf (outfile, "\n"); + } /* if ext -> extstg == STGCOMMON */ + } /* for ext = extsymtab */ +} /* wr_common_decls */ + + void +#ifdef KR_headers +wr_struct(outfile, var_list) + FILE *outfile; + chainp var_list; +#else +wr_struct(FILE *outfile, chainp var_list) +#endif +{ + int last_type = -1; + int did_one = 0; + chainp this_var; + + for (this_var = var_list; this_var; this_var = this_var -> nextp) { + Namep var = (Namep) this_var -> datap; + int type; + char *comment = NULL; + + if (var == (Namep) NULL) + err ("wr_struct: null variable"); + else if (var -> tag != TNAME) + erri ("wr_struct: bad tag on variable '%d'", + var -> tag); + + type = var -> vtype; + + if (last_type == type && did_one) + nice_printf (outfile, ", "); + else { + if (did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "%s ", + c_type_decl (type, var -> vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for parameters + with unknown length and functions returning character */ + + if (var -> vtype == TYCHAR && (!ISICON ((var -> vleng)) + || var -> vclass == CLPROC)) + nice_printf (outfile, "*"); + + var -> vstg = STGAUTO; + out_name (outfile, var); + if (var -> vclass == CLPROC) + nice_printf (outfile, "()"); + else if (var -> vdim) + comment = wr_ardecls(outfile, var->vdim, + var->vtype == TYCHAR && ISICON(var->vleng) + ? var->vleng->constblock.Const.ci : 1L); + else if (var -> vtype == TYCHAR && var -> vclass != CLPROC && + ISICON ((var -> vleng))) + nice_printf (outfile, "[%ld]", + var -> vleng -> constblock.Const.ci); + + if (comment) + nice_printf (outfile, "%s", comment); + did_one = 1; + last_type = type; + } /* for this_var */ + + if (did_one) + nice_printf (outfile, ";\n"); +} /* wr_struct */ + + + char * +#ifdef KR_headers +user_label(stateno) + ftnint stateno; +#else +user_label(ftnint stateno) +#endif +{ + static char buf[USER_LABEL_MAX + 1]; + static char *Lfmt[2] = { "L_%ld", "L%ld" }; + + if (stateno >= 0) + sprintf(buf, Lfmt[shiftcase], stateno); + else + sprintf(buf, "L_%s", extsymtab[-1-stateno].fextname); + return buf; +} /* user_label */ + + + char * +#ifdef KR_headers +temp_name(starter, num, storage) + char *starter; + int num; + char *storage; +#else +temp_name(char *starter, int num, char *storage) +#endif +{ + static char buf[IDENT_LEN]; + char *pointer = buf; + char *prefix = "t"; + + if (storage) + pointer = storage; + + if (starter && *starter) + prefix = starter; + + sprintf (pointer, "%s__%d", prefix, num); + return pointer; +} /* temp_name */ + + + char * +#ifdef KR_headers +equiv_name(memno, store) + int memno; + char *store; +#else +equiv_name(int memno, char *store) +#endif +{ + static char buf[IDENT_LEN]; + char *pointer = buf; + + if (store) + pointer = store; + + sprintf (pointer, "%s_%d", EQUIV_INIT_NAME, memno); + return pointer; +} /* equiv_name */ + + void +#ifdef KR_headers +def_commons(of) + FILE *of; +#else +def_commons(FILE *of) +#endif +{ + Extsym *ext; + int c, onefile, Union; + chainp comm; + extern int ext1comm; + FILE *c_filesave = c_file; + + if (ext1comm == 1) { + onefile = 1; + c_file = of; + fprintf(of, "/*>>>'/dev/null'<<<*/\n\ +#ifdef Define_COMMONs\n\ +/*<<>>*/\n"); + } + else + onefile = 0; + for(ext = extsymtab; ext < nextext; ext++) + if (ext->extstg == STGCOMMON + && !ext->extinit && (comm = ext->allextp)) { + sprintf(outbtail, "%scom.c", ext->cextname); + if (onefile) + fprintf(of, "/*>>>'%s'<<<*/\n", + outbtail); + else { + c_file = of = fopen(outbuf,textwrite); + if (!of) + fatalstr("can't open %s", outbuf); + } + fprintf(of, "#include \"f2c.h\"\n"); + if (Ansi == 2) + fprintf(of, + "\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); + if (comm->nextp) { + Union = 1; + nice_printf(of, "union {\n"); + next_tab(of); + } + else + Union = 0; + for(c = 1; comm; comm = comm->nextp) { + nice_printf(of, "struct {\n"); + next_tab(of); + wr_struct(of, (chainp)comm->datap); + prev_tab(of); + if (Union) + nice_printf(of, "} _%d;\n", c++); + } + if (Union) + prev_tab(of); + nice_printf(of, "} %s;\n", ext->cextname); + if (Ansi == 2) + fprintf(of, + "\n#ifdef __cplusplus\n}\n#endif\n"); + if (onefile) + fprintf(of, "/*<<<%s>>>*/\n", outbtail); + else + fclose(of); + } + if (onefile) + fprintf(of, "/*>>>'/dev/null'<<<*/\n#endif\n\ +/*<<>>*/\n"); + c_file = c_filesave; + } + +/* C Language keywords. Needed to filter unwanted fortran identifiers like + * "int", etc. Source: Kernighan & Ritchie, eds. 1 and 2; Stroustrup. + * Also includes C++ keywords and types used for I/O in f2c.h . + * These keywords must be in alphabetical order (as defined by strcmp()). + */ + +char *c_keywords[] = { + "Long", "Multitype", "Namelist", "Vardesc", "abs", "acos", + "addr", "address", "aerr", "alist", "asin", "asm", "atan", + "atan2", "aunit", "auto", "break", "c", "case", "catch", "cdecl", + "cerr", "char", "ciend", "cierr", "cifmt", "cilist", "cirec", + "ciunit", "class", "cllist", "complex", "const", "continue", "cos", + "cosh", "csta", "cunit", "d", "dabs", "default", "defined", + "delete", "dims", "dmax", "dmin", "do", "double", + "doublecomplex", "doublereal", "else", "entry", "enum", "exp", + "extern", "false", "far", "flag", "float", "for", "friend", + "ftnint", "ftnlen", "goto", "h", "huge", "i", "iciend", "icierr", + "icifmt", "icilist", "icirlen", "icirnum", "iciunit", "if", + "inacc", "inacclen", "inblank", "inblanklen", "include", + "indir", "indirlen", "inerr", "inex", "infile", "infilen", + "infmt", "infmtlen", "inform", "informlen", "inline", "inlist", + "inname", "innamed", "innamlen", "innrec", "innum", "inopen", + "inrecl", "inseq", "inseqlen", "int", "integer", "integer1", + "inunf", "inunflen", "inunit", "log", "logical", "logical1", + "long", "longint", "max", "min", "name", "near", "new", "nvars", + "oacc", "oblnk", "oerr", "ofm", "ofnm", "ofnmlen", "olist", + "operator", "orl", "osta", "ounit", "overload", "private", + "protected", "public", "r", "real", "register", "return", + "short", "shortint", "shortlogical", "signed", "sin", "sinh", + "sizeof", "sqrt", "static", "struct", "switch", "tan", "tanh", + "template", "this", "true", "try", "type", "typedef", "uinteger", + "ulongint", "union", "unsigned", "vars", "virtual", "void", + "volatile", "while", "z" + }; /* c_keywords */ + +int n_keywords = sizeof(c_keywords)/sizeof(char *); diff --git a/tools/connec/src/names.h b/tools/connec/src/names.h new file mode 100644 index 0000000..16bcc0b --- /dev/null +++ b/tools/connec/src/names.h @@ -0,0 +1,19 @@ +#define CONST_IDENT_MAX 30 +#define IO_IDENT_MAX 30 +#define ARGUMENT_MAX 30 +#define USER_LABEL_MAX 30 + +#define EQUIV_INIT_NAME "equiv" + +#define write_nv_ident(fp,a) wr_nv_ident_help ((fp), (struct Addrblock *) (a)) +#define nv_type(x) nv_type_help ((struct Addrblock *) x) + +extern char *c_keywords[]; + +char* c_type_decl Argdcl((int, int)); +void declare_new_addr Argdcl((Addrp)); +char* new_arg_length Argdcl((Namep)); +char* new_func_length Argdcl((void)); +int nv_type_help Argdcl((Addrp)); +char* temp_name Argdcl((char*, int, char*)); +char* user_label Argdcl((long int)); diff --git a/tools/connec/src/names.o b/tools/connec/src/names.o new file mode 100644 index 0000000000000000000000000000000000000000..8cc47f163b0f224d2ccef750d0508ce4eb3c8ac4 GIT binary patch literal 29208 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 end) + return; + } + while(*start == '\n'); + + ind = indent <= MAX_INDENT + ? indent + : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT); + + tab = ind + extra_indent; + + while (tab > 7) { + putc ('\t', fp); + tab -= 8; + } /* while */ + + while (tab-- > 0) + putc (' ', fp); + } /* if last_was_newline */ + + while (start <= end) + putc (*start++, fp); +} /* write_indent */ + +#ifdef KR_headers +/*VARARGS2*/ + void + margin_printf (fp, a, b, c, d, e, f, g) + FILE *fp; + char *a; + long b, c, d, e, f, g; +{ + ind_printf (0, fp, a, b, c, d, e, f, g); +} /* margin_printf */ + +/*VARARGS2*/ + void + nice_printf (fp, a, b, c, d, e, f, g) + FILE *fp; + char *a; + long b, c, d, e, f, g; +{ + ind_printf (1, fp, a, b, c, d, e, f, g); +} /* nice_printf */ +#define SPRINTF(x,a,b,c,d,e,f,g) sprintf(x,a,b,c,d,e,f,g) + +#else /* if (!defined(KR_HEADERS)) */ + +#define SPRINTF(x,a,b,c,d,e,f,g) vsprintf(x,a,ap) + + void + margin_printf(FILE *fp, const char *fmt, ...) +{ + va_list ap; + va_start(ap,fmt); + ind_printf(0, fp, fmt, ap); + va_end(ap); + } + + void + nice_printf(FILE *fp, const char *fmt, ...) +{ + va_list ap; + va_start(ap,fmt); + ind_printf(1, fp, fmt, ap); + va_end(ap); + } +#endif + +#define max_line_len c_output_line_length + /* 74Number of characters allowed on an output + line. This assumes newlines are handled + nicely, i.e. a newline after a full text + line on a terminal is ignored */ + +/* output_buf holds the text of the next line to be printed. It gets + flushed when a newline is printed. next_slot points to the next + available location in the output buffer, i.e. where the next call to + nice_printf will have its output stored */ + +static char *output_buf; +static char *next_slot; +static char *string_start; + +static char *word_start = NULL; +static int cursor_pos = 0; +static int In_string = 0; + + void +np_init(Void) +{ + next_slot = output_buf = Alloc(MAX_OUTPUT_SIZE); + memset(output_buf, 0, MAX_OUTPUT_SIZE); + } + + static char * +#ifdef KR_headers +adjust_pointer_in_string(pointer) + register char *pointer; +#else +adjust_pointer_in_string(register char *pointer) +#endif +{ + register char *s, *s1, *se, *s0; + + /* arrange not to break \002 */ + s1 = string_start ? string_start : output_buf; + for(s = s1; s < pointer; s++) { + s0 = s1; + s1 = s; + if (*s == '\\') { + se = s++ + 4; + if (se > pointer) + break; + if (*s < '0' || *s > '7') + continue; + while(++s < se) + if (*s < '0' || *s > '7') + break; + --s; + } + } + return s0 - 1; + } + +/* ANSI says strcpy's behavior is undefined for overlapping args, + * so we roll our own fwd_strcpy: */ + + static void +#ifdef KR_headers +fwd_strcpy(t, s) + register char *t; + register char *s; +#else +fwd_strcpy(register char *t, register char *s) +#endif +{ while(*t++ = *s++); } + +/* isident -- true iff character could belong to a unit. C allows + letters, numbers and underscores in identifiers. This also doubles as + a check for numeric constants, since we include the decimal point and + minus sign. The minus has to be here, since the constant "10e-2" + cannot be broken up. The '.' also prevents structure references from + being broken, which is a quite acceptable side effect */ + +#define isident(x) (Tr[x] & 1) +#define isntident(x) (!Tr[x]) + + static void +#ifdef KR_headers + ind_printf (use_indent, fp, a, b, c, d, e, f, g) + int use_indent; + FILE *fp; + char *a; + long b, c, d, e, f, g; +#else + ind_printf (int use_indent, FILE *fp, const char *a, va_list ap) +#endif +{ + extern int max_line_len; + extern FILEP c_file; + extern char tr_tab[]; /* in output.c */ + register char *Tr = tr_tab; + int ch, cmax, inc, ind; + static int extra_indent, last_indent, set_cursor = 1; + + cursor_pos += indent - last_indent; + last_indent = indent; + SPRINTF (next_slot, a, b, c, d, e, f, g); + + if (fp != c_file) { + fprintf (fp,"%s", next_slot); + return; + } /* if fp != c_file */ + + do { + char *pointer; + +/* The for loop will parse one output line */ + + if (set_cursor) { + ind = indent <= MAX_INDENT + ? indent + : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT); + cursor_pos = extra_indent; + if (use_indent) + cursor_pos += ind; + set_cursor = 0; + } + if (in_comment) { + cmax = max_line_len + 32; /* let comments be wider */ + for (pointer = next_slot; *pointer && *pointer != '\n' && + cursor_pos <= cmax; pointer++) + cursor_pos++; + } + else + for (pointer = next_slot; *pointer && *pointer != '\n' && + cursor_pos <= max_line_len; pointer++) { + + /* Update state variables here */ + + if (In_string) { + switch(*pointer) { + case '\\': + if (++cursor_pos > max_line_len) { + cursor_pos -= 2; + --pointer; + goto overflow; + } + ++pointer; + break; + case '"': + In_string = 0; + word_start = 0; + } + } + else switch (*pointer) { + case '"': + if (cursor_pos + 5 > max_line_len) { + word_start = 0; + --pointer; + goto overflow; + } + In_string = 1; + string_start = word_start = pointer; + break; + case '\'': + if (pointer[1] == '\\') + if ((ch = pointer[2]) >= '0' && ch <= '7') + for(inc = 3; pointer[inc] != '\'' + && ++inc < 5;); + else + inc = 3; + else + inc = 2; + /*debug*/ if (pointer[inc] != '\'') + /*debug*/ fatalstr("Bad character constant %.10s", + pointer); + if ((cursor_pos += inc) > max_line_len) { + cursor_pos -= inc; + word_start = 0; + --pointer; + goto overflow; + } + word_start = pointer; + pointer += inc; + break; + case '\t': + cursor_pos = 8 * ((cursor_pos + 8) / 8) - 1; + break; + default: { + +/* HACK Assumes that all characters in an atomic C token will be written + at the same time. Must check for tokens first, since '-' is considered + part of an identifier; checking isident first would mean breaking up "->" */ + + if (word_start) { + if (isntident(*(unsigned char *)pointer)) + word_start = NULL; + } + else if (isident(*(unsigned char *)pointer)) + word_start = pointer; + break; + } /* default */ + } /* switch */ + cursor_pos++; + } /* for pointer = next_slot */ + overflow: + if (*pointer == '\0') { + +/* The output line is not complete, so break out and don't output + anything. The current line fragment will be stored in the buffer */ + + next_slot = pointer; + break; + } else { + char last_char; + int in_string0 = In_string; + +/* If the line was too long, move pointer back to the character before + the current word. This allows line breaking on word boundaries. Make + sure that 80 character comment lines get broken up somehow. We assume + that any non-string 80 character identifier must be in a comment. +*/ + + if (*pointer == '\n') + in_define = 0; + else if (word_start && word_start > output_buf) + if (In_string) + if (string_start && pointer - string_start < 5) + pointer = string_start - 1; + else { + pointer = adjust_pointer_in_string(pointer); + string_start = 0; + } + else if (word_start == string_start + && pointer - string_start >= 5) { + pointer = adjust_pointer_in_string(next_slot); + In_string = 1; + string_start = 0; + } + else + pointer = word_start - 1; + else if (cursor_pos > max_line_len) { +#ifndef ANSI_Libraries + extern char *strchr(); +#endif + if (In_string) { + pointer = adjust_pointer_in_string(pointer); + if (string_start && pointer > string_start) + string_start = 0; + } + else if (strchr("&*+-/<=>|", *pointer) + && strchr("!%&*+-/<=>^|", pointer[-1])) { + pointer -= 2; + if (strchr("<>", *pointer)) /* <<=, >>= */ + pointer--; + } + else { + if (word_start) + while(isident(*(unsigned char *)pointer)) + pointer++; + pointer--; + } + } + last_char = *pointer; + write_indent(fp, use_indent, extra_indent, output_buf, pointer); + next_slot = output_buf; + if (In_string && !string_start && Ansi == 1 && last_char != '\n') + *next_slot++ = '"'; + fwd_strcpy(next_slot, pointer + 1); + +/* insert a line break */ + + if (last_char == '\n') { + if (In_string) + last_was_newline = 0; + else { + last_was_newline = 1; + extra_indent = 0; + sharp_line = gflag1; + } + } + else { + extra_indent = TOO_LONG_INDENT; + if (In_string && !string_start) { + if (Ansi == 1) { + fprintf(fp, gflag1 ? "\"\\\n" : "\"\n"); + use_indent = 1; + last_was_newline = 1; + } + else { + fprintf(fp, "\\\n"); + last_was_newline = 0; + } + In_string = in_string0; + } + else { + if (in_define/* | gflag1*/) + putc('\\', fp); + putc ('\n', fp); + last_was_newline = 1; + } + } /* if *pointer != '\n' */ + + if (In_string && Ansi != 1 && !string_start) + cursor_pos = 0; + else + set_cursor = 1; + + string_start = word_start = NULL; + + } /* else */ + + } while (*next_slot); + +} /* ind_printf */ diff --git a/tools/connec/src/niceprintf.h b/tools/connec/src/niceprintf.h new file mode 100644 index 0000000..24c65d4 --- /dev/null +++ b/tools/connec/src/niceprintf.h @@ -0,0 +1,16 @@ +/* niceprintf.h -- contains constants and macros from the output filter + for the generated C code. We use macros for increased speed, less + function overhead. */ + +#define MAX_OUTPUT_SIZE 6000 /* Number of chars on one output line PLUS + the length of the longest string + printed using nice_printf */ + + + +#define next_tab(fp) (indent += tab_size) + +#define prev_tab(fp) (indent -= tab_size) + + + diff --git a/tools/connec/src/niceprintf.o b/tools/connec/src/niceprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..4e00bca0fd95cd804925778bf1452d9444a932a7 GIT binary patch literal 9224 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/output.c b/tools/connec/src/output.c new file mode 100644 index 0000000..91d8f18 --- /dev/null +++ b/tools/connec/src/output.c @@ -0,0 +1,1753 @@ +/**************************************************************** +Copyright 1990-1996, 2000-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" +#include "output.h" + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + +char _assoc_table[] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; + +/* Opcode table -- This array is indexed by the OP_____ macros defined in + defines.h; these macros are expected to be adjacent integers, so that + this table is as small as possible. */ + +table_entry opcode_table[] = { + { 0, 0, NULL }, + /* OPPLUS 1 */ { BINARY_OP, 12, "%l + %r" }, + /* OPMINUS 2 */ { BINARY_OP, 12, "%l - %r" }, + /* OPSTAR 3 */ { BINARY_OP, 13, "%l * %r" }, + /* OPSLASH 4 */ { BINARY_OP, 13, "%l / %r" }, + /* OPPOWER 5 */ { BINARY_OP, 0, "power (%l, %r)" }, + /* OPNEG 6 */ { UNARY_OP, 14, "-%l" }, + /* OPOR 7 */ { BINARY_OP, 4, "%l || %r" }, + /* OPAND 8 */ { BINARY_OP, 5, "%l && %r" }, + /* OPEQV 9 */ { BINARY_OP, 9, "%l == %r" }, + /* OPNEQV 10 */ { BINARY_OP, 9, "%l != %r" }, + /* OPNOT 11 */ { UNARY_OP, 14, "! %l" }, + /* OPCONCAT 12 */ { BINARY_OP, 0, "concat (%l, %r)" }, + /* OPLT 13 */ { BINARY_OP, 10, "%l < %r" }, + /* OPEQ 14 */ { BINARY_OP, 9, "%l == %r" }, + /* OPGT 15 */ { BINARY_OP, 10, "%l > %r" }, + /* OPLE 16 */ { BINARY_OP, 10, "%l <= %r" }, + /* OPNE 17 */ { BINARY_OP, 9, "%l != %r" }, + /* OPGE 18 */ { BINARY_OP, 10, "%l >= %r" }, + /* OPCALL 19 */ { BINARY_OP, 15, SPECIAL_FMT }, + /* OPCCALL 20 */ { BINARY_OP, 15, SPECIAL_FMT }, + +/* Left hand side of an assignment cannot have outermost parens */ + + /* OPASSIGN 21 */ { BINARY_OP, 2, "%l = %r" }, + /* OPPLUSEQ 22 */ { BINARY_OP, 2, "%l += %r" }, + /* OPSTAREQ 23 */ { BINARY_OP, 2, "%l *= %r" }, + /* OPCONV 24 */ { BINARY_OP, 14, "%l" }, + /* OPLSHIFT 25 */ { BINARY_OP, 11, "%l << %r" }, + /* OPMOD 26 */ { BINARY_OP, 13, "%l %% %r" }, + /* OPCOMMA 27 */ { BINARY_OP, 1, "%l, %r" }, + +/* Don't want to nest the colon operator in parens */ + + /* OPQUEST 28 */ { BINARY_OP, 3, "%l ? %r" }, + /* OPCOLON 29 */ { BINARY_OP, 3, "%l : %r" }, + /* OPABS 30 */ { UNARY_OP, 0, "abs(%l)" }, + /* OPMIN 31 */ { BINARY_OP, 0, SPECIAL_FMT }, + /* OPMAX 32 */ { BINARY_OP, 0, SPECIAL_FMT }, + /* OPADDR 33 */ { UNARY_OP, 14, "&%l" }, + + /* OPCOMMA_ARG 34 */ { BINARY_OP, 15, SPECIAL_FMT }, + /* OPBITOR 35 */ { BINARY_OP, 6, "%l | %r" }, + /* OPBITAND 36 */ { BINARY_OP, 8, "%l & %r" }, + /* OPBITXOR 37 */ { BINARY_OP, 7, "%l ^ %r" }, + /* OPBITNOT 38 */ { UNARY_OP, 14, "~ %l" }, + /* OPRSHIFT 39 */ { BINARY_OP, 11, "%l >> %r" }, + +/* This isn't quite right -- it doesn't handle arrays, for instance */ + + /* OPWHATSIN 40 */ { UNARY_OP, 14, "*%l" }, + /* OPMINUSEQ 41 */ { BINARY_OP, 2, "%l -= %r" }, + /* OPSLASHEQ 42 */ { BINARY_OP, 2, "%l /= %r" }, + /* OPMODEQ 43 */ { BINARY_OP, 2, "%l %%= %r" }, + /* OPLSHIFTEQ 44 */ { BINARY_OP, 2, "%l <<= %r" }, + /* OPRSHIFTEQ 45 */ { BINARY_OP, 2, "%l >>= %r" }, + /* OPBITANDEQ 46 */ { BINARY_OP, 2, "%l &= %r" }, + /* OPBITXOREQ 47 */ { BINARY_OP, 2, "%l ^= %r" }, + /* OPBITOREQ 48 */ { BINARY_OP, 2, "%l |= %r" }, + /* OPPREINC 49 */ { UNARY_OP, 14, "++%l" }, + /* OPPREDEC 50 */ { UNARY_OP, 14, "--%l" }, + /* OPDOT 51 */ { BINARY_OP, 15, "%l.%r" }, + /* OPARROW 52 */ { BINARY_OP, 15, "%l -> %r"}, + /* OPNEG1 53 */ { UNARY_OP, 14, "-%l" }, + /* OPDMIN 54 */ { BINARY_OP, 0, "dmin(%l,%r)" }, + /* OPDMAX 55 */ { BINARY_OP, 0, "dmax(%l,%r)" }, + /* OPASSIGNI 56 */ { BINARY_OP, 2, "%l = &%r" }, + /* OPIDENTITY 57 */ { UNARY_OP, 15, "%l" }, + /* OPCHARCAST 58 */ { UNARY_OP, 14, "(char *)&%l" }, + /* OPDABS 59 */ { UNARY_OP, 0, "dabs(%l)" }, + /* OPMIN2 60 */ { BINARY_OP, 0, "min(%l,%r)" }, + /* OPMAX2 61 */ { BINARY_OP, 0, "max(%l,%r)" }, + /* OPBITTEST 62 */ { BINARY_OP, 0, "bit_test(%l,%r)" }, + /* OPBITCLR 63 */ { BINARY_OP, 0, "bit_clear(%l,%r)" }, + /* OPBITSET 64 */ { BINARY_OP, 0, "bit_set(%l,%r)" }, +#ifdef TYQUAD + /* OPQBITCLR 65 */ { BINARY_OP, 0, "qbit_clear(%l,%r)" }, + /* OPQBITSET 66 */ { BINARY_OP, 0, "qbit_set(%l,%r)" }, +#endif + +/* kludge to imitate (under forcedouble) f77's bizarre treatement of OPNEG... */ + + /* OPNEG KLUDGE */ { UNARY_OP, 14, "-(doublereal)%l" } +}; /* opcode_table */ + +#define OPNEG_KLUDGE (sizeof(opcode_table)/sizeof(table_entry) - 1) + +extern int dneg, trapuv; +static char opeqable[sizeof(opcode_table)/sizeof(table_entry)]; + + +static void output_arg_list Argdcl((FILEP, struct Listblock*)); +static void output_binary Argdcl((FILEP, Exprp)); +static void output_list Argdcl((FILEP, struct Listblock*)); +static void output_literal Argdcl((FILEP, long, Constp)); +static void output_prim Argdcl((FILEP, struct Primblock*)); +static void output_unary Argdcl((FILEP, Exprp)); + + + void +#ifdef KR_headers +expr_out(fp, e) + FILE *fp; + expptr e; +#else +expr_out(FILE *fp, expptr e) +#endif +{ + Namep var; + expptr leftp, rightp; + int opcode; + + if (e == (expptr) NULL) + return; + + switch (e -> tag) { + case TNAME: out_name (fp, (struct Nameblock *) e); + return; + + case TCONST: out_const(fp, &e->constblock); + goto end_out; + case TEXPR: + break; + + case TADDR: out_addr (fp, &(e -> addrblock)); + goto end_out; + + case TPRIM: if (!nerr) + warn ("expr_out: got TPRIM"); + output_prim (fp, &(e -> primblock)); + return; + + case TLIST: output_list (fp, &(e -> listblock)); + end_out: frexpr(e); + return; + + case TIMPLDO: err ("expr_out: got TIMPLDO"); + return; + + case TERROR: + default: + erri ("expr_out: bad tag '%d'", e -> tag); + } /* switch */ + +/* Now we know that the tag is TEXPR */ + +/* Optimize on simple expressions, such as "a = a + b" ==> "a += b" */ + + if (e -> exprblock.opcode == OPASSIGN && e -> exprblock.rightp) + switch(e->exprblock.rightp->tag) { + case TEXPR: + opcode = e -> exprblock.rightp -> exprblock.opcode; + + if (opeqable[opcode]) { + if ((leftp = e -> exprblock.leftp) && + (rightp = e -> exprblock.rightp -> exprblock.leftp)) { + + if (same_ident (leftp, rightp)) { + expptr temp = e -> exprblock.rightp; + + e -> exprblock.opcode = op_assign(opcode); + + e -> exprblock.rightp = temp -> exprblock.rightp; + temp->exprblock.rightp = 0; + frexpr(temp); + } /* if same_ident (leftp, rightp) */ + } /* if leftp && rightp */ + } /* if opcode == OPPLUS || */ + break; + + case TNAME: + if (trapuv) { + var = &e->exprblock.rightp->nameblock; + if (ISREAL(var->vtype) + && var->vclass == CLVAR + && ONEOF(var->vstg, M(STGAUTO)|M(STGBSS)) + && !var->vsave) { + expr_out(fp, e -> exprblock.leftp); + nice_printf(fp, " = _0 + "); + expr_out(fp, e->exprblock.rightp); + goto done; + } + } + } /* if e -> exprblock.opcode == OPASSIGN */ + + +/* Optimize on increment or decrement by 1 */ + + { + opcode = e -> exprblock.opcode; + leftp = e -> exprblock.leftp; + rightp = e -> exprblock.rightp; + + if (leftp && rightp && (leftp -> headblock.vstg == STGARG || + ISINT (leftp -> headblock.vtype)) && + (opcode == OPPLUSEQ || opcode == OPMINUSEQ) && + ISINT (rightp -> headblock.vtype) && + ISICON (e -> exprblock.rightp) && + (ISONE (e -> exprblock.rightp) || + e -> exprblock.rightp -> constblock.Const.ci == -1)) { + +/* Allow for the '-1' constant value */ + + if (!ISONE (e -> exprblock.rightp)) + opcode = (opcode == OPPLUSEQ) ? OPMINUSEQ : OPPLUSEQ; + +/* replace the existing opcode */ + + if (opcode == OPPLUSEQ) + e -> exprblock.opcode = OPPREINC; + else + e -> exprblock.opcode = OPPREDEC; + +/* Free up storage used by the right hand side */ + + frexpr (e -> exprblock.rightp); + e->exprblock.rightp = 0; + } /* if opcode == OPPLUS */ + } /* block */ + + + if (is_unary_op (e -> exprblock.opcode)) + output_unary (fp, &(e -> exprblock)); + else if (is_binary_op (e -> exprblock.opcode)) + output_binary (fp, &(e -> exprblock)); + else + erri ("expr_out: bad opcode '%d'", (int) e -> exprblock.opcode); + + done: + free((char *)e); + +} /* expr_out */ + + + void +#ifdef KR_headers +out_and_free_statement(outfile, expr) + FILE *outfile; + expptr expr; +#else +out_and_free_statement(FILE *outfile, expptr expr) +#endif +{ + if (expr) + expr_out (outfile, expr); + + nice_printf (outfile, ";\n"); +} /* out_and_free_statement */ + + + + int +#ifdef KR_headers +same_ident(left, right) + expptr left; + expptr right; +#else +same_ident(expptr left, expptr right) +#endif +{ + if (!left || !right) + return 0; + + if (left -> tag == TNAME && right -> tag == TNAME && left == right) + return 1; + + if (left -> tag == TADDR && right -> tag == TADDR && + left -> addrblock.uname_tag == right -> addrblock.uname_tag) + switch (left -> addrblock.uname_tag) { + case UNAM_REF: + case UNAM_NAME: + +/* Check for array subscripts */ + + if (left -> addrblock.user.name -> vdim || + right -> addrblock.user.name -> vdim) + if (left -> addrblock.user.name != + right -> addrblock.user.name || + !same_expr (left -> addrblock.memoffset, + right -> addrblock.memoffset)) + return 0; + + return same_ident ((expptr) (left -> addrblock.user.name), + (expptr) right -> addrblock.user.name); + case UNAM_IDENT: + return strcmp(left->addrblock.user.ident, + right->addrblock.user.ident) == 0; + case UNAM_CHARP: + return strcmp(left->addrblock.user.Charp, + right->addrblock.user.Charp) == 0; + default: + return 0; + } /* switch */ + + if (left->tag == TEXPR && left->exprblock.opcode == OPWHATSIN + && right->tag == TEXPR && right->exprblock.opcode == OPWHATSIN) + return same_ident(left->exprblock.leftp, + right->exprblock.leftp); + + return 0; +} /* same_ident */ + + static int +#ifdef KR_headers +samefpconst(c1, c2, n) + register Constp c1; + register Constp c2; + register int n; +#else +samefpconst(register Constp c1, register Constp c2, register int n) +#endif +{ + char *s1, *s2; + if (!c1->vstg && !c2->vstg) + return c1->Const.cd[n] == c2->Const.cd[n]; + s1 = c1->vstg ? c1->Const.cds[n] : dtos(c1->Const.cd[n]); + s2 = c2->vstg ? c2->Const.cds[n] : dtos(c2->Const.cd[n]); + return !strcmp(s1, s2); + } + + static int +#ifdef KR_headers +sameconst(c1, c2) + register Constp c1; + register Constp c2; +#else +sameconst(register Constp c1, register Constp c2) +#endif +{ + switch(c1->vtype) { + case TYCOMPLEX: + case TYDCOMPLEX: + if (!samefpconst(c1,c2,1)) + return 0; + case TYREAL: + case TYDREAL: + return samefpconst(c1,c2,0); + case TYCHAR: + return c1->Const.ccp1.blanks == c2->Const.ccp1.blanks + && c1->vleng->constblock.Const.ci + == c2->vleng->constblock.Const.ci + && !memcmp(c1->Const.ccp, c2->Const.ccp, + (int)c1->vleng->constblock.Const.ci); + case TYSHORT: + case TYINT: + case TYLOGICAL: + return c1->Const.ci == c2->Const.ci; + } + err("unexpected type in sameconst"); + return 0; + } + +/* same_expr -- Returns true only if e1 and e2 match. This is + somewhat pessimistic, but can afford to be because it's just used to + optimize on the assignment operators (+=, -=, etc). */ + + int +#ifdef KR_headers +same_expr(e1, e2) + expptr e1; + expptr e2; +#else +same_expr(expptr e1, expptr e2) +#endif +{ + if (!e1 || !e2) + return !e1 && !e2; + + if (e1 -> tag != e2 -> tag || e1 -> headblock.vtype != e2 -> headblock.vtype) + return 0; + + switch (e1 -> tag) { + case TEXPR: + if (e1 -> exprblock.opcode != e2 -> exprblock.opcode) + return 0; + + return same_expr (e1 -> exprblock.leftp, e2 -> exprblock.leftp) && + same_expr (e1 -> exprblock.rightp, e2 -> exprblock.rightp); + case TNAME: + case TADDR: + return same_ident (e1, e2); + case TCONST: + return sameconst(&e1->constblock, &e2->constblock); + default: + return 0; + } /* switch */ +} /* same_expr */ + + + + void +#ifdef KR_headers +out_name(fp, namep) + FILE *fp; + Namep namep; +#else +out_name(FILE *fp, Namep namep) +#endif +{ + extern int usedefsforcommon; + Extsym *comm; + + if (namep == NULL) + return; + +/* DON'T want to use oneof_stg() here; need to find the right common name + */ + + if (namep->vstg == STGCOMMON && !namep->vcommequiv && !usedefsforcommon) { + comm = &extsymtab[namep->vardesc.varno]; + extern_out(fp, comm); + nice_printf(fp, "%d.", comm->curno); + } /* if namep -> vstg == STGCOMMON */ + + if (namep->vprocclass == PTHISPROC && namep->vtype != TYSUBR) + nice_printf(fp, xretslot[namep->vtype]->user.ident); + else + nice_printf (fp, "%s", namep->cvarname); +} /* out_name */ + + +#define cpd(n) cp->vstg ? cp->Const.cds[n] : dtos(cp->Const.cd[n]) + + void +#ifdef KR_headers +out_const(fp, cp) + FILE *fp; + register Constp cp; +#else +out_const(FILE *fp, register Constp cp) +#endif +{ + static char real_buf[50], imag_buf[50]; + ftnint j; + unsigned int k; + int type = cp->vtype; + + switch (type) { + case TYINT1: + case TYSHORT: + nice_printf (fp, "%ld", cp->Const.ci); /* don't cast ci! */ + break; + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + nice_printf (fp, "%ld", cp->Const.ci); /* don't cast ci! */ + break; +#ifndef NO_LONG_LONG + case TYQUAD: + if (cp->Const.cd[1] == 123.456) + nice_printf (fp, "%s", cp->Const.cds[0]); + else + nice_printf (fp, "%lld", cp->Const.cq); + break; +#endif + case TYREAL: + nice_printf(fp, "%s", flconst(real_buf, cpd(0))); + break; + case TYDREAL: + nice_printf(fp, "%s", cpd(0)); + break; + case TYCOMPLEX: + nice_printf(fp, cm_fmt_string, flconst(real_buf, cpd(0)), + flconst(imag_buf, cpd(1))); + break; + case TYDCOMPLEX: + nice_printf(fp, dcm_fmt_string, cpd(0), cpd(1)); + break; + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + nice_printf (fp, "%s", cp->Const.ci ? "TRUE_" : "FALSE_"); + break; + case TYCHAR: { + char *c = cp->Const.ccp, *ce; + + if (c == NULL) { + nice_printf (fp, "\"\""); + break; + } /* if c == NULL */ + + nice_printf (fp, "\""); + ce = c + cp->vleng->constblock.Const.ci; + while(c < ce) { + k = *(unsigned char *)c++; + nice_printf(fp, str_fmt[k]); + } + for(j = cp->Const.ccp1.blanks; j > 0; j--) + nice_printf(fp, " "); + nice_printf (fp, "\""); + break; + } /* case TYCHAR */ + default: + erri ("out_const: bad type '%d'", (int) type); + break; + } /* switch */ + +} /* out_const */ +#undef cpd + + static void +#ifdef KR_headers +out_args(fp, ep) + FILE *fp; + expptr ep; +#else +out_args(FILE *fp, expptr ep) +#endif +{ + chainp arglist; + + if(ep->tag != TLIST) + badtag("out_args", ep->tag); + for(arglist = ep->listblock.listp;;) { + expr_out(fp, (expptr)arglist->datap); + arglist->datap = 0; + if (!(arglist = arglist->nextp)) + break; + nice_printf(fp, ", "); + } + } + + +/* out_addr -- this routine isn't local because it is called by the + system-generated identifier printing routines */ + + void +#ifdef KR_headers +out_addr(fp, addrp) + FILE *fp; + struct Addrblock *addrp; +#else +out_addr(FILE *fp, struct Addrblock *addrp) +#endif +{ + extern Extsym *extsymtab; + int was_array = 0; + char *s; + + + if (addrp == NULL) + return; + if (doin_setbound + && addrp->vstg == STGARG + && addrp->vtype != TYCHAR + && ISICON(addrp->memoffset) + && !addrp->memoffset->constblock.Const.ci) + nice_printf(fp, "*"); + + switch (addrp -> uname_tag) { + case UNAM_REF: + nice_printf(fp, "%s_%s(", addrp->user.name->cvarname, + addrp->cmplx_sub ? "subscr" : "ref"); + out_args(fp, addrp->memoffset); + nice_printf(fp, ")"); + return; + case UNAM_NAME: + out_name (fp, addrp -> user.name); + break; + case UNAM_IDENT: + if (*(s = addrp->user.ident) == ' ') { + if (multitype) + nice_printf(fp, "%s", + xretslot[addrp->vtype]->user.ident); + else + nice_printf(fp, "%s", s+1); + } + else { + nice_printf(fp, "%s", s); + } + break; + case UNAM_CHARP: + nice_printf(fp, "%s", addrp->user.Charp); + break; + case UNAM_EXTERN: + extern_out (fp, &extsymtab[addrp -> memno]); + break; + case UNAM_CONST: + switch(addrp->vstg) { + case STGCONST: + out_const(fp, (Constp)addrp); + break; + case STGMEMNO: + output_literal (fp, addrp->memno, + (Constp)addrp); + break; + default: + Fatal("unexpected vstg in out_addr"); + } + break; + case UNAM_UNKNOWN: + default: + nice_printf (fp, "Unknown Addrp"); + break; + } /* switch */ + +/* It's okay to just throw in the brackets here because they have a + precedence level of 15, the highest value. */ + + if ((addrp->uname_tag == UNAM_NAME && addrp->user.name->vdim + || addrp->ntempelt > 1 || addrp->isarray) + && addrp->vtype != TYCHAR) { + expptr offset; + + was_array = 1; + + offset = addrp -> memoffset; + addrp->memoffset = 0; + if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && addrp -> uname_tag == UNAM_NAME + && !addrp->skip_offset) + offset = mkexpr (OPMINUS, offset, mkintcon ( + addrp -> user.name -> voffset)); + + nice_printf (fp, "["); + + offset = mkexpr (OPSLASH, offset, + ICON (typesize[addrp -> vtype] * (addrp -> Field ? 2 : 1))); + expr_out (fp, offset); + nice_printf (fp, "]"); + } + +/* Check for structure field reference */ + + if (addrp -> Field && addrp -> uname_tag != UNAM_CONST && + addrp -> uname_tag != UNAM_UNKNOWN) { + if (oneof_stg((addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : + (Namep) NULL), addrp -> vstg, M(STGARG)|M(STGEQUIV)) + && !was_array && (addrp->vclass != CLPROC || !multitype)) + nice_printf (fp, "->%s", addrp -> Field); + else + nice_printf (fp, ".%s", addrp -> Field); + } /* if */ + +/* Check for character subscripting */ + + if (addrp->vtype == TYCHAR && + (addrp->vclass != CLPROC || addrp->uname_tag == UNAM_NAME + && addrp->user.name->vprocclass == PTHISPROC) && + addrp -> memoffset && + (addrp -> uname_tag != UNAM_NAME || + addrp -> user.name -> vtype == TYCHAR) && + (!ISICON (addrp -> memoffset) || + (addrp -> memoffset -> constblock.Const.ci))) { + + int use_paren = 0; + expptr e = addrp -> memoffset; + + if (!e) + return; + addrp->memoffset = 0; + + if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && addrp -> uname_tag == UNAM_NAME) { + e = mkexpr (OPMINUS, e, mkintcon (addrp -> user.name -> voffset)); + +/* mkexpr will simplify it to zero if possible */ + if (e->tag == TCONST && e->constblock.Const.ci == 0) + return; + } /* if addrp -> vstg == STGCOMMON */ + +/* In the worst case, parentheses might be needed OUTSIDE the expression, + too. But since I think this subscripting can only appear as a + parameter in a procedure call, I don't think outside parens will ever + be needed. INSIDE parens are handled below */ + + nice_printf (fp, " + "); + if (e -> tag == TEXPR) { + int arg_prec = op_precedence (e -> exprblock.opcode); + int prec = op_precedence (OPPLUS); + use_paren = arg_prec && (arg_prec < prec || (arg_prec == prec && + is_left_assoc (OPPLUS))); + } /* if e -> tag == TEXPR */ + if (use_paren) nice_printf (fp, "("); + expr_out (fp, e); + if (use_paren) nice_printf (fp, ")"); + } /* if */ +} /* out_addr */ + + + static void +#ifdef KR_headers +output_literal(fp, memno, cp) + FILE *fp; + long memno; + Constp cp; +#else +output_literal(FILE *fp, long memno, Constp cp) +#endif +{ + struct Literal *litp, *lastlit; + + lastlit = litpool + nliterals; + + for (litp = litpool; litp < lastlit; litp++) { + if (litp -> litnum == memno) + break; + } /* for litp */ + + if (litp >= lastlit) + out_const (fp, cp); + else { + nice_printf (fp, "%s", lit_name (litp)); + litp->lituse++; + } +} /* output_literal */ + + + static void +#ifdef KR_headers +output_prim(fp, primp) + FILE *fp; + struct Primblock *primp; +#else +output_prim(FILE *fp, struct Primblock *primp) +#endif +{ + if (primp == NULL) + return; + + out_name (fp, primp -> namep); + if (primp -> argsp) + output_arg_list (fp, primp -> argsp); + + if (primp -> fcharp != (expptr) NULL || primp -> lcharp != (expptr) NULL) + nice_printf (fp, "Sorry, no substrings yet"); +} + + + + static void +#ifdef KR_headers +output_arg_list(fp, listp) + FILE *fp; + struct Listblock *listp; +#else +output_arg_list(FILE *fp, struct Listblock *listp) +#endif +{ + chainp arg_list; + + if (listp == (struct Listblock *) NULL || listp -> listp == (chainp) NULL) + return; + + nice_printf (fp, "("); + + for (arg_list = listp -> listp; arg_list; arg_list = arg_list -> nextp) { + expr_out (fp, (expptr) arg_list -> datap); + if (arg_list -> nextp != (chainp) NULL) + +/* Might want to add a hook in here to accomodate the style setting which + wants spaces after commas */ + + nice_printf (fp, ","); + } /* for arg_list */ + + nice_printf (fp, ")"); +} /* output_arg_list */ + + + + static void +#ifdef KR_headers +output_unary(fp, e) + FILE *fp; + struct Exprblock *e; +#else +output_unary(FILE *fp, struct Exprblock *e) +#endif +{ + if (e == NULL) + return; + + switch (e -> opcode) { + case OPNEG: + if (e->vtype == TYREAL && dneg) { + e->opcode = OPNEG_KLUDGE; + output_binary(fp,e); + e->opcode = OPNEG; + break; + } + case OPNEG1: + case OPNOT: + case OPABS: + case OPBITNOT: + case OPWHATSIN: + case OPPREINC: + case OPPREDEC: + case OPADDR: + case OPIDENTITY: + case OPCHARCAST: + case OPDABS: + output_binary (fp, e); + break; + case OPCALL: + case OPCCALL: + nice_printf (fp, "Sorry, no OPCALL yet"); + break; + default: + erri ("output_unary: bad opcode", (int) e -> opcode); + break; + } /* switch */ +} /* output_unary */ + + + static char * +#ifdef KR_headers +findconst(m) + register long m; +#else +findconst(register long m) +#endif +{ + register struct Literal *litp, *litpe; + + litp = litpool; + for(litpe = litp + nliterals; litp < litpe; litp++) + if (litp->litnum == m) + return litp->cds[0]; + Fatal("findconst failure!"); + return 0; + } + + static int +#ifdef KR_headers +opconv_fudge(fp, e) + FILE *fp; + struct Exprblock *e; +#else +opconv_fudge(FILE *fp, struct Exprblock *e) +#endif +{ + /* special handling for conversions, ichar and character*1 */ + register expptr lp; + register union Expression *Offset; + register char *cp; + int lt; + char buf[8], *s; + unsigned int k; + Namep np; + Addrp ap; + + if (!(lp = e->leftp)) /* possible with erroneous Fortran */ + return 1; + lt = lp->headblock.vtype; + if (lt == TYCHAR) { + switch(lp->tag) { + case TNAME: + nice_printf(fp, "*(unsigned char *)"); + out_name(fp, (Namep)lp); + return 1; + case TCONST: + tconst: + cp = lp->constblock.Const.ccp; + tconst1: + k = *(unsigned char *)cp; + if (k < 128) { /* ASCII character */ + sprintf(buf, chr_fmt[k], k); + nice_printf(fp, "'%s'", buf); + } + else + nice_printf(fp, "%d", k); + return 1; + case TADDR: + switch(lp->addrblock.vstg) { + case STGMEMNO: + if (halign && e->vtype != TYCHAR) { + nice_printf(fp, "*(%s *)", + c_type_decl(e->vtype,0)); + expr_out(fp, lp); + return 1; + } + cp = findconst(lp->addrblock.memno); + goto tconst1; + case STGCONST: + goto tconst; + } + lp->addrblock.vtype = tyint; + Offset = lp->addrblock.memoffset; + switch(lp->addrblock.uname_tag) { + case UNAM_REF: + nice_printf(fp, "*(unsigned char *)"); + return 0; + case UNAM_NAME: + np = lp->addrblock.user.name; + if (ONEOF(np->vstg, + M(STGCOMMON)|M(STGEQUIV))) + Offset = mkexpr(OPMINUS, Offset, + ICON(np->voffset)); + } + lp->addrblock.memoffset = Offset ? + mkexpr(OPSTAR, Offset, + ICON(typesize[tyint])) + : ICON(0); + lp->addrblock.isarray = 1; + /* STGCOMMON or STGEQUIV would cause */ + /* voffset to be added in a second time */ + lp->addrblock.vstg = STGUNKNOWN; + nice_printf(fp, "*(unsigned char *)&"); + return 0; + default: + badtag("opconv_fudge", lp->tag); + } + } + if (lt != e->vtype) { + s = c_type_decl(e->vtype, 0); + if (ISCOMPLEX(lt)) { + tryagain: + np = (Namep)e->leftp; + switch(np->tag) { + case TNAME: + nice_printf(fp, "(%s) %s%sr", s, + np->cvarname, + np->vstg == STGARG ? "->" : "."); + return 1; + case TADDR: + ap = (Addrp)np; + switch(ap->uname_tag) { + case UNAM_IDENT: + nice_printf(fp, "(%s) %s.r", s, + ap->user.ident); + return 1; + case UNAM_NAME: + nice_printf(fp, "(%s) ", s); + out_addr(fp, ap); + nice_printf(fp, ".r"); + return 1; + case UNAM_REF: + nice_printf(fp, "(%s) %s_%s(", + s, ap->user.name->cvarname, + ap->cmplx_sub ? "subscr" : "ref"); + out_args(fp, ap->memoffset); + nice_printf(fp, ").r"); + return 1; + default: + fatali( + "Bad uname_tag %d in opconv_fudge", + ap->uname_tag); + } + case TEXPR: + e = (Exprp)np; + if (e->opcode == OPWHATSIN) + goto tryagain; + default: + fatali("Unexpected tag %d in opconv_fudge", + np->tag); + } + } + nice_printf(fp, "(%s) ", s); + } + return 0; + } + + + static void +#ifdef KR_headers +output_binary(fp, e) + FILE *fp; + struct Exprblock *e; +#else +output_binary(FILE *fp, struct Exprblock *e) +#endif +{ + char *format; + int prec; + + if (e == NULL || e -> tag != TEXPR) + return; + +/* Instead of writing a huge switch, I've incorporated the output format + into a table. Things like "%l" and "%r" stand for the left and + right subexpressions. This should allow both prefix and infix + functions to be specified (e.g. "(%l * %r", "z_div (%l, %r"). Of + course, I should REALLY think out the ramifications of writing out + straight text, as opposed to some intermediate format, which could + figure out and optimize on the the number of required blanks (we don't + want "x - (-y)" to become "x --y", for example). Special cases (such as + incomplete implementations) could still be implemented as part of the + switch, they will just have some dummy value instead of the string + pattern. Another difficulty is the fact that the complex functions + will differ from the integer and real ones */ + +/* Handle a special case. We don't want to output "x + - 4", or "y - - 3" +*/ + if ((e -> opcode == OPPLUS || e -> opcode == OPMINUS) && + e -> rightp && e -> rightp -> tag == TCONST && + isnegative_const (&(e -> rightp -> constblock)) && + is_negatable (&(e -> rightp -> constblock))) { + + e -> opcode = (e -> opcode == OPPLUS) ? OPMINUS : OPPLUS; + negate_const (&(e -> rightp -> constblock)); + } /* if e -> opcode == PLUS or MINUS */ + + prec = op_precedence (e -> opcode); + format = op_format (e -> opcode); + + if (format != SPECIAL_FMT) { + while (*format) { + if (*format == '%') { + int arg_prec, use_paren = 0; + expptr lp, rp; + + switch (*(format + 1)) { + case 'l': + lp = e->leftp; + if (lp && lp->tag == TEXPR) { + arg_prec = op_precedence(lp->exprblock.opcode); + + use_paren = arg_prec && + (arg_prec < prec || (arg_prec == prec && + is_right_assoc (prec))); + } /* if e -> leftp */ + if (e->opcode == OPCONV && opconv_fudge(fp,e)) + break; + if (use_paren) + nice_printf (fp, "("); + expr_out(fp, lp); + if (use_paren) + nice_printf (fp, ")"); + break; + case 'r': + rp = e->rightp; + if (rp && rp->tag == TEXPR) { + arg_prec = op_precedence(rp->exprblock.opcode); + + use_paren = arg_prec && + (arg_prec < prec || (arg_prec == prec && + is_left_assoc (prec))); + use_paren = use_paren || + (rp->exprblock.opcode == OPNEG + && prec >= op_precedence(OPMINUS)); + } /* if e -> rightp */ + if (use_paren) + nice_printf (fp, "("); + expr_out(fp, rp); + if (use_paren) + nice_printf (fp, ")"); + break; + case '\0': + case '%': + nice_printf (fp, "%%"); + break; + default: + erri ("output_binary: format err: '%%%c' illegal", + (int) *(format + 1)); + break; + } /* switch */ + format += 2; + } else + nice_printf (fp, "%c", *format++); + } /* while *format */ + } else { + +/* Handle Special cases of formatting */ + + switch (e -> opcode) { + case OPCCALL: + case OPCALL: + out_call (fp, (int) e -> opcode, e -> vtype, + e -> vleng, e -> leftp, e -> rightp); + break; + + case OPCOMMA_ARG: + doin_setbound = 1; + nice_printf(fp, "("); + expr_out(fp, e->leftp); + nice_printf(fp, ", &"); + doin_setbound = 0; + expr_out(fp, e->rightp); + nice_printf(fp, ")"); + break; + + case OPADDR: + default: + nice_printf (fp, "Sorry, can't format OPCODE '%d'", + e -> opcode); + break; + } + + } /* else */ +} /* output_binary */ + + void +#ifdef KR_headers +out_call(outfile, op, ftype, len, name, args) + FILE *outfile; + int op; + int ftype; + expptr len; + expptr name; + expptr args; +#else +out_call(FILE *outfile, int op, int ftype, expptr len, expptr name, expptr args) +#endif +{ + chainp arglist; /* Pointer to any actual arguments */ + chainp cp; /* Iterator over argument lists */ + Addrp ret_val = (Addrp) NULL; + /* Function return value buffer, if any is + required */ + int byvalue; /* True iff we're calling a C library + routine */ + int done_once; /* Used for writing commas to outfile */ + int narg, t; + register expptr q; + long L; + Argtypes *at; + Atype *A, *Ac; + Namep np; + extern int forcereal; + +/* Don't use addresses if we're calling a C function */ + + byvalue = op == OPCCALL; + + if (args) + arglist = args -> listblock.listp; + else + arglist = CHNULL; + +/* If this is a CHARACTER function, the first argument is the result */ + + if (ftype == TYCHAR) + if (ISICON (len)) { + ret_val = (Addrp) (arglist -> datap); + arglist = arglist -> nextp; + } else { + err ("adjustable character function"); + return; + } /* else */ + +/* If this is a COMPLEX function, the first argument is the result */ + + else if (ISCOMPLEX (ftype)) { + ret_val = (Addrp) (arglist -> datap); + arglist = arglist -> nextp; + } /* if ISCOMPLEX */ + + /* prepare to cast procedure parameters -- set A if we know how */ + np = name->tag == TEXPR && name->exprblock.opcode == OPWHATSIN + ? (Namep)name->exprblock.leftp : (Namep)name; + + A = Ac = 0; + if (np->tag == TNAME && (at = np->arginfo)) { + if (at->nargs > 0) + A = at->atypes; + if (Ansi && (at->defined || at->nargs > 0)) + Ac = at->atypes; + } + +/* Now we can actually start to write out the function invocation */ + + if (ftype == TYREAL && forcereal) + nice_printf(outfile, "(real)"); + if (name -> tag == TEXPR && name -> exprblock.opcode == OPWHATSIN) { + nice_printf (outfile, "("); + expr_out (outfile, name); + nice_printf (outfile, ")"); + } + else + expr_out(outfile, name); + + nice_printf(outfile, "("); + + if (ret_val) { + if (ISCOMPLEX (ftype)) + nice_printf (outfile, "&"); + expr_out (outfile, (expptr) ret_val); + if (Ac) + Ac++; + +/* The length of the result of a character function is the second argument */ +/* It should be in place from putcall(), so we won't touch it explicitly */ + + } /* if ret_val */ + done_once = ret_val ? TRUE : FALSE; + +/* Now run through the named arguments */ + + narg = -1; + for (cp = arglist; cp; cp = cp -> nextp, done_once = TRUE) { + + if (done_once) + nice_printf (outfile, ", "); + narg++; + + if (!( q = (expptr)cp->datap) ) + continue; + + if (q->tag == TADDR) { + if (q->addrblock.vtype > TYERROR) { + /* I/O block */ + nice_printf(outfile, "&%s", q->addrblock.user.ident); + continue; + } + if (!byvalue && q->addrblock.isarray + && q->addrblock.vtype != TYCHAR + && q->addrblock.memoffset->tag == TCONST) { + + /* check for 0 offset -- after */ + /* correcting for equivalence. */ + L = q->addrblock.memoffset->constblock.Const.ci; + if (ONEOF(q->addrblock.vstg, M(STGCOMMON)|M(STGEQUIV)) + && q->addrblock.uname_tag == UNAM_NAME) + L -= q->addrblock.user.name->voffset; + if (L) + goto skip_deref; + + if (Ac && narg < at->dnargs + && q->headblock.vtype != (t = Ac[narg].type) + && t > TYADDR && t < TYSUBR) + nice_printf(outfile, "(%s*)", Typename[t]); + + /* &x[0] == x */ + /* This also prevents &sizeof(doublereal)[0] */ + + switch(q->addrblock.uname_tag) { + case UNAM_NAME: + out_name(outfile, q->addrblock.user.name); + continue; + case UNAM_IDENT: + nice_printf(outfile, "%s", + q->addrblock.user.ident); + continue; + case UNAM_CHARP: + nice_printf(outfile, "%s", + q->addrblock.user.Charp); + continue; + case UNAM_EXTERN: + extern_out(outfile, + &extsymtab[q->addrblock.memno]); + continue; + } + } + } + +/* Skip over the dereferencing operator generated only for the + intermediate file */ + skip_deref: + if (q -> tag == TEXPR && q -> exprblock.opcode == OPWHATSIN) + q = q -> exprblock.leftp; + + if (q->headblock.vclass == CLPROC) { + if (Castargs && (q->tag != TNAME + || q->nameblock.vprocclass != PTHISPROC) + && (q->tag != TADDR + || q->addrblock.uname_tag != UNAM_NAME + || q->addrblock.user.name->vprocclass + != PTHISPROC)) + { + if (A && (t = A[narg].type) >= 200) + t %= 100; + else { + t = q->headblock.vtype; + if (q->tag == TNAME && q->nameblock.vimpltype) + t = TYUNKNOWN; + } + nice_printf(outfile, "(%s)", usedcasts[t] = casttypes[t]); + } + } + else if (Ac && narg < at->dnargs + && q->headblock.vtype != (t = Ac[narg].type) + && t > TYADDR && t < TYSUBR) + nice_printf(outfile, "(%s*)", Typename[t]); + + if ((q -> tag == TADDR || q-> tag == TNAME) && + (byvalue || q -> headblock.vstg != STGREG)) { + if (q -> headblock.vtype != TYCHAR) + if (byvalue) { + + if (q -> tag == TADDR && + q -> addrblock.uname_tag == UNAM_NAME && + ! q -> addrblock.user.name -> vdim && + oneof_stg(q -> addrblock.user.name, q -> addrblock.vstg, + M(STGARG)|M(STGEQUIV)) && + ! ISCOMPLEX(q->addrblock.user.name->vtype)) + nice_printf (outfile, "*"); + else if (q -> tag == TNAME + && oneof_stg(&q->nameblock, q -> nameblock.vstg, + M(STGARG)|M(STGEQUIV)) + && !(q -> nameblock.vdim)) + nice_printf (outfile, "*"); + + } else { + expptr memoffset; + + if (q->tag == TADDR && ( + !ONEOF (q -> addrblock.vstg, M(STGEXT)|M(STGLENG)) + && (ONEOF(q->addrblock.vstg, + M(STGCOMMON)|M(STGEQUIV)|M(STGMEMNO)) + || ((memoffset = q->addrblock.memoffset) + && (!ISICON(memoffset) + || memoffset->constblock.Const.ci))) + || ONEOF(q->addrblock.vstg, + M(STGINIT)|M(STGAUTO)|M(STGBSS)) + && !q->addrblock.isarray)) + nice_printf (outfile, "&"); + else if (q -> tag == TNAME + && !oneof_stg(&q->nameblock, q -> nameblock.vstg, + M(STGARG)|M(STGEXT)|M(STGEQUIV))) + nice_printf (outfile, "&"); + } /* else */ + + expr_out (outfile, q); + } /* if q -> tag == TADDR || q -> tag == TNAME */ + +/* Might be a Constant expression, e.g. string length, character constants */ + + else if (q -> tag == TCONST) { + if (q->constblock.vtype == TYLONG) + nice_printf(outfile, "(ftnlen)%ld", + q->constblock.Const.ci); + else + out_const(outfile, &q->constblock); + } + +/* Must be some other kind of expression, or register var, or constant. + In particular, this is likely to be a temporary variable assignment + which was generated in p1put_call */ + + else if (!ISCOMPLEX (q -> headblock.vtype) && !ISCHAR (q)){ + int use_paren = q -> tag == TEXPR && + op_precedence (q -> exprblock.opcode) <= + op_precedence (OPCOMMA); + if (q->headblock.vtype == TYREAL) { + if (forcereal) { + nice_printf(outfile, "(real)"); + use_paren = 1; + } + } + else if (!Ansi && ISINT(q->headblock.vtype)) { + nice_printf(outfile, "(ftnlen)"); + use_paren = 1; + } + if (use_paren) nice_printf (outfile, "("); + expr_out (outfile, q); + if (use_paren) nice_printf (outfile, ")"); + } /* if !ISCOMPLEX */ + else + err ("out_call: unknown parameter"); + + } /* for (cp = arglist */ + + if (arglist) + frchain (&arglist); + + nice_printf (outfile, ")"); + +} /* out_call */ + + + char * +#ifdef KR_headers +flconst(buf, x) + char *buf; + char *x; +#else +flconst(char *buf, char *x) +#endif +{ + sprintf(buf, fl_fmt_string, x); + return buf; + } + + char * +#ifdef KR_headers +dtos(x) + double x; +#else +dtos(double x) +#endif +{ + static char buf[64]; +#ifdef USE_DTOA + g_fmt(buf, x); +#else + sprintf(buf, db_fmt_string, x); +#endif + return strcpy(mem(strlen(buf)+1,0), buf); + } + +char tr_tab[Table_size]; + +/* out_init -- Initialize the data structures used by the routines in + output.c. These structures include the output format to be used for + Float, Double, Complex, and Double Complex constants. */ + + void +out_init(Void) +{ + extern int tab_size; + register char *s; + + s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+-."; + while(*s) + tr_tab[*s++] = 3; + tr_tab['>'] = 1; + + opeqable[OPPLUS] = 1; + opeqable[OPMINUS] = 1; + opeqable[OPSTAR] = 1; + opeqable[OPSLASH] = 1; + opeqable[OPMOD] = 1; + opeqable[OPLSHIFT] = 1; + opeqable[OPBITAND] = 1; + opeqable[OPBITXOR] = 1; + opeqable[OPBITOR ] = 1; + + +/* Set the output format for both types of floating point constants */ + + if (fl_fmt_string == NULL || *fl_fmt_string == '\0') + fl_fmt_string = (char*)(Ansi == 1 ? "%sf" : "(float)%s"); + + if (db_fmt_string == NULL || *db_fmt_string == '\0') + db_fmt_string = "%.17g"; + +/* Set the output format for both types of complex constants. They will + have string parameters rather than float or double so that the decimal + point may be added to the strings generated by the {db,fl}_fmt_string + formats above */ + + if (cm_fmt_string == NULL || *cm_fmt_string == '\0') { + cm_fmt_string = "{%s,%s}"; + } /* if cm_fmt_string == NULL */ + + if (dcm_fmt_string == NULL || *dcm_fmt_string == '\0') { + dcm_fmt_string = "{%s,%s}"; + } /* if dcm_fmt_string == NULL */ + + tab_size = 4; +} /* out_init */ + + + void +#ifdef KR_headers +extern_out(fp, extsym) + FILE *fp; + Extsym *extsym; +#else +extern_out(FILE *fp, Extsym *extsym) +#endif +{ + if (extsym == (Extsym *) NULL) + return; + + nice_printf (fp, "%s", extsym->cextname); + +} /* extern_out */ + + + + static void +#ifdef KR_headers +output_list(fp, listp) + FILE *fp; + struct Listblock *listp; +#else +output_list(FILE *fp, struct Listblock *listp) +#endif +{ + int did_one = 0; + chainp elts; + + nice_printf (fp, "("); + if (listp) + for (elts = listp -> listp; elts; elts = elts -> nextp) { + if (elts -> datap) { + if (did_one) + nice_printf (fp, ", "); + expr_out (fp, (expptr) elts -> datap); + did_one = 1; + } /* if elts -> datap */ + } /* for elts */ + nice_printf (fp, ")"); +} /* output_list */ + + + void +#ifdef KR_headers +out_asgoto(outfile, expr) + FILE *outfile; + expptr expr; +#else +out_asgoto(FILE *outfile, expptr expr) +#endif +{ + chainp value; + Namep namep; + int k; + + if (expr == (expptr) NULL) { + err ("out_asgoto: NULL variable expr"); + return; + } /* if expr */ + + nice_printf (outfile, Ansi ? "switch (" : "switch ((int)"); /*)*/ + expr_out (outfile, expr); + nice_printf (outfile, ") {\n"); + next_tab (outfile); + +/* The initial addrp value will be stored as a namep pointer */ + + switch(expr->tag) { + case TNAME: + /* local variable */ + namep = &expr->nameblock; + break; + case TEXPR: + if (expr->exprblock.opcode == OPWHATSIN + && expr->exprblock.leftp->tag == TNAME) + /* argument */ + namep = &expr->exprblock.leftp->nameblock; + else + goto bad; + break; + case TADDR: + if (expr->addrblock.uname_tag == UNAM_NAME) { + /* initialized local variable */ + namep = expr->addrblock.user.name; + break; + } + default: + bad: + err("out_asgoto: bad expr"); + return; + } + + for(k = 0, value = namep -> varxptr.assigned_values; value; + value = value->nextp, k++) { + nice_printf (outfile, "case %d: goto %s;\n", k, + user_label((Addr)value->datap)); + } /* for value */ + prev_tab (outfile); + + nice_printf (outfile, "}\n"); +} /* out_asgoto */ + + void +#ifdef KR_headers +out_if(outfile, expr) + FILE *outfile; + expptr expr; +#else +out_if(FILE *outfile, expptr expr) +#endif +{ + nice_printf (outfile, "if ("); + expr_out (outfile, expr); + nice_printf (outfile, ") {\n"); + next_tab (outfile); +} /* out_if */ + + static void +#ifdef KR_headers +output_rbrace(outfile, s) + FILE *outfile; + char *s; +#else +output_rbrace(FILE *outfile, char *s) +#endif +{ + extern int last_was_label; + register char *fmt; + + if (last_was_label) { + last_was_label = 0; + fmt = ";%s"; + } + else + fmt = "%s"; + nice_printf(outfile, fmt, s); + } + + void +#ifdef KR_headers +out_else(outfile) + FILE *outfile; +#else +out_else(FILE *outfile) +#endif +{ + prev_tab (outfile); + output_rbrace(outfile, "} else {\n"); + next_tab (outfile); +} /* out_else */ + + void +#ifdef KR_headers +elif_out(outfile, expr) + FILE *outfile; + expptr expr; +#else +elif_out(FILE *outfile, expptr expr) +#endif +{ + prev_tab (outfile); + output_rbrace(outfile, "} else "); + out_if (outfile, expr); +} /* elif_out */ + + void +#ifdef KR_headers +endif_out(outfile) + FILE *outfile; +#else +endif_out(FILE *outfile) +#endif +{ + prev_tab (outfile); + output_rbrace(outfile, "}\n"); +} /* endif_out */ + + void +#ifdef KR_headers +end_else_out(outfile) + FILE *outfile; +#else +end_else_out(FILE *outfile) +#endif +{ + prev_tab (outfile); + output_rbrace(outfile, "}\n"); +} /* end_else_out */ + + + + void +#ifdef KR_headers +compgoto_out(outfile, index, labels) + FILE *outfile; + expptr index; + expptr labels; +#else +compgoto_out(FILE *outfile, expptr index, expptr labels) +#endif +{ + char *s1, *s2; + + if (index == ENULL) + err ("compgoto_out: null index for computed goto"); + else if (labels && labels -> tag != TLIST) + erri ("compgoto_out: expected label list, got tag '%d'", + labels -> tag); + else { + chainp elts; + int i = 1; + + s2 = /*(*/ ") {\n"; /*}*/ + if (Ansi) + s1 = "switch ("; /*)*/ + else if (index->tag == TNAME || index->tag == TEXPR + && index->exprblock.opcode == OPWHATSIN) + s1 = "switch ((int)"; /*)*/ + else { + s1 = "switch ((int)("; + s2 = ")) {\n"; /*}*/ + } + nice_printf(outfile, s1); + expr_out (outfile, index); + nice_printf (outfile, s2); + next_tab (outfile); + + for (elts = labels -> listblock.listp; elts; elts = elts -> nextp, i++) { + if (elts -> datap) { + if (ISICON(((expptr) (elts -> datap)))) + nice_printf (outfile, "case %d: goto %s;\n", i, + user_label(((expptr)(elts->datap))->constblock.Const.ci)); + else + err ("compgoto_out: bad label in label list"); + } /* if (elts -> datap) */ + } /* for elts */ + prev_tab (outfile); + nice_printf (outfile, /*{*/ "}\n"); + } /* else */ +} /* compgoto_out */ + + + void +#ifdef KR_headers +out_for(outfile, init, test, inc) + FILE *outfile; + expptr init; + expptr test; + expptr inc; +#else +out_for(FILE *outfile, expptr init, expptr test, expptr inc) +#endif +{ + nice_printf (outfile, "for ("); + expr_out (outfile, init); + nice_printf (outfile, "; "); + expr_out (outfile, test); + nice_printf (outfile, "; "); + expr_out (outfile, inc); + nice_printf (outfile, ") {\n"); + next_tab (outfile); +} /* out_for */ + + + void +#ifdef KR_headers +out_end_for(outfile) + FILE *outfile; +#else +out_end_for(FILE *outfile) +#endif +{ + prev_tab (outfile); + nice_printf (outfile, "}\n"); +} /* out_end_for */ diff --git a/tools/connec/src/output.h b/tools/connec/src/output.h new file mode 100644 index 0000000..97e3a0a --- /dev/null +++ b/tools/connec/src/output.h @@ -0,0 +1,64 @@ +/* nice_printf -- same arguments as fprintf. + + All output which is to become C code must be directed through this + function. For now, no buffering is done. Later on, every line of + output will be filtered to accomodate the style definitions (e.g. one + statement per line, spaces between function names and argument lists, + etc.) +*/ +#include "niceprintf.h" + + +/* Definitions for the opcode table. The table is indexed by the macros + which are #defined in defines.h */ + +#define UNARY_OP 01 +#define BINARY_OP 02 + +#define SPECIAL_FMT NULL + +#define is_unary_op(x) (opcode_table[x].type == UNARY_OP) +#define is_binary_op(x) (opcode_table[x].type == BINARY_OP) +#define op_precedence(x) (opcode_table[x].prec) +#define op_format(x) (opcode_table[x].format) + +/* _assoc_table -- encodes left-associativity and right-associativity + information; indexed by precedence level. Only 2, 3, 14 are + right-associative. Source: Kernighan & Ritchie, p. 49 */ + +extern char _assoc_table[]; + +#define is_right_assoc(x) (_assoc_table [x]) +#define is_left_assoc(x) (! _assoc_table [x]) + + +typedef struct { + int type; /* UNARY_OP or BINARY_OP */ + int prec; /* Precedence level, useful for adjusting + number of parens to insert. Zero is a + special level, and 2, 3, 14 are + right-associative */ + char *format; +} table_entry; + + +extern char *fl_fmt_string; /* Float constant format string */ +extern char *db_fmt_string; /* Double constant format string */ +extern char *cm_fmt_string; /* Complex constant format string */ +extern char *dcm_fmt_string; /* Double Complex constant format string */ + +extern int indent; /* Number of spaces to indent; this is a + temporary fix */ +extern int tab_size; /* Number of spaces in each tab */ +extern int in_string; + +extern table_entry opcode_table[]; + + +void compgoto_out Argdcl((FILEP, tagptr, tagptr)); +void endif_out Argdcl((FILEP)); +void expr_out Argdcl((FILEP, tagptr)); +void out_and_free_statement Argdcl((FILEP, tagptr)); +void out_end_for Argdcl((FILEP)); +void out_if Argdcl((FILEP, tagptr)); +void out_name Argdcl((FILEP, Namep)); diff --git a/tools/connec/src/output.o b/tools/connec/src/output.o new file mode 100644 index 0000000000000000000000000000000000000000..5bc4a54389497dcaeb412bae56efdaf6c473284e GIT binary patch literal 38472 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 Y+P@b|?`lh*e%~#g;vp^MU(user + field */ +#define P1_EXTERN 9 /* Pointer to external symbol entry */ + +#define P1_HEAD 10 /* Function header info */ +#define P1_LIST 11 /* A list of data (e.g. arguments) will + follow the tag, type, and count */ +#define P1_LITERAL 12 /* Hold the index into the literal pool */ +#define P1_LABEL 13 /* label value */ +#define P1_ASGOTO 14 /* Store the hash table pointer of + variable used in assigned goto */ +#define P1_GOTO 15 /* Store the statement number */ +#define P1_IF 16 /* store the condition as an expression */ +#define P1_ELSE 17 /* No data */ +#define P1_ELIF 18 /* store the condition as an expression */ +#define P1_ENDIF 19 /* Marks the end of a block IF */ +#define P1_ENDELSE 20 /* Marks the end of a block ELSE */ +#define P1_ADDR 21 /* Addr data; used for arrays, common and + equiv addressing, NOT for names, idents + or externs */ +#define P1_SUBR_RET 22 /* Subroutine return; the return expression + follows */ +#define P1_COMP_GOTO 23 /* Computed goto; has expr, label list */ +#define P1_FOR 24 /* C FOR loop; three expressions follow */ +#define P1_ENDFOR 25 /* End of C FOR loop */ +#define P1_FORTRAN 26 /* original Fortran source */ +#define P1_CHARP 27 /* user.Charp field -- for long names */ +#define P1_WHILE1START 28 /* start of DO WHILE */ +#define P1_WHILE2START 29 /* rest of DO WHILE */ +#define P1_PROCODE 30 /* invoke procode() -- to adjust params */ +#define P1_ELSEIFSTART 31 /* handle extra code for abs, min, max + in else if() */ + +#define P1_FILENAME_MAX 256 /* max filename length to retain (for -g) */ +#define P1_STMTBUFSIZE 1400 + + + +#define COMMENT_BUFFER_SIZE 255 /* max number of chars in each comment */ +#define CONSTANT_STR_MAX 1000 /* max number of chars in string constant */ + +void p1_asgoto Argdcl((Addrp)); +void p1_comment Argdcl((char*)); +void p1_elif Argdcl((tagptr)); +void p1_else Argdcl((void)); +void p1_endif Argdcl((void)); +void p1_expr Argdcl((tagptr)); +void p1_for Argdcl((tagptr, tagptr, tagptr)); +void p1_goto Argdcl((long int)); +void p1_head Argdcl((int, char*)); +void p1_if Argdcl((tagptr)); +void p1_label Argdcl((long int)); +void p1_line_number Argdcl((long int)); +void p1_subr_ret Argdcl((tagptr)); +void p1comp_goto Argdcl((tagptr, int, struct Labelblock**)); +void p1else_end Argdcl((void)); +void p1for_end Argdcl((void)); +void p1put Argdcl((int)); +void p1puts Argdcl((int, char*)); + +/* The pass 1 intermediate file has the following format: + + [ : [ [ ]]] \n + + e.g. 1: This is a comment + + This format is destined to change in the future, but for now a readable + form is more desirable than a compact form. + + NOTES ABOUT THE P1 FORMAT + ---------------------------------------------------------------------- + + P1_COMMENT: The comment string (in ) may be at most + COMMENT_BUFFER_SIZE bytes long. It must contain no newlines + or null characters. A side effect of the way comments are + read in lex.c is that no '\377' chars may be in a + comment either. + + P1_SET_LINE: holds the line number in the current source file. + + P1_INC_LINE: Increment the source line number; is empty. + + P1_NAME_POINTER: holds the integer representation of a + pointer into a hash table entry. + + P1_CONST: the first field in is a type tag (one of the + TYxxxx macros), the next field holds the constant + value + + P1_EXPR: holds the opcode number of the expression, + followed by the type of the expression (required for + OPCONV). Next is the value of vleng. + The type of operation represented by the + opcode determines how many of the following data items + are part of this expression. + + P1_IDENT: holds the type, then storage, then the + char string identifier in the addrp->user field. + + P1_EXTERN: holds an offset into the external symbol + table entry + + P1_HEAD: the first field in is the procedure class, the + second is the name of the procedure + + P1_LIST: the first field in is the tag, the second the + type of the list, the third the number of elements in + the list + + P1_LITERAL: holds the litnum of a value in the + literal pool. + + P1_LABEL: holds the statement number of the current + line + + P1_ASGOTO: holds the hash table pointer of the variable + + P1_GOTO: holds the statement number to jump to + + P1_IF: is empty, the following expression is the IF + condition. + + P1_ELSE: is empty. + + P1_ELIF: is empty, the following expression is the IF + condition. + + P1_ENDIF: is empty. + + P1_ENDELSE: is empty. + + P1_ADDR: holds a direct copy of the structure. The + next expression is a copy of vleng, and the next a + copy of memoffset. + + P1_SUBR_RET: The next token is an expression for the return value. + + P1_COMP_GOTO: The next token is an integer expression, the + following one a list of labels. + + P1_FOR: The next three expressions are the Init, Test, and + Increment expressions of a C FOR loop. + + P1_ENDFOR: Marks the end of the body of a FOR loop + +*/ diff --git a/tools/connec/src/p1output.c b/tools/connec/src/p1output.c new file mode 100644 index 0000000..b757b8f --- /dev/null +++ b/tools/connec/src/p1output.c @@ -0,0 +1,743 @@ +/**************************************************************** +Copyright 1990, 1991, 1993, 1994, 1999-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "p1defs.h" +#include "output.h" +#include "names.h" + + +static void p1_addr Argdcl((Addrp)); +static void p1_big_addr Argdcl((Addrp)); +static void p1_binary Argdcl((Exprp)); +static void p1_const Argdcl((Constp)); +static void p1_list Argdcl((struct Listblock*)); +static void p1_literal Argdcl((long int)); +static void p1_name Argdcl((Namep)); +static void p1_unary Argdcl((Exprp)); +static void p1puta Argdcl((int, Addr)); +static void p1putd Argdcl((int, long int)); +static void p1putdd Argdcl((int, int, int)); +static void p1putddd Argdcl((int, int, int, int)); +static void p1putdds Argdcl((int, int, int, char*)); +static void p1putds Argdcl((int, int, char*)); +static void p1putn Argdcl((int, int, char*)); + + +/* p1_comment -- save the text of a Fortran comment in the intermediate + file. Make sure that there are no spurious "/ *" or "* /" characters by + mapping them onto "/+" and "+/". str is assumed to hold no newlines and be + null terminated; it may be modified by this function. */ + + void +#ifdef KR_headers +p1_comment(str) + char *str; +#else +p1_comment(char *str) +#endif +{ + register unsigned char *pointer, *ustr; + + if (!str) + return; + +/* Get rid of any open or close comment combinations that may be in the + Fortran input */ + + ustr = (unsigned char *)str; + for(pointer = ustr; *pointer; pointer++) + if (*pointer == '*' && (pointer[1] == '/' + || pointer > ustr && pointer[-1] == '/')) + *pointer = '+'; + /* trim trailing white space */ +#ifdef isascii + while(--pointer >= ustr && (!isascii(*pointer) || isspace(*pointer))); +#else + while(--pointer >= ustr && isspace(*pointer)); +#endif + pointer[1] = 0; + p1puts (P1_COMMENT, str); +} /* p1_comment */ + +/* p1_name -- Writes the address of a hash table entry into the + intermediate file */ + + static void +#ifdef KR_headers +p1_name(namep) + Namep namep; +#else +p1_name(Namep namep) +#endif +{ + p1puta (P1_NAME_POINTER, (Addr) namep); + namep->visused = 1; +} /* p1_name */ + + + + void +#ifdef KR_headers +p1_expr(expr) + expptr expr; +#else +p1_expr(expptr expr) +#endif +{ +/* An opcode of 0 means a null entry */ + + if (expr == ENULL) { + p1putdd (P1_EXPR, 0, TYUNKNOWN); /* Should this be TYERROR? */ + return; + } /* if (expr == ENULL) */ + + switch (expr -> tag) { + case TNAME: + p1_name ((Namep) expr); + return; + case TCONST: + p1_const(&expr->constblock); + return; + case TEXPR: + /* Fall through the switch */ + break; + case TADDR: + p1_addr (&(expr -> addrblock)); + goto freeup; + case TPRIM: + warn ("p1_expr: got TPRIM"); + return; + case TLIST: + p1_list (&(expr->listblock)); + frchain( &(expr->listblock.listp) ); + return; + case TERROR: + return; + default: + erri ("p1_expr: bad tag '%d'", (int) (expr -> tag)); + return; + } + +/* Now we know that the tag is TEXPR */ + + if (is_unary_op (expr -> exprblock.opcode)) + p1_unary (&(expr -> exprblock)); + else if (is_binary_op (expr -> exprblock.opcode)) + p1_binary (&(expr -> exprblock)); + else + erri ("p1_expr: bad opcode '%d'", (int) expr -> exprblock.opcode); + freeup: + free((char *)expr); + +} /* p1_expr */ + + + + static void +#ifdef KR_headers +p1_const(cp) + register Constp cp; +#else +p1_const(register Constp cp) +#endif +{ + int type = cp->vtype; + expptr vleng = cp->vleng; + union Constant *c = &cp->Const; + char cdsbuf0[64], cdsbuf1[64]; + char *cds0, *cds1; + + switch (type) { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + case TYLOGICAL: + case TYLOGICAL1: + case TYLOGICAL2: + fprintf(pass1_file, "%d: %d %ld\n", P1_CONST, type, c->ci); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + fprintf(pass1_file, "%d: %d %llx\n", P1_CONST, type, c->cq); + break; +#endif + case TYREAL: + case TYDREAL: + fprintf(pass1_file, "%d: %d %s\n", P1_CONST, type, + cp->vstg ? c->cds[0] : cds(dtos(c->cd[0]), cdsbuf0)); + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if (cp->vstg) { + cds0 = c->cds[0]; + cds1 = c->cds[1]; + } + else { + cds0 = cds(dtos(c->cd[0]), cdsbuf0); + cds1 = cds(dtos(c->cd[1]), cdsbuf1); + } + fprintf(pass1_file, "%d: %d %s %s\n", P1_CONST, type, + cds0, cds1); + break; + case TYCHAR: + if (vleng && !ISICON (vleng)) + err("p1_const: bad vleng\n"); + else + fprintf(pass1_file, "%d: %d " Addrfmt "\n", P1_CONST, type, + (Addr)cpexpr((expptr)cp)); + break; + default: + erri ("p1_const: bad constant type '%d'", type); + break; + } /* switch */ +} /* p1_const */ + + + void +#ifdef KR_headers +p1_asgoto(addrp) + Addrp addrp; +#else +p1_asgoto(Addrp addrp) +#endif +{ + p1put (P1_ASGOTO); + p1_addr (addrp); +} /* p1_asgoto */ + + + void +#ifdef KR_headers +p1_goto(stateno) + ftnint stateno; +#else +p1_goto(ftnint stateno) +#endif +{ + p1putd (P1_GOTO, stateno); +} /* p1_goto */ + + + static void +#ifdef KR_headers +p1_addr(addrp) + register struct Addrblock *addrp; +#else +p1_addr(register struct Addrblock *addrp) +#endif +{ + int stg; + + if (addrp == (struct Addrblock *) NULL) + return; + + stg = addrp -> vstg; + + if (ONEOF(stg, M(STGINIT)|M(STGREG)) + || ONEOF(stg, M(STGCOMMON)|M(STGEQUIV)) && + (!ISICON(addrp->memoffset) + || (addrp->uname_tag == UNAM_NAME + ? addrp->memoffset->constblock.Const.ci + != addrp->user.name->voffset + : addrp->memoffset->constblock.Const.ci)) + || ONEOF(stg, M(STGBSS)|M(STGINIT)|M(STGAUTO)|M(STGARG)) && + (!ISICON(addrp->memoffset) + || addrp->memoffset->constblock.Const.ci) + || addrp->Field || addrp->isarray || addrp->vstg == STGLENG) + { + p1_big_addr (addrp); + return; + } + +/* Write out a level of indirection for non-array arguments, which have + addrp -> memoffset set and are handled by p1_big_addr(). + Lengths are passed by value, so don't check STGLENG + 28-Jun-89 (dmg) Added the check for != TYCHAR + */ + + if (oneof_stg ( addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : NULL, + stg, M(STGARG)|M(STGEQUIV)) && addrp->vtype != TYCHAR) { + p1putdd (P1_EXPR, OPWHATSIN, addrp -> vtype); + p1_expr (ENULL); /* Put dummy vleng */ + } /* if stg == STGARG */ + + switch (addrp -> uname_tag) { + case UNAM_NAME: + p1_name (addrp -> user.name); + break; + case UNAM_IDENT: + p1putdds(P1_IDENT, addrp->vtype, addrp->vstg, + addrp->user.ident); + break; + case UNAM_CHARP: + p1putdds(P1_CHARP, addrp->vtype, addrp->vstg, + addrp->user.Charp); + break; + case UNAM_EXTERN: + p1putd (P1_EXTERN, (long) addrp -> memno); + if (addrp->vclass == CLPROC) + extsymtab[addrp->memno].extype = addrp->vtype; + break; + case UNAM_CONST: + if (addrp -> memno != BAD_MEMNO) + p1_literal (addrp -> memno); + else + p1_const((struct Constblock *)addrp); + break; + case UNAM_UNKNOWN: + default: + erri ("p1_addr: unknown uname_tag '%d'", addrp -> uname_tag); + break; + } /* switch */ +} /* p1_addr */ + + + static void +#ifdef KR_headers +p1_list(listp) + struct Listblock *listp; +#else +p1_list(struct Listblock *listp) +#endif +{ + chainp lis; + int count = 0; + + if (listp == (struct Listblock *) NULL) + return; + +/* Count the number of parameters in the list */ + + for (lis = listp -> listp; lis; lis = lis -> nextp) + count++; + + p1putddd (P1_LIST, listp -> tag, listp -> vtype, count); + + for (lis = listp -> listp; lis; lis = lis -> nextp) + p1_expr ((expptr) lis -> datap); + +} /* p1_list */ + + + void +#ifdef KR_headers +p1_label(lab) + long lab; +#else +p1_label(long lab) +#endif +{ + if (parstate < INDATA) + earlylabs = mkchain((char *)(Addr)lab, earlylabs); + else + p1putd (P1_LABEL, lab); + } + + + + static void +#ifdef KR_headers +p1_literal(memno) + long memno; +#else +p1_literal(long memno) +#endif +{ + p1putd (P1_LITERAL, memno); +} /* p1_literal */ + + + void +#ifdef KR_headers +p1_if(expr) + expptr expr; +#else +p1_if(expptr expr) +#endif +{ + p1put (P1_IF); + p1_expr (expr); +} /* p1_if */ + + + + + void +#ifdef KR_headers +p1_elif(expr) + expptr expr; +#else +p1_elif(expptr expr) +#endif +{ + p1put (P1_ELIF); + p1_expr (expr); +} /* p1_elif */ + + + + + void +p1_else(Void) +{ + p1put (P1_ELSE); +} /* p1_else */ + + + + + void +p1_endif(Void) +{ + p1put (P1_ENDIF); +} /* p1_endif */ + + + + + void +p1else_end(Void) +{ + p1put (P1_ENDELSE); +} /* p1else_end */ + + + static void +#ifdef KR_headers +p1_big_addr(addrp) + Addrp addrp; +#else +p1_big_addr(Addrp addrp) +#endif +{ + if (addrp == (Addrp) NULL) + return; + + p1putn (P1_ADDR, (int)sizeof(struct Addrblock), (char *) addrp); + p1_expr (addrp -> vleng); + p1_expr (addrp -> memoffset); + if (addrp->uname_tag == UNAM_NAME) + addrp->user.name->visused = 1; +} /* p1_big_addr */ + + + + static void +#ifdef KR_headers +p1_unary(e) + struct Exprblock *e; +#else +p1_unary(struct Exprblock *e) +#endif +{ + if (e == (struct Exprblock *) NULL) + return; + + p1putdd (P1_EXPR, (int) e -> opcode, e -> vtype); + p1_expr (e -> vleng); + + switch (e -> opcode) { + case OPNEG: + case OPNEG1: + case OPNOT: + case OPABS: + case OPBITNOT: + case OPPREINC: + case OPPREDEC: + case OPADDR: + case OPIDENTITY: + case OPCHARCAST: + case OPDABS: + p1_expr(e -> leftp); + break; + default: + erri ("p1_unary: bad opcode '%d'", (int) e -> opcode); + break; + } /* switch */ + +} /* p1_unary */ + + + static void +#ifdef KR_headers +p1_binary(e) + struct Exprblock *e; +#else +p1_binary(struct Exprblock *e) +#endif +{ + if (e == (struct Exprblock *) NULL) + return; + p1putdd (P1_EXPR, e -> opcode, e -> vtype); + p1_expr (e -> vleng); + p1_expr (e -> leftp); + p1_expr (e -> rightp); +} /* p1_binary */ + + + void +#ifdef KR_headers +p1_head(Class, name) + int Class; + char *name; +#else +p1_head(int Class, char *name) +#endif +{ + p1putds (P1_HEAD, Class, (char*)(name ? name : "")); +} /* p1_head */ + + + void +#ifdef KR_headers +p1_subr_ret(retexp) + expptr retexp; +#else +p1_subr_ret(expptr retexp) +#endif +{ + + p1put (P1_SUBR_RET); + p1_expr (cpexpr(retexp)); +} /* p1_subr_ret */ + + + + void +#ifdef KR_headers +p1comp_goto(index, count, labels) + expptr index; + int count; + struct Labelblock **labels; +#else +p1comp_goto(expptr index, int count, struct Labelblock **labels) +#endif +{ + struct Constblock c; + int i; + register struct Labelblock *L; + + p1put (P1_COMP_GOTO); + p1_expr (index); + +/* Write out a P1_LIST directly, to avoid the overhead of allocating a + list before it's needed HACK HACK HACK */ + + p1putddd (P1_LIST, TLIST, TYUNKNOWN, count); + c.vtype = TYLONG; + c.vleng = 0; + + for (i = 0; i < count; i++) { + L = labels[i]; + L->labused = 1; + c.Const.ci = L->stateno; + p1_const(&c); + } /* for i = 0 */ +} /* p1comp_goto */ + + + + void +#ifdef KR_headers +p1_for(init, test, inc) + expptr init; + expptr test; + expptr inc; +#else +p1_for(expptr init, expptr test, expptr inc) +#endif +{ + p1put (P1_FOR); + p1_expr (init); + p1_expr (test); + p1_expr (inc); +} /* p1_for */ + + + void +p1for_end(Void) +{ + p1put (P1_ENDFOR); +} /* p1for_end */ + + + + +/* ---------------------------------------------------------------------- + The intermediate file actually gets written ONLY by the routines below. + To change the format of the file, you need only change these routines. + ---------------------------------------------------------------------- +*/ + + +/* p1puts -- Put a typed string into the Pass 1 intermediate file. Assumes that + str contains no newlines and is null-terminated. */ + + void +#ifdef KR_headers +p1puts(type, str) + int type; + char *str; +#else +p1puts(int type, char *str) +#endif +{ + fprintf (pass1_file, "%d: %s\n", type, str); +} /* p1puts */ + + +/* p1puta -- Put an Addr into the Pass 1 intermediate file. */ + + static void +#ifdef KR_headers +p1puta(type, value) + int type; + Addr value; +#else +p1puta(int type, Addr value) +#endif +{ + fprintf (pass1_file, "%d: " Addrfmt "\n", type, value); +} /* p1_puta */ + + +/* p1putd -- Put a typed integer into the Pass 1 intermediate file. */ + + static void +#ifdef KR_headers +p1putd(type, value) + int type; + long value; +#else +p1putd(int type, long value) +#endif +{ + fprintf (pass1_file, "%d: %ld\n", type, value); +} /* p1_putd */ + + +/* p1putdd -- Put a typed pair of integers into the intermediate file. */ + + static void +#ifdef KR_headers +p1putdd(type, v1, v2) + int type; + int v1; + int v2; +#else +p1putdd(int type, int v1, int v2) +#endif +{ + fprintf (pass1_file, "%d: %d %d\n", type, v1, v2); +} /* p1putdd */ + + +/* p1putddd -- Put a typed triple of integers into the intermediate file. */ + + static void +#ifdef KR_headers +p1putddd(type, v1, v2, v3) + int type; + int v1; + int v2; + int v3; +#else +p1putddd(int type, int v1, int v2, int v3) +#endif +{ + fprintf (pass1_file, "%d: %d %d %d\n", type, v1, v2, v3); +} /* p1putddd */ + + union dL { + double d; + long L[2]; + }; + + static void +#ifdef KR_headers +p1putn(type, count, str) + int type; + int count; + char *str; +#else +p1putn(int type, int count, char *str) +#endif +{ + int i; + + fprintf (pass1_file, "%d: ", type); + + for (i = 0; i < count; i++) + putc (str[i], pass1_file); + + putc ('\n', pass1_file); +} /* p1putn */ + + + +/* p1put -- Put a type marker into the intermediate file. */ + + void +#ifdef KR_headers +p1put(type) + int type; +#else +p1put(int type) +#endif +{ + fprintf (pass1_file, "%d:\n", type); +} /* p1put */ + + + + static void +#ifdef KR_headers +p1putds(type, i, str) + int type; + int i; + char *str; +#else +p1putds(int type, int i, char *str) +#endif +{ + fprintf (pass1_file, "%d: %d %s\n", type, i, str); +} /* p1putds */ + + + static void +#ifdef KR_headers +p1putdds(token, type, stg, str) + int token; + int type; + int stg; + char *str; +#else +p1putdds(int token, int type, int stg, char *str) +#endif +{ + fprintf (pass1_file, "%d: %d %d %s\n", token, type, stg, str); +} /* p1putdds */ diff --git a/tools/connec/src/p1output.o b/tools/connec/src/p1output.o new file mode 100644 index 0000000000000000000000000000000000000000..2dc07a72a884c87b0fcb30690d8fdca59465be57 GIT binary patch literal 12976 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 P3O_nQdaPIRspkJbK2eN0 literal 0 HcmV?d00001 diff --git a/tools/connec/src/parse.h b/tools/connec/src/parse.h new file mode 100644 index 0000000..6de2399 --- /dev/null +++ b/tools/connec/src/parse.h @@ -0,0 +1,47 @@ +#ifndef PARSE_INCLUDE +#define PARSE_INCLUDE + +/* macros for the parse_args routine */ + +#define P_STRING 1 /* Macros for the result_type attribute */ +#define P_CHAR 2 +#define P_SHORT 3 +#define P_INT 4 +#define P_LONG 5 +#define P_FILE 6 +#define P_OLD_FILE 7 +#define P_NEW_FILE 8 +#define P_FLOAT 9 +#define P_DOUBLE 10 + +#define P_CASE_INSENSITIVE 01 /* Macros for the flags attribute */ +#define P_REQUIRED_PREFIX 02 + +#define P_NO_ARGS 0 /* Macros for the arg_count attribute */ +#define P_ONE_ARG 1 +#define P_INFINITE_ARGS 2 + +#define p_entry(pref,swit,flag,count,type,store,size) \ + { (pref), (swit), (flag), (count), (type), (int *) (store), (size) } + +typedef struct { + char *prefix; + char *string; + int flags; + int count; + int result_type; + int *result_ptr; + int table_size; +} arg_info; + +#ifdef KR_headers +#define Argdcl(x) () +#else +#define Argdcl(x) x +#endif +int arg_verify Argdcl((char**, arg_info*, int)); +void init_store Argdcl((arg_info*, int)); +int match_table Argdcl((char*, arg_info*, int, int, int*)); +int parse_args Argdcl((int, char**, arg_info*, int, char**, int)); + +#endif diff --git a/tools/connec/src/parse_args.c b/tools/connec/src/parse_args.c new file mode 100644 index 0000000..dd7b781 --- /dev/null +++ b/tools/connec/src/parse_args.c @@ -0,0 +1,558 @@ +/**************************************************************** +Copyright 1990, 1994-5, 2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* parse_args + + This function will parse command line input into appropriate data + structures, output error messages when appropriate and provide some + minimal type conversion. + + Input to the function consists of the standard argc,argv + values, and a table which directs the parser. Each table entry has the + following components: + + prefix -- the (optional) switch character string, e.g. "-" "/" "=" + switch -- the command string, e.g. "o" "data" "file" "F" + flags -- control flags, e.g. CASE_INSENSITIVE, REQUIRED_PREFIX + arg_count -- number of arguments this command requires, e.g. 0 for + booleans, 1 for filenames, INFINITY for input files + result_type -- how to interpret the switch arguments, e.g. STRING, + CHAR, FILE, OLD_FILE, NEW_FILE + result_ptr -- pointer to storage for the result, be it a table or + a string or whatever + table_size -- if the arguments fill a table, the maximum number of + entries; if there are no arguments, the value to + load into the result storage + + Although the table can be used to hold a list of filenames, only + scalar values (e.g. pointers) can be stored in the table. No vector + processing will be done, only pointers to string storage will be moved. + + An example entry, which could be used to parse input filenames, is: + + "-", "o", 0, oo, OLD_FILE, infilenames, INFILE_TABLE_SIZE + +*/ + +#include +#ifndef NULL +/* ANSI C */ +#include +#endif +#ifdef KR_headers +extern double atof(); +#else +#include "stdlib.h" +#include "string.h" +#endif +#include "parse.h" +#include /* For atof */ +#include + +#define MAX_INPUT_SIZE 1000 + +#define arg_prefix(x) ((x).prefix) +#define arg_string(x) ((x).string) +#define arg_flags(x) ((x).flags) +#define arg_count(x) ((x).count) +#define arg_result_type(x) ((x).result_type) +#define arg_result_ptr(x) ((x).result_ptr) +#define arg_table_size(x) ((x).table_size) + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +typedef int boolean; + + +static char *this_program = ""; + +static int arg_parse Argdcl((char*, arg_info*)); +static char *lower_string Argdcl((char*, char*)); +static int match Argdcl((char*, char*, arg_info*, boolean)); +static int put_one_arg Argdcl((int, char*, char**, char*, char*)); +extern int badargs; + + + boolean +#ifdef KR_headers +parse_args(argc, argv, table, entries, others, other_count) + int argc; + char **argv; + arg_info *table; + int entries; + char **others; + int other_count; +#else +parse_args(int argc, char **argv, arg_info *table, int entries, char **others, int other_count) +#endif +{ + boolean result; + + if (argv) + this_program = argv[0]; + +/* Check the validity of the table and its parameters */ + + result = arg_verify (argv, table, entries); + +/* Initialize the storage values */ + + init_store (table, entries); + + if (result) { + boolean use_prefix = TRUE; + char *argv0; + + argc--; + argv0 = *++argv; + while (argc) { + int index, length; + + index = match_table (*argv, table, entries, use_prefix, &length); + if (index < 0) { + +/* The argument doesn't match anything in the table */ + + if (others) { + + if (*argv > argv0) + *--*argv = '-'; /* complain at invalid flag */ + + if (other_count > 0) { + *others++ = *argv; + other_count--; + } else { + fprintf (stderr, "%s: too many parameters: ", + this_program); + fprintf (stderr, "'%s' ignored\n", *argv); + badargs++; + } /* else */ + } /* if (others) */ + argv0 = *++argv; + argc--; + use_prefix = TRUE; + } else { + +/* A match was found */ + + if (length >= strlen (*argv)) { + argc--; + argv0 = *++argv; + use_prefix = TRUE; + } else { + (*argv) += length; + use_prefix = FALSE; + } /* else */ + +/* Parse any necessary arguments */ + + if (arg_count (table[index]) != P_NO_ARGS) { + +/* Now length will be used to store the number of parsed characters */ + + length = arg_parse(*argv, &table[index]); + if (*argv == NULL) + argc = 0; + else if (length >= strlen (*argv)) { + argc--; + argv0 = *++argv; + use_prefix = TRUE; + } else { + (*argv) += length; + use_prefix = FALSE; + } /* else */ + } /* if (argv_count != P_NO_ARGS) */ + else + *arg_result_ptr(table[index]) = + arg_table_size(table[index]); + } /* else */ + } /* while (argc) */ + } /* if (result) */ + + return result; +} /* parse_args */ + + + boolean +#ifdef KR_headers +arg_verify(argv, table, entries) + char **argv; + arg_info *table; + int entries; +#else +arg_verify(char **argv, arg_info *table, int entries) +#endif +{ + int i; + char *this_program = ""; + + if (argv) + this_program = argv[0]; + + for (i = 0; i < entries; i++) { + arg_info *arg = &table[i]; + +/* Check the argument flags */ + + if (arg_flags (*arg) & ~(P_CASE_INSENSITIVE | P_REQUIRED_PREFIX)) { + fprintf (stderr, "%s [arg_verify]: too many ", this_program); + fprintf (stderr, "flags in entry %d: '%x' (hex)\n", i, + arg_flags (*arg)); + badargs++; + } /* if */ + +/* Check the argument count */ + + { int count = arg_count (*arg); + + if (count != P_NO_ARGS && count != P_ONE_ARG && count != + P_INFINITE_ARGS) { + fprintf (stderr, "%s [arg_verify]: invalid ", this_program); + fprintf (stderr, "argument count in entry %d: '%d'\n", i, + count); + badargs++; + } /* if count != P_NO_ARGS ... */ + +/* Check the result field; want to be able to store results */ + + else + if (arg_result_ptr (*arg) == (int *) NULL) { + fprintf (stderr, "%s [arg_verify]: ", this_program); + fprintf (stderr, "no argument storage given for "); + fprintf (stderr, "entry %d\n", i); + badargs++; + } /* if arg_result_ptr */ + } + +/* Check the argument type */ + + { int type = arg_result_type (*arg); + + if (type < P_STRING || type > P_DOUBLE) { + fprintf(stderr, + "%s [arg_verify]: bad arg type in entry %d: '%d'\n", + this_program, i, type); + badargs++; + } + } + +/* Check table size */ + + { int size = arg_table_size (*arg); + + if (arg_count (*arg) == P_INFINITE_ARGS && size < 1) { + fprintf (stderr, "%s [arg_verify]: bad ", this_program); + fprintf (stderr, "table size in entry %d: '%d'\n", i, + size); + badargs++; + } /* if (arg_count == P_INFINITE_ARGS && size < 1) */ + } + + } /* for i = 0 */ + + return TRUE; +} /* arg_verify */ + + +/* match_table -- returns the index of the best entry matching the input, + -1 if no match. The best match is the one of longest length which + appears lowest in the table. The length of the match will be returned + in length ONLY IF a match was found. */ + + int +#ifdef KR_headers +match_table(norm_input, table, entries, use_prefix, length) + register char *norm_input; + arg_info *table; + int entries; + boolean use_prefix; + int *length; +#else +match_table(register char *norm_input, arg_info *table, int entries, boolean use_prefix, int *length) +#endif +{ + char low_input[MAX_INPUT_SIZE]; + register int i; + int best_index = -1, best_length = 0; + +/* FUNCTION BODY */ + + (void) lower_string (low_input, norm_input); + + for (i = 0; i < entries; i++) { + int this_length = match(norm_input, low_input, &table[i], use_prefix); + + if (this_length > best_length) { + best_index = i; + best_length = this_length; + } /* if (this_length > best_length) */ + } /* for (i = 0) */ + + if (best_index > -1 && length != (int *) NULL) + *length = best_length; + + return best_index; +} /* match_table */ + + +/* match -- takes an input string and table entry, and returns the length + of the longer match. + + 0 ==> input doesn't match + + For example: + + INPUT PREFIX STRING RESULT +---------------------------------------------------------------------- + "abcd" "-" "d" 0 + "-d" "-" "d" 2 (i.e. "-d") + "dout" "-" "d" 1 (i.e. "d") + "-d" "" "-d" 2 (i.e. "-d") + "dd" "d" "d" 2 <= here's the weird one +*/ + + static int +#ifdef KR_headers +match(norm_input, low_input, entry, use_prefix) + char *norm_input; + char *low_input; + arg_info *entry; + boolean use_prefix; +#else +match(char *norm_input, char *low_input, arg_info *entry, boolean use_prefix) +#endif +{ + char *norm_prefix = arg_prefix (*entry); + char *norm_string = arg_string (*entry); + boolean prefix_match = FALSE, string_match = FALSE; + int result = 0; + +/* Buffers for the lowercased versions of the strings being compared. + These are used when the switch is to be case insensitive */ + + static char low_prefix[MAX_INPUT_SIZE]; + static char low_string[MAX_INPUT_SIZE]; + int prefix_length = strlen (norm_prefix); + int string_length = strlen (norm_string); + +/* Pointers for the required strings (lowered or nonlowered) */ + + register char *input, *prefix, *string; + +/* FUNCTION BODY */ + +/* Use the appropriate strings to handle case sensitivity */ + + if (arg_flags (*entry) & P_CASE_INSENSITIVE) { + input = low_input; + prefix = lower_string (low_prefix, norm_prefix); + string = lower_string (low_string, norm_string); + } else { + input = norm_input; + prefix = norm_prefix; + string = norm_string; + } /* else */ + +/* First, check the string formed by concatenating the prefix onto the + switch string, but only when the prefix is not being ignored */ + + if (use_prefix && prefix != NULL && *prefix != '\0') + prefix_match = (strncmp (input, prefix, prefix_length) == 0) && + (strncmp (input + prefix_length, string, string_length) == 0); + +/* Next, check just the switch string, if that's allowed */ + + if (!use_prefix && (arg_flags (*entry) & P_REQUIRED_PREFIX) == 0) + string_match = strncmp (input, string, string_length) == 0; + + if (prefix_match) + result = prefix_length + string_length; + else if (string_match) + result = string_length; + + return result; +} /* match */ + + + static char * +#ifdef KR_headers +lower_string(dest, src) + char *dest; + char *src; +#else +lower_string(char *dest, char *src) +#endif +{ + char *result = dest; + register int c; + + if (dest == NULL || src == NULL) + result = NULL; + else + while (*dest++ = (c = *src++) >= 'A' && c <= 'Z' ? tolower(c) : c); + + return result; +} /* lower_string */ + + +/* arg_parse -- returns the number of characters parsed for this entry */ + + static int +#ifdef KR_headers +arg_parse(str, entry) + char *str; + arg_info *entry; +#else +arg_parse(char *str, arg_info *entry) +#endif +{ + int length = 0; + + if (arg_count (*entry) == P_ONE_ARG) { + char **store = (char **) arg_result_ptr (*entry); + + length = put_one_arg (arg_result_type (*entry), str, store, + arg_prefix (*entry), arg_string (*entry)); + + } /* if (arg_count == P_ONE_ARG) */ + else { /* Must be a table of arguments */ + char **store = (char **) arg_result_ptr (*entry); + + if (store) { + while (*store) + store++; + + length = put_one_arg(arg_result_type (*entry), str, store++, + arg_prefix (*entry), arg_string (*entry)); + + *store = (char *) NULL; + } /* if (store) */ + } /* else */ + + return length; +} /* arg_parse */ + + + static int +#ifdef KR_headers +put_one_arg(type, str, store, prefix, string) + int type; + char *str; + char **store; + char *prefix; + char *string; +#else +put_one_arg(int type, char *str, char **store, char *prefix, char *string) +#endif +{ + int length = 0; + long L; + + if (store) { + switch (type) { + case P_STRING: + case P_FILE: + case P_OLD_FILE: + case P_NEW_FILE: + if (str == NULL) { + fprintf(stderr, "%s: Missing argument after '%s%s'\n", + this_program, prefix, string); + length = 0; + badargs++; + } + else + length = strlen(*store = str); + break; + case P_CHAR: + *((char *) store) = *str; + length = 1; + break; + case P_SHORT: + L = atol(str); + *(short *)store = (short) L; + if (L != *(short *)store) { + fprintf(stderr, + "%s%s parameter '%ld' is not a SHORT INT (truncating to %d)\n", + prefix, string, L, *(short *)store); + badargs++; + } + length = strlen (str); + break; + case P_INT: + L = atol(str); + *(int *)store = (int)L; + if (L != *(int *)store) { + fprintf(stderr, + "%s%s parameter '%ld' is not an INT (truncating to %d)\n", + prefix, string, L, *(int *)store); + badargs++; + } + length = strlen (str); + break; + case P_LONG: + *(long *)store = atol(str); + length = strlen (str); + break; + case P_FLOAT: + *((float *) store) = (float) atof(str); + length = strlen (str); + break; + case P_DOUBLE: + *((double *) store) = (double) atof(str); + length = strlen (str); + break; + default: + fprintf (stderr, "put_one_arg: bad type '%d'\n", type); + badargs++; + break; + } /* switch */ + } /* if (store) */ + + return length; +} /* put_one_arg */ + + + void +#ifdef KR_headers +init_store(table, entries) + arg_info *table; + int entries; +#else +init_store(arg_info *table, int entries) +#endif +{ + int index; + + for (index = 0; index < entries; index++) + if (arg_count (table[index]) == P_INFINITE_ARGS) { + char **place = (char **) arg_result_ptr (table[index]); + + if (place) + *place = (char *) NULL; + } /* if arg_count == P_INFINITE_ARGS */ + +} /* init_store */ diff --git a/tools/connec/src/parse_args.o b/tools/connec/src/parse_args.o new file mode 100644 index 0000000000000000000000000000000000000000..7525aecc83f41dd494115739df0e63ffea7c0d1f GIT binary patch literal 8808 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/pccdefs.h b/tools/connec/src/pccdefs.h new file mode 100644 index 0000000..bde8117 --- /dev/null +++ b/tools/connec/src/pccdefs.h @@ -0,0 +1,64 @@ +/* The following numbers are strange, and implementation-dependent */ + +#define P2BAD -1 +#define P2NAME 2 +#define P2ICON 4 /* Integer constant */ +#define P2PLUS 6 +#define P2PLUSEQ 7 +#define P2MINUS 8 +#define P2NEG 10 +#define P2STAR 11 +#define P2STAREQ 12 +#define P2INDIRECT 13 +#define P2BITAND 14 +#define P2BITOR 17 +#define P2BITXOR 19 +#define P2QUEST 21 +#define P2COLON 22 +#define P2ANDAND 23 +#define P2OROR 24 +#define P2GOTO 37 +#define P2LISTOP 56 +#define P2ASSIGN 58 +#define P2COMOP 59 +#define P2SLASH 60 +#define P2MOD 62 +#define P2LSHIFT 64 +#define P2RSHIFT 66 +#define P2CALL 70 +#define P2CALL0 72 + +#define P2NOT 76 +#define P2BITNOT 77 +#define P2EQ 80 +#define P2NE 81 +#define P2LE 82 +#define P2LT 83 +#define P2GE 84 +#define P2GT 85 +#define P2REG 94 +#define P2OREG 95 +#define P2CONV 104 +#define P2FORCE 108 +#define P2CBRANCH 109 + +/* special operators included only for fortran's use */ + +#define P2PASS 200 +#define P2STMT 201 +#define P2SWITCH 202 +#define P2LBRACKET 203 +#define P2RBRACKET 204 +#define P2EOF 205 +#define P2ARIF 206 +#define P2LABEL 207 + +#define P2SHORT 3 +#define P2INT 4 +#define P2LONG 4 + +#define P2CHAR 2 +#define P2REAL 6 +#define P2DREAL 7 +#define P2PTR 020 +#define P2FUNCT 040 diff --git a/tools/connec/src/pread.c b/tools/connec/src/pread.c new file mode 100644 index 0000000..cd58513 --- /dev/null +++ b/tools/connec/src/pread.c @@ -0,0 +1,990 @@ +/**************************************************************** +Copyright 1990, 1992, 1993, 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" + + static char Ptok[128], Pct[Table_size]; + static char *Pfname; + static long Plineno; + static int Pbad; + static int *tfirst, *tlast, *tnext, tmax; + +#define P_space 1 +#define P_anum 2 +#define P_delim 3 +#define P_slash 4 + +#define TGULP 100 + + static void +trealloc(Void) +{ + int k = tmax; + tfirst = (int *)realloc((char *)tfirst, + (tmax += TGULP)*sizeof(int)); + if (!tfirst) { + fprintf(stderr, + "Pfile: realloc failure!\n"); + exit(2); + } + tlast = tfirst + tmax; + tnext = tfirst + k; + } + + static void +#ifdef KR_headers +badchar(c) + int c; +#else +badchar(int c) +#endif +{ + fprintf(stderr, + "unexpected character 0x%.2x = '%c' on line %ld of %s\n", + c, c, Plineno, Pfname); + exit(2); + } + + static void +bad_type(Void) +{ + fprintf(stderr, + "unexpected type \"%s\" on line %ld of %s\n", + Ptok, Plineno, Pfname); + exit(2); + } + + static void +#ifdef KR_headers +badflag(tname, option) + char *tname; + char *option; +#else +badflag(char *tname, char *option) +#endif +{ + fprintf(stderr, "%s type from `f2c -%s` on line %ld of %s\n", + tname, option, Plineno, Pfname); + Pbad++; + } + + static void +#ifdef KR_headers +detected(msg) + char *msg; +#else +detected(char *msg) +#endif +{ + fprintf(stderr, + "%sdetected on line %ld of %s\n", msg, Plineno, Pfname); + Pbad++; + } + +#if 0 + static void +#ifdef KR_headers +checklogical(k) + int k; +#else +checklogical(int k) +#endif +{ + static int lastmsg = 0; + static int seen[2] = {0,0}; + + seen[k] = 1; + if (seen[1-k]) { + if (lastmsg < 3) { + lastmsg = 3; + detected( + "Illegal combination of LOGICAL types -- mixing -I4 with -I2 or -i2\n\t"); + } + return; + } + if (k) { + if (tylogical == TYLONG || lastmsg >= 2) + return; + if (!lastmsg) { + lastmsg = 2; + badflag("LOGICAL", "I4"); + } + } + else { + if (tylogical == TYSHORT || lastmsg & 1) + return; + if (!lastmsg) { + lastmsg = 1; + badflag("LOGICAL", "i2` or `f2c -I2"); + } + } + } +#else +#define checklogical(n) /* */ +#endif + + static void +#ifdef KR_headers +checkreal(k) + int k; +#else +checkreal(int k) +#endif +{ + static int warned = 0; + static int seen[2] = {0,0}; + + seen[k] = 1; + if (seen[1-k]) { + if (warned < 2) + detected("Illegal mixture of -R and -!R "); + warned = 2; + return; + } + if (k == forcedouble || warned) + return; + warned = 1; + badflag("REAL return", (char*)(k ? "!R" : "R")); + } + + static void +#ifdef KR_headers +Pnotboth(e) + Extsym *e; +#else +Pnotboth(Extsym *e) +#endif +{ + if (e->curno) + return; + Pbad++; + e->curno = 1; + fprintf(stderr, + "%s cannot be both a procedure and a common block (line %ld of %s)\n", + e->fextname, Plineno, Pfname); + } + + static int +#ifdef KR_headers +numread(pf, n) + register FILE *pf; + int *n; +#else +numread(register FILE *pf, int *n) +#endif +{ + register int c, k; + + if ((c = getc(pf)) < '0' || c > '9') + return c; + k = c - '0'; + for(;;) { + if ((c = getc(pf)) == ' ') { + *n = k; + return c; + } + if (c < '0' || c > '9') + break; + k = 10*k + c - '0'; + } + return c; + } + + static void argverify Argdcl((int, Extsym*)); + static void Pbadret Argdcl((int ftype, Extsym *p)); + + static int +#ifdef KR_headers +readref(pf, e, ftype) + register FILE *pf; + Extsym *e; + int ftype; +#else +readref(register FILE *pf, Extsym *e, int ftype) +#endif +{ + register int c, *t; + int i, nargs, type; + Argtypes *at; + Atype *a, *ae; + + if (ftype > TYSUBR) + return 0; + if ((c = numread(pf, &nargs)) != ' ') { + if (c != ':') + return c == EOF; + /* just a typed external */ + if (e->extstg == STGUNKNOWN) { + at = 0; + goto justsym; + } + if (e->extstg == STGEXT) { + if (e->extype != ftype) + Pbadret(ftype, e); + } + else + Pnotboth(e); + return 0; + } + + tnext = tfirst; + for(i = 0; i < nargs; i++) { + if ((c = numread(pf, &type)) != ' ' + || type >= 500 + || type != TYFTNLEN + 100 && type % 100 > TYSUBR) + return c == EOF; + if (tnext >= tlast) + trealloc(); + *tnext++ = type; + } + + if (e->extstg == STGUNKNOWN) { + save_at: + at = (Argtypes *) + gmem(sizeof(Argtypes) + (nargs-1)*sizeof(Atype), 1); + at->dnargs = at->nargs = nargs; + at->changes = 0; + t = tfirst; + a = at->atypes; + for(ae = a + nargs; a < ae; a++) { + a->type = *t++; + a->cp = 0; + } + justsym: + e->extstg = STGEXT; + e->extype = ftype; + e->arginfo = at; + } + else if (e->extstg != STGEXT) { + Pnotboth(e); + } + else if (!e->arginfo) { + if (e->extype != ftype) + Pbadret(ftype, e); + else + goto save_at; + } + else + argverify(ftype, e); + return 0; + } + + static int +#ifdef KR_headers +comlen(pf) + register FILE *pf; +#else +comlen(register FILE *pf) +#endif +{ + register int c; + register char *s, *se; + char buf[128], cbuf[128]; + int refread; + long L; + Extsym *e; + + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') { + refread = 0; + s = "comlen "; + } + else if (c == ':') { + refread = 1; + s = "ref: "; + } + else { + ret0: + if (c == '*') + ungetc(c,pf); + return 0; + } + while(*s) { + if ((c = getc(pf)) == EOF) + return 1; + if (c != *s++) + goto ret0; + } + s = buf; + se = buf + sizeof(buf) - 1; + for(;;) { + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') + break; + if (s >= se || Pct[c] != P_anum) + goto ret0; + *s++ = c; + } + *s-- = 0; + if (s <= buf || *s != '_') + return 0; + strcpy(cbuf,buf); + *s-- = 0; + if (*s == '_') { + *s-- = 0; + if (s <= buf) + return 0; + } + for(L = 0;;) { + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') + break; + if (c < '0' || c > '9') + goto ret0; + L = 10*L + c - '0'; + } + if (!L && !refread) + return 0; + e = mkext1(buf, cbuf); + if (refread) + return readref(pf, e, (int)L); + if (e->extstg == STGUNKNOWN) { + e->extstg = STGCOMMON; + e->maxleng = L; + } + else if (e->extstg != STGCOMMON) + Pnotboth(e); + else if (e->maxleng != L) { + fprintf(stderr, + "incompatible lengths for common block %s (line %ld of %s)\n", + buf, Plineno, Pfname); + if (e->maxleng < L) + e->maxleng = L; + } + return 0; + } + + static int +#ifdef KR_headers +Ptoken(pf, canend) + FILE *pf; + int canend; +#else +Ptoken(FILE *pf, int canend) +#endif +{ + register int c; + register char *s, *se; + + top: + for(;;) { + c = getc(pf); + if (c == EOF) { + if (canend) + return 0; + goto badeof; + } + if (Pct[c] != P_space) + break; + if (c == '\n') + Plineno++; + } + switch(Pct[c]) { + case P_anum: + if (c == '_') + badchar(c); + s = Ptok; + se = s + sizeof(Ptok) - 1; + do { + if (s < se) + *s++ = c; + if ((c = getc(pf)) == EOF) { + badeof: + fprintf(stderr, + "unexpected end of file in %s\n", + Pfname); + exit(2); + } + } + while(Pct[c] == P_anum); + ungetc(c,pf); + *s = 0; + return P_anum; + + case P_delim: + return c; + + case P_slash: + if ((c = getc(pf)) != '*') { + if (c == EOF) + goto badeof; + badchar('/'); + } + if (canend && comlen(pf)) + goto badeof; + for(;;) { + while((c = getc(pf)) != '*') { + if (c == EOF) + goto badeof; + if (c == '\n') + Plineno++; + } + slashseek: + switch(getc(pf)) { + case '/': + goto top; + case EOF: + goto badeof; + case '*': + goto slashseek; + } + } + default: + badchar(c); + } + /* NOT REACHED */ + return 0; + } + + static int +Pftype(Void) +{ + switch(Ptok[0]) { + case 'C': + if (!strcmp(Ptok+1, "_f")) + return TYCOMPLEX; + break; + case 'E': + if (!strcmp(Ptok+1, "_f")) { + /* TYREAL under forcedouble */ + checkreal(1); + return TYREAL; + } + break; + case 'H': + if (!strcmp(Ptok+1, "_f")) + return TYCHAR; + break; + case 'Z': + if (!strcmp(Ptok+1, "_f")) + return TYDCOMPLEX; + break; + case 'd': + if (!strcmp(Ptok+1, "oublereal")) + return TYDREAL; + break; + case 'i': + if (!strcmp(Ptok+1, "nt")) + return TYSUBR; + if (!strcmp(Ptok+1, "nteger")) + return TYLONG; + if (!strcmp(Ptok+1, "nteger1")) + return TYINT1; + break; + case 'l': + if (!strcmp(Ptok+1, "ogical")) { + checklogical(1); + return TYLOGICAL; + } + if (!strcmp(Ptok+1, "ogical1")) + return TYLOGICAL1; +#ifdef TYQUAD + if (!strcmp(Ptok+1, "ongint")) + return TYQUAD; +#endif + break; + case 'r': + if (!strcmp(Ptok+1, "eal")) { + checkreal(0); + return TYREAL; + } + break; + case 's': + if (!strcmp(Ptok+1, "hortint")) + return TYSHORT; + if (!strcmp(Ptok+1, "hortlogical")) { + checklogical(0); + return TYLOGICAL2; + } + break; + } + bad_type(); + /* NOT REACHED */ + return 0; + } + + static void +#ifdef KR_headers +wanted(i, what) + int i; + char *what; +#else +wanted(int i, char *what) +#endif +{ + if (i != P_anum) { + Ptok[0] = i; + Ptok[1] = 0; + } + fprintf(stderr,"Error: expected %s, not \"%s\" (line %ld of %s)\n", + what, Ptok, Plineno, Pfname); + exit(2); + } + + static int +#ifdef KR_headers +Ptype(pf) + FILE *pf; +#else +Ptype(FILE *pf) +#endif +{ + int i, rv; + + i = Ptoken(pf,0); + if (i == ')') + return 0; + if (i != P_anum) + badchar(i); + + rv = 0; + switch(Ptok[0]) { + case 'C': + if (!strcmp(Ptok+1, "_fp")) + rv = TYCOMPLEX+200; + break; + case 'D': + if (!strcmp(Ptok+1, "_fp")) + rv = TYDREAL+200; + break; + case 'E': + case 'R': + if (!strcmp(Ptok+1, "_fp")) + rv = TYREAL+200; + break; + case 'H': + if (!strcmp(Ptok+1, "_fp")) + rv = TYCHAR+200; + break; + case 'I': + if (!strcmp(Ptok+1, "_fp")) + rv = TYLONG+200; + else if (!strcmp(Ptok+1, "1_fp")) + rv = TYINT1+200; +#ifdef TYQUAD + else if (!strcmp(Ptok+1, "8_fp")) + rv = TYQUAD+200; +#endif + break; + case 'J': + if (!strcmp(Ptok+1, "_fp")) + rv = TYSHORT+200; + break; + case 'K': + checklogical(0); + goto Logical; + case 'L': + checklogical(1); + Logical: + if (!strcmp(Ptok+1, "_fp")) + rv = TYLOGICAL+200; + else if (!strcmp(Ptok+1, "1_fp")) + rv = TYLOGICAL1+200; + else if (!strcmp(Ptok+1, "2_fp")) + rv = TYLOGICAL2+200; + break; + case 'S': + if (!strcmp(Ptok+1, "_fp")) + rv = TYSUBR+200; + break; + case 'U': + if (!strcmp(Ptok+1, "_fp")) + rv = TYUNKNOWN+300; + break; + case 'Z': + if (!strcmp(Ptok+1, "_fp")) + rv = TYDCOMPLEX+200; + break; + case 'c': + if (!strcmp(Ptok+1, "har")) + rv = TYCHAR; + else if (!strcmp(Ptok+1, "omplex")) + rv = TYCOMPLEX; + break; + case 'd': + if (!strcmp(Ptok+1, "oublereal")) + rv = TYDREAL; + else if (!strcmp(Ptok+1, "oublecomplex")) + rv = TYDCOMPLEX; + break; + case 'f': + if (!strcmp(Ptok+1, "tnlen")) + rv = TYFTNLEN+100; + break; + case 'i': + if (!strncmp(Ptok+1, "nteger", 6)) { + if (!Ptok[7]) + rv = TYLONG; + else if (Ptok[7] == '1' && !Ptok[8]) + rv = TYINT1; + } + break; + case 'l': + if (!strncmp(Ptok+1, "ogical", 6)) { + if (!Ptok[7]) { + checklogical(1); + rv = TYLOGICAL; + } + else if (Ptok[7] == '1' && !Ptok[8]) + rv = TYLOGICAL1; + } +#ifdef TYQUAD + else if (!strcmp(Ptok+1,"ongint")) + rv = TYQUAD; +#endif + break; + case 'r': + if (!strcmp(Ptok+1, "eal")) + rv = TYREAL; + break; + case 's': + if (!strcmp(Ptok+1, "hortint")) + rv = TYSHORT; + else if (!strcmp(Ptok+1, "hortlogical")) { + checklogical(0); + rv = TYLOGICAL2; + } + break; + case 'v': + if (tnext == tfirst && !strcmp(Ptok+1, "oid")) { + if ((i = Ptoken(pf,0)) != /*(*/ ')') + wanted(i, /*(*/ "\")\""); + return 0; + } + } + if (!rv) + bad_type(); + if (rv < 100 && (i = Ptoken(pf,0)) != '*') + wanted(i, "\"*\""); + if ((i = Ptoken(pf,0)) == P_anum) + i = Ptoken(pf,0); /* skip variable name */ + switch(i) { + case ')': + ungetc(i,pf); + break; + case ',': + break; + default: + wanted(i, "\",\" or \")\""); + } + return rv; + } + + static char * +trimunder(Void) +{ + register char *s; + register int n; + static char buf[128]; + + s = Ptok + strlen(Ptok) - 1; + if (*s != '_') { + fprintf(stderr, + "warning: %s does not end in _ (line %ld of %s)\n", + Ptok, Plineno, Pfname); + return Ptok; + } + if (s[-1] == '_') + s--; + strncpy(buf, Ptok, n = s - Ptok); + buf[n] = 0; + return buf; + } + + static void +#ifdef KR_headers +Pbadmsg(msg, p) + char *msg; + Extsym *p; +#else +Pbadmsg(char *msg, Extsym *p) +#endif +{ + Pbad++; + fprintf(stderr, "%s for %s (line %ld of %s):\n\t", msg, + p->fextname, Plineno, Pfname); + p->arginfo->nargs = -1; + } + + static void +#ifdef KR_headers +Pbadret(ftype, p) + int ftype; + Extsym *p; +#else +Pbadret(int ftype, Extsym *p) +#endif +{ + char buf1[32], buf2[32]; + + Pbadmsg("inconsistent types",p); + fprintf(stderr, "here %s, previously %s\n", + Argtype(ftype+200,buf1), + Argtype(p->extype+200,buf2)); + } + + static void +#ifdef KR_headers +argverify(ftype, p) + int ftype; + Extsym *p; +#else +argverify(int ftype, Extsym *p) +#endif +{ + Argtypes *at; + register Atype *aty; + int i, j, k; + register int *t, *te; + char buf1[32], buf2[32]; + + at = p->arginfo; + if (at->nargs < 0) + return; + if (p->extype != ftype) { + Pbadret(ftype, p); + return; + } + t = tfirst; + te = tnext; + i = te - t; + if (at->nargs != i) { + j = at->nargs; + Pbadmsg("differing numbers of arguments",p); + fprintf(stderr, "here %d, previously %d\n", + i, j); + return; + } + for(aty = at->atypes; t < te; t++, aty++) { + if (*t == aty->type) + continue; + j = aty->type; + k = *t; + if (k >= 300 || k == j) + continue; + if (j >= 300) { + if (k >= 200) { + if (k == TYUNKNOWN + 200) + continue; + if (j % 100 != k - 200 + && k != TYSUBR + 200 + && j != TYUNKNOWN + 300 + && !type_fixup(at,aty,k)) + goto badtypes; + } + else if (j % 100 % TYSUBR != k % TYSUBR + && !type_fixup(at,aty,k)) + goto badtypes; + } + else if (k < 200 || j < 200) + goto badtypes; + else if (k == TYUNKNOWN+200) + continue; + else if (j != TYUNKNOWN+200) + { + badtypes: + Pbadmsg("differing calling sequences",p); + i = t - tfirst + 1; + fprintf(stderr, + "arg %d: here %s, prevously %s\n", + i, Argtype(k,buf1), Argtype(j,buf2)); + return; + } + /* We've subsequently learned the right type, + as in the call on zoo below... + + subroutine foo(x, zap) + external zap + call goo(zap) + x = zap(3) + call zoo(zap) + end + */ + aty->type = k; + at->changes = 1; + } + } + + static void +#ifdef KR_headers +newarg(ftype, p) + int ftype; + Extsym *p; +#else +newarg(int ftype, Extsym *p) +#endif +{ + Argtypes *at; + register Atype *aty; + register int *t, *te; + int i, k; + + if (p->extstg == STGCOMMON) { + Pnotboth(p); + return; + } + p->extstg = STGEXT; + p->extype = ftype; + p->exproto = 1; + t = tfirst; + te = tnext; + i = te - t; + k = sizeof(Argtypes) + (i-1)*sizeof(Atype); + at = p->arginfo = (Argtypes *)gmem(k,1); + at->dnargs = at->nargs = i; + at->defined = at->changes = 0; + for(aty = at->atypes; t < te; aty++) { + aty->type = *t++; + aty->cp = 0; + } + } + + static int +#ifdef KR_headers +Pfile(fname) + char *fname; +#else +Pfile(char *fname) +#endif +{ + char *s; + int ftype, i; + FILE *pf; + Extsym *p; + + for(s = fname; *s; s++); + if (s - fname < 2 + || s[-2] != '.' + || (s[-1] != 'P' && s[-1] != 'p')) + return 0; + + if (!(pf = fopen(fname, textread))) { + fprintf(stderr, "can't open %s\n", fname); + exit(2); + } + Pfname = fname; + Plineno = 1; + if (!Pct[' ']) { + for(s = " \t\n\r\v\f"; *s; s++) + Pct[*s] = P_space; + for(s = "*,();"; *s; s++) + Pct[*s] = P_delim; + for(i = '0'; i <= '9'; i++) + Pct[i] = P_anum; + for(s = "abcdefghijklmnopqrstuvwxyz"; i = *s; s++) + Pct[i] = Pct[i+'A'-'a'] = P_anum; + Pct['_'] = P_anum; + Pct['/'] = P_slash; + } + + for(;;) { + if (!(i = Ptoken(pf,1))) + break; + if (i != P_anum + || !strcmp(Ptok, "extern") && (i = Ptoken(pf,0)) != P_anum) + badchar(i); + ftype = Pftype(); + getname: + if ((i = Ptoken(pf,0)) != P_anum) + badchar(i); + p = mkext1(trimunder(), Ptok); + + if ((i = Ptoken(pf,0)) != '(') + badchar(i); + tnext = tfirst; + while(i = Ptype(pf)) { + if (tnext >= tlast) + trealloc(); + *tnext++ = i; + } + if (p->arginfo) { + argverify(ftype, p); + if (p->arginfo->nargs < 0) + newarg(ftype, p); + } + else + newarg(ftype, p); + p->arginfo->defined = 1; + i = Ptoken(pf,0); + switch(i) { + case ';': + break; + case ',': + goto getname; + default: + wanted(i, "\";\" or \",\""); + } + } + fclose(pf); + return 1; + } + + void +#ifdef KR_headers +read_Pfiles(ffiles) + char **ffiles; +#else +read_Pfiles(char **ffiles) +#endif +{ + char **f1files, **f1files0, *s; + int k; + register Extsym *e, *ee; + register Argtypes *at; + extern int retcode; + + f1files0 = f1files = ffiles; + while(s = *ffiles++) + if (!Pfile(s)) + *f1files++ = s; + if (Pbad) + retcode = 8; + if (tfirst) { + free((char *)tfirst); + /* following should be unnecessary, as we won't be back here */ + tfirst = tnext = tlast = 0; + tmax = 0; + } + *f1files = 0; + if (f1files == f1files0) + f1files[1] = 0; + + k = 0; + ee = nextext; + for (e = extsymtab; e < ee; e++) + if (e->extstg == STGEXT + && (at = e->arginfo)) { + if (at->nargs < 0 || at->changes) + k++; + at->changes = 2; + } + if (k) { + fprintf(diagfile, + "%d prototype%s updated while reading prototypes.\n", k, + k > 1 ? "s" : ""); + } + fflush(diagfile); + } diff --git a/tools/connec/src/pread.o b/tools/connec/src/pread.o new file mode 100644 index 0000000000000000000000000000000000000000..c4f936bd620502302687e77520d1837ab246dd37 GIT binary patch literal 21904 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 + return; + q->vtypewarned = 1; + qtype = q->vtype; + e = &extsymtab[q->vardesc.varno]; + if (!(at = e->arginfo)) { + if (!e->exused) + return; + } + else if (at->changes & 2 && qtype != TYUNKNOWN && !at->defined) + proc_protochanges++; + type1 = e->extype; + if (type1 == TYUNKNOWN) + return; + if (qtype == TYUNKNOWN) + /* e.g., + subroutine foo + end + external foo + call goo(foo) + end + */ + return; + sprintf(buf, "%.90s: inconsistent declarations:\n\ + here %s%s, previously %s%s.", q->fvarname, ftn_types[qtype], + qtype == TYSUBR ? "" : " function", + ftn_types[type1], type1 == TYSUBR ? "" : " function"); + warn(buf); + } + + void +#ifdef KR_headers +unamstring(q, s) + register Addrp q; + register char *s; +#else +unamstring(register Addrp q, register char *s) +#endif +{ + register int k; + register char *t; + + k = strlen(s); + if (k < IDENT_LEN) { + q->uname_tag = UNAM_IDENT; + t = q->user.ident; + } + else { + q->uname_tag = UNAM_CHARP; + q->user.Charp = t = mem(k+1, 0); + } + strcpy(t, s); + } + + static void +fix_entry_returns(Void) /* for multiple entry points */ +{ + Addrp a; + int i; + struct Entrypoint *e; + Namep np; + + e = entries = (struct Entrypoint *)revchain((chainp)entries); + allargs = revchain(allargs); + if (!multitype) + return; + + /* TYLOGICAL should have been turned into TYLONG or TYSHORT by now */ + + for(i = TYINT1; i <= TYLOGICAL; i++) + if (a = xretslot[i]) + sprintf(a->user.ident, "(*ret_val).%s", + postfix[i-TYINT1]); + + do { + np = e->enamep; + switch(np->vtype) { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + case TYREAL: + case TYDREAL: + case TYCOMPLEX: + case TYDCOMPLEX: + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + np->vstg = STGARG; + } + } + while(e = e->entnextp); + } + + static void +#ifdef KR_headers +putentries(outfile) + FILE *outfile; +#else +putentries(FILE *outfile) +#endif + /* put out wrappers for multiple entries */ +{ + char base[MAXNAMELEN+4]; + struct Entrypoint *e; + Namep *A, *Ae, *Ae1, **Alp, *a, **a1, np; + chainp args, lengths; + int i, k, mt, nL, t, type; + extern char *dfltarg[], **dfltproc; + + e = entries; + if (!e->enamep) /* only possible with erroneous input */ + return; + nL = (nallargs + nallchargs) * sizeof(Namep *); + if (!nL) + nL = 8; + A = (Namep *)ckalloc(nL + nallargs*sizeof(Namep **)); + Ae = A + nallargs; + Alp = (Namep **)(Ae1 = Ae + nallchargs); + i = k = 0; + for(a1 = Alp, args = allargs; args; a1++, args = args->nextp) { + np = (Namep)args->datap; + if (np->vtype == TYCHAR && np->vclass != CLPROC) + *a1 = &Ae[i++]; + } + + mt = multitype; + multitype = 0; + sprintf(base, "%s0_", e->enamep->cvarname); + do { + np = e->enamep; + lengths = length_comp(e, 0); + proctype = type = np->vtype; + if (protofile) + protowrite(protofile, type, np->cvarname, e, lengths); + nice_printf(outfile, "\n%s ", c_type_decl(type, 1)); + nice_printf(outfile, "%s", np->cvarname); + if (!Ansi) { + listargs(outfile, e, 0, lengths); + nice_printf(outfile, "\n"); + } + list_arg_types(outfile, e, lengths, 0, "\n"); + nice_printf(outfile, "{\n"); + frchain(&lengths); + next_tab(outfile); + if (mt) + nice_printf(outfile, + "Multitype ret_val;\n%s(%d, &ret_val", + base, k); /*)*/ + else if (ISCOMPLEX(type)) + nice_printf(outfile, "%s(%d,%s", base, k, + xretslot[type]->user.ident); /*)*/ + else if (type == TYCHAR) + nice_printf(outfile, + "%s(%d, ret_val, ret_val_len", base, k); /*)*/ + else + nice_printf(outfile, "return %s(%d", base, k); /*)*/ + k++; + memset((char *)A, 0, nL); + for(args = e->arglist; args; args = args->nextp) { + np = (Namep)args->datap; + A[np->argno] = np; + if (np->vtype == TYCHAR && np->vclass != CLPROC) + *Alp[np->argno] = np; + } + args = allargs; + for(a = A; a < Ae; a++, args = args->nextp) { + t = ((Namep)args->datap)->vtype; + nice_printf(outfile, ", %s", (np = *a) + ? np->cvarname + : ((Namep)args->datap)->vclass == CLPROC + ? dfltproc[((Namep)args->datap)->vimpltype + ? (Castargs ? TYUNKNOWN : TYSUBR) + : t == TYREAL && forcedouble && !Castargs + ? TYDREAL : t] + : dfltarg[((Namep)args->datap)->vtype]); + } + for(; a < Ae1; a++) + if (np = *a) + nice_printf(outfile, ", %s", + new_arg_length(np)); + else + nice_printf(outfile, ", (ftnint)0"); + nice_printf(outfile, /*(*/ ");\n"); + if (mt) { + if (type == TYCOMPLEX) + nice_printf(outfile, + "r_v->r = ret_val.c.r; r_v->i = ret_val.c.i;\n"); + else if (type == TYDCOMPLEX) + nice_printf(outfile, + "r_v->r = ret_val.z.r; r_v->i = ret_val.z.i;\n"); + else if (type <= TYLOGICAL) + nice_printf(outfile, "return ret_val.%s;\n", + postfix[type-TYINT1]); + } + nice_printf(outfile, "}\n"); + prev_tab(outfile); + } + while(e = e->entnextp); + free((char *)A); + } + + static void +#ifdef KR_headers +entry_goto(outfile) + FILE *outfile; +#else +entry_goto(FILE *outfile) +#endif +{ + struct Entrypoint *e = entries; + int k = 0; + + nice_printf(outfile, "switch(n__) {\n"); + next_tab(outfile); + while(e = e->entnextp) + nice_printf(outfile, "case %d: goto %s;\n", ++k, + user_label((long)(extsymtab - e->entryname - 1))); + nice_printf(outfile, "}\n\n"); + prev_tab(outfile); + } + +/* start a new procedure */ + + void +newproc(Void) +{ + if(parstate != OUTSIDE) + { + execerr("missing end statement", CNULL); + endproc(); + } + + parstate = INSIDE; + procclass = CLMAIN; /* default */ +} + + static void +zap_changes(Void) +{ + register chainp cp; + register Argtypes *at; + + /* arrange to get correct count of prototypes that would + change by running f2c again */ + + if (prev_proc && proc_argchanges) + proc_protochanges++; + prev_proc = proc_argchanges = 0; + for(cp = new_procs; cp; cp = cp->nextp) + if (at = ((Namep)cp->datap)->arginfo) + at->changes &= ~1; + frchain(&new_procs); + } + +/* end of procedure. generate variables, epilogs, and prologs */ + + void +endproc(Void) +{ + struct Labelblock *lp; + Extsym *ext; + + if(parstate < INDATA) + enddcl(); + if(ctlstack >= ctls) + err("DO loop or BLOCK IF not closed"); + for(lp = labeltab ; lp < labtabend ; ++lp) + if(lp->stateno!=0 && lp->labdefined==NO) + errstr("missing statement label %s", + convic(lp->stateno) ); + +/* Save copies of the common variables in extptr -> allextp */ + + for (ext = extsymtab; ext < nextext; ext++) + if (ext -> extstg == STGCOMMON && ext -> extp) { + extern int usedefsforcommon; + +/* Write out the abbreviations for common block reference */ + + copy_data (ext -> extp); + if (usedefsforcommon) { + wr_abbrevs (c_file, 1, ext -> extp); + ext -> used_here = 1; + } + else + ext -> extp = CHNULL; + + } + + if (nentry > 1) + fix_entry_returns(); + epicode(); + donmlist(); + dobss(); + start_formatting (); + if (nentry > 1) + putentries(c_file); + + zap_changes(); + procinit(); /* clean up for next procedure */ +} + + + +/* End of declaration section of procedure. Allocate storage. */ + + void +enddcl(Void) +{ + register struct Entrypoint *ep; + struct Entrypoint *ep0; + chainp cp; + extern char *err_proc; + static char comblks[] = "common blocks"; + + err_proc = comblks; + docommon(); + +/* Now the hash table entries for fields of common blocks have STGCOMMON, + vdcldone, voffset, and varno. And the common blocks themselves have + their full sizes in extleng. */ + + err_proc = "equivalences"; + doequiv(); + + err_proc = comblks; + docomleng(); + +/* This implies that entry points in the declarations are buffered in + entries but not written out */ + + err_proc = "entries"; + if (ep = ep0 = (struct Entrypoint *)revchain((chainp)entries)) { + /* entries could be 0 in case of an error */ + do doentry(ep); + while(ep = ep->entnextp); + entries = (struct Entrypoint *)revchain((chainp)ep0); + } + + err_proc = 0; + parstate = INEXEC; + p1put(P1_PROCODE); + freetemps(); + if (earlylabs) { + for(cp = earlylabs = revchain(earlylabs); cp; cp = cp->nextp) + p1_label((Addr)cp->datap); + frchain(&earlylabs); + } + p1_line_number(lineno); /* for files that start with a MAIN program */ + /* that starts with an executable statement */ +} + +/* ROUTINES CALLED WHEN ENCOUNTERING ENTRY POINTS */ + +/* Main program or Block data */ + + void +#ifdef KR_headers +startproc(progname, Class) + Extsym *progname; + int Class; +#else +startproc(Extsym *progname, int Class) +#endif +{ + register struct Entrypoint *p; + + p = ALLOC(Entrypoint); + if(Class == CLMAIN) { + puthead(CNULL, CLMAIN); + if (progname) + strcpy (main_alias, progname->cextname); + } else { + if (progname) { + /* Construct an empty subroutine with this name */ + /* in case the name is needed to force loading */ + /* of this block-data subprogram: the name can */ + /* appear elsewhere in an external statement. */ + entrypt(CLPROC, TYSUBR, (ftnint)0, progname, (chainp)0); + endproc(); + newproc(); + } + puthead(CNULL, CLBLOCK); + } + if(Class == CLMAIN) + newentry( mkname(" MAIN"), 0 )->extinit = 1; + p->entryname = progname; + entries = p; + + procclass = Class; + fprintf(diagfile, " %s", (Class==CLMAIN ? "MAIN" : "BLOCK DATA") ); + if(progname) { + fprintf(diagfile, " %s", progname->fextname); + procname = progname->cextname; + } + fprintf(diagfile, ":\n"); + fflush(diagfile); +} + +/* subroutine or function statement */ + + Extsym * +#ifdef KR_headers +newentry(v, substmsg) + register Namep v; + int substmsg; +#else +newentry(register Namep v, int substmsg) +#endif +{ + register Extsym *p; + char buf[128], badname[64]; + static int nbad = 0; + static char already[] = "external name already used"; + + p = mkext(v->fvarname, addunder(v->cvarname)); + + if(p->extinit || ! ONEOF(p->extstg, M(STGUNKNOWN)|M(STGEXT)) ) + { + sprintf(badname, "%s_bad%d", v->fvarname, ++nbad); + if (substmsg) { + sprintf(buf,"%s\n\tsubstituting \"%s\"", + already, badname); + dclerr(buf, v); + } + else + dclerr(already, v); + p = mkext(v->fvarname, badname); + } + v->vstg = STGAUTO; + v->vprocclass = PTHISPROC; + v->vclass = CLPROC; + if (p->extstg == STGEXT) + prev_proc = 1; + else + p->extstg = STGEXT; + p->extinit = YES; + v->vardesc.varno = p - extsymtab; + return(p); +} + + void +#ifdef KR_headers +entrypt(Class, type, length, entry, args) + int Class; + int type; + ftnint length; + Extsym *entry; + chainp args; +#else +entrypt(int Class, int type, ftnint length, Extsym *entry, chainp args) +#endif +{ + register Namep q; + register struct Entrypoint *p; + + if(Class != CLENTRY) + puthead( procname = entry->cextname, Class); + else + fprintf(diagfile, " entry "); + fprintf(diagfile, " %s:\n", entry->fextname); + fflush(diagfile); + q = mkname(entry->fextname); + if (type == TYSUBR) + q->vstg = STGEXT; + + type = lengtype(type, length); + if(Class == CLPROC) + { + procclass = CLPROC; + proctype = type; + procleng = type == TYCHAR ? length : 0; + } + + p = ALLOC(Entrypoint); + + p->entnextp = entries; + entries = p; + + p->entryname = entry; + p->arglist = revchain(args); + p->enamep = q; + + if(Class == CLENTRY) + { + Class = CLPROC; + if(proctype == TYSUBR) + type = TYSUBR; + } + + q->vclass = Class; + q->vprocclass = 0; + settype(q, type, length); + q->vprocclass = PTHISPROC; + /* hold all initial entry points till end of declarations */ + if(parstate >= INDATA) + doentry(p); +} + +/* generate epilogs */ + +/* epicode -- write out the proper function return mechanism at the end of + the procedure declaration. Handles multiple return value types, as + well as cooercion into the proper value */ + + LOCAL void +epicode(Void) +{ + extern int lastwasbranch; + + if(procclass==CLPROC) + { + if(proctype==TYSUBR) + { + +/* Return a zero only when the alternate return mechanism has been + specified in the function header */ + + if ((substars || Ansi) && lastwasbranch != YES) + p1_subr_ret (ICON(0)); + } + else if (!multitype && lastwasbranch != YES) + retval(proctype); + } + else if (procclass == CLMAIN && Ansi && lastwasbranch != YES) + p1_subr_ret (ICON(0)); + lastwasbranch = NO; +} + + +/* generate code to return value of type t */ + + LOCAL void +#ifdef KR_headers +retval(t) + register int t; +#else +retval(register int t) +#endif +{ + register Addrp p; + + switch(t) + { + case TYCHAR: + case TYCOMPLEX: + case TYDCOMPLEX: + break; + + case TYLOGICAL: + t = tylogical; + case TYINT1: + case TYADDR: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD + case TYQUAD: +#endif + case TYREAL: + case TYDREAL: + case TYLOGICAL1: + case TYLOGICAL2: + p = (Addrp) cpexpr((expptr)retslot); + p->vtype = t; + p1_subr_ret (mkconv (t, fixtype((expptr)p))); + break; + + default: + badtype("retval", t); + } +} + + +/* Do parameter adjustments */ + + void +#ifdef KR_headers +procode(outfile) + FILE *outfile; +#else +procode(FILE *outfile) +#endif +{ + prolog(outfile, allargs); + + if (nentry > 1) + entry_goto(outfile); + } + + static void +#ifdef KR_headers +bad_dimtype(q) Namep q; +#else +bad_dimtype(Namep q) +#endif +{ + errstr("bad dimension type for %.70s", q->fvarname); + } + +/* Finish bound computations now that all variables are declared. + * This used to be in setbound(), but under -u the following incurred + * an erroneous error message: + * subroutine foo(x,n) + * real x(n) + * integer n + */ + + static void +#ifdef KR_headers +dim_finish(v) + Namep v; +#else +dim_finish(Namep v) +#endif +{ + register struct Dimblock *p; + register expptr q; + register int i, nd; + + p = v->vdim; + v->vdimfinish = 0; + nd = p->ndim; + doin_setbound = 1; + for(i = 0; i < nd; i++) + if (q = p->dims[i].dimexpr) { + q = p->dims[i].dimexpr = make_int_expr(putx(fixtype(q))); + if (!ONEOF(q->headblock.vtype, MSKINT|MSKREAL)) + bad_dimtype(v); + } + if (q = p->basexpr) + p->basexpr = make_int_expr(putx(fixtype(q))); + doin_setbound = 0; + } + + static void +#ifdef KR_headers +duparg(q) + Namep q; +#else +duparg(Namep q) +#endif +{ errstr("duplicate argument %.80s", q->fvarname); } + +/* + manipulate argument lists (allocate argument slot positions) + * keep track of return types and labels + */ + + LOCAL void +#ifdef KR_headers +doentry(ep) + struct Entrypoint *ep; +#else +doentry(struct Entrypoint *ep) +#endif +{ + register int type; + register Namep np; + chainp p, p1; + register Namep q; + Addrp rs; + int it, k; + extern char dflttype[26]; + Extsym *entryname = ep->entryname; + + if (++nentry > 1) + p1_label((long)(extsymtab - entryname - 1)); + +/* The main program isn't allowed to have parameters, so any given + parameters are ignored */ + + if(procclass == CLMAIN && !ep->arglist || procclass == CLBLOCK) + return; + + /* Entry points in MAIN are an error, but we process them here */ + /* to prevent faults elsewhere. */ + +/* So now we're working with something other than CLMAIN or CLBLOCK. + Determine the type of its return value. */ + + impldcl( np = mkname(entryname->fextname) ); + type = np->vtype; + proc_argchanges = prev_proc && type != entryname->extype; + entryname->extseen = 1; + if(proctype == TYUNKNOWN) + if( (proctype = type) == TYCHAR) + procleng = np->vleng ? np->vleng->constblock.Const.ci + : (ftnint) (-1); + + if(proctype == TYCHAR) + { + if(type != TYCHAR) + err("noncharacter entry of character function"); + +/* Functions returning type char can only have multiple entries if all + entries return the same length */ + + else if( (np->vleng ? np->vleng->constblock.Const.ci : + (ftnint) (-1)) != procleng) + err("mismatched character entry lengths"); + } + else if(type == TYCHAR) + err("character entry of noncharacter function"); + else if(type != proctype) + multitype = YES; + if(rtvlabel[type] == 0) + rtvlabel[type] = (int)newlabel(); + ep->typelabel = rtvlabel[type]; + + if(type == TYCHAR) + { + if(chslot < 0) + { + chslot = nextarg(TYADDR); + chlgslot = nextarg(TYLENG); + } + np->vstg = STGARG; + +/* Put a new argument in the function, one which will hold the result of + a character function. This will have to be named sometime, probably in + mkarg(). */ + + if(procleng < 0) { + np->vleng = (expptr) mkarg(TYLENG, chlgslot); + np->vleng->addrblock.uname_tag = UNAM_IDENT; + strcpy (np -> vleng -> addrblock.user.ident, + new_func_length()); + } + if (!xretslot[TYCHAR]) { + xretslot[TYCHAR] = rs = + autovar(0, type, ISCONST(np->vleng) + ? np->vleng : ICON(0), ""); + strcpy(rs->user.ident, "ret_val"); + } + } + +/* Handle a complex return type -- declare a new parameter (pointer to + a complex value) */ + + else if( ISCOMPLEX(type) ) { + if (!xretslot[type]) + xretslot[type] = + autovar(0, type, EXNULL, " ret_val"); + /* the blank is for use in out_addr */ + np->vstg = STGARG; + if(cxslot < 0) + cxslot = nextarg(TYADDR); + } + else if (type != TYSUBR) { + if (type == TYUNKNOWN) { + dclerr("untyped function", np); + proctype = type = np->vtype = + dflttype[letter(np->fvarname[0])]; + } + if (!xretslot[type]) + xretslot[type] = retslot = + autovar(1, type, EXNULL, " ret_val"); + /* the blank is for use in out_addr */ + np->vstg = STGAUTO; + } + + for(p = ep->arglist ; p ; p = p->nextp) + if(! (( q = (Namep) (p->datap) )->vknownarg) ) { + q->vknownarg = 1; + q->vardesc.varno = nextarg(TYADDR); + allargs = mkchain((char *)q, allargs); + q->argno = nallargs++; + } + else if (nentry == 1) + duparg(q); + else for(p1 = ep->arglist ; p1 != p; p1 = p1->nextp) + if ((Namep)p1->datap == q) + duparg(q); + + k = 0; + for(p = ep->arglist ; p ; p = p->nextp) { + if(! (( q = (Namep) (p->datap) )->vdcldone) ) + { + impldcl(q); + q->vdcldone = YES; + if(q->vtype == TYCHAR) + { + +/* If we don't know the length of a char*(*) (i.e. a string), we must add + in this additional length argument. */ + + ++nallchargs; + if (q->vclass == CLPROC) + nallchargs--; + else if (q->vleng == NULL) { + /* character*(*) */ + q->vleng = (expptr) + mkarg(TYLENG, nextarg(TYLENG) ); + unamstring((Addrp)q->vleng, + new_arg_length(q)); + } + } + } + if (q->vdimfinish) + dim_finish(q); + if (q->vtype == TYCHAR && q->vclass != CLPROC) + k++; + } + + if (entryname->extype != type) + changedtype(np); + + /* save information for checking consistency of arg lists */ + + it = infertypes; + if (entryname->exproto) + infertypes = 1; + save_argtypes(ep->arglist, &entryname->arginfo, &np->arginfo, + 0, np->fvarname, STGEXT, k, np->vtype, 2); + infertypes = it; +} + + + + LOCAL int +#ifdef KR_headers +nextarg(type) + int type; +#else +nextarg(int type) +#endif +{ + type = type; /* shut up warning */ + return(lastargslot++); + } + + LOCAL void +#ifdef KR_headers +dim_check(q) + Namep q; +#else +dim_check(Namep q) +#endif +{ + register struct Dimblock *vdim = q->vdim; + register expptr nelt; + + if(!(nelt = vdim->nelt) || !ISCONST(nelt)) + dclerr("adjustable dimension on non-argument", q); + else if (!ONEOF(nelt->headblock.vtype, MSKINT|MSKREAL)) + bad_dimtype(q); + else if (ISINT(nelt->headblock.vtype) + ? nelt->constblock.Const.ci <= 0 + : nelt->constblock.Const.cd[0] <= 0.) + dclerr("nonpositive dimension", q); + } + + LOCAL void +dobss(Void) +{ + register struct Hashentry *p; + register Namep q; + int qstg, qclass, qtype; + Extsym *e; + + for(p = hashtab ; pvarp) + { + qstg = q->vstg; + qtype = q->vtype; + qclass = q->vclass; + + if( (qclass==CLUNKNOWN && qstg!=STGARG) || + (qclass==CLVAR && qstg==STGUNKNOWN) ) { + if (!(q->vis_assigned | q->vimpldovar)) + warn1("local variable %s never used", + q->fvarname); + } + else if(qclass==CLVAR && qstg==STGBSS) + { ; } + +/* Give external procedures the proper storage class */ + + else if(qclass==CLPROC && q->vprocclass==PEXTERNAL + && qstg!=STGARG) { + e = mkext(q->fvarname,addunder(q->cvarname)); + e->extstg = STGEXT; + q->vardesc.varno = e - extsymtab; + if (e->extype != qtype) + changedtype(q); + } + if(qclass==CLVAR) { + if (qstg != STGARG && q->vdim) + dim_check(q); + } /* if qclass == CLVAR */ + } + +} + + + void +donmlist(Void) +{ + register struct Hashentry *p; + register Namep q; + + for(p=hashtab; pvarp) && q->vclass==CLNAMELIST) + namelist(q); +} + + +/* iarrlen -- Returns the size of the array in bytes, or -1 */ + + ftnint +#ifdef KR_headers +iarrlen(q) + register Namep q; +#else +iarrlen(register Namep q) +#endif +{ + ftnint leng; + + leng = typesize[q->vtype]; + if(leng <= 0) + return(-1); + if(q->vdim) + if( ISICON(q->vdim->nelt) ) + leng *= q->vdim->nelt->constblock.Const.ci; + else return(-1); + if(q->vleng) + if( ISICON(q->vleng) ) + leng *= q->vleng->constblock.Const.ci; + else return(-1); + return(leng); +} + + void +#ifdef KR_headers +namelist(np) + Namep np; +#else +namelist(Namep np) +#endif +{ + register chainp q; + register Namep v; + int y; + + if (!np->visused) + return; + y = 0; + + for(q = np->varxptr.namelist ; q ; q = q->nextp) + { + vardcl( v = (Namep) (q->datap) ); + if( !ONEOF(v->vstg, MSKSTATIC) ) + dclerr("may not appear in namelist", v); + else { + v->vnamelist = 1; + v->visused = 1; + v->vsave = 1; + y = 1; + } + np->visused = y; + } +} + +/* docommon -- called at the end of procedure declarations, before + equivalences and the procedure body */ + + LOCAL void +docommon(Void) +{ + register Extsym *extptr; + register chainp q, q1; + struct Dimblock *t; + expptr neltp; + register Namep comvar; + ftnint size; + int i, k, pref, type; + extern int type_pref[]; + + for(extptr = extsymtab ; extptrextstg == STGCOMMON && (q = extptr->extp)) { + +/* If a common declaration also had a list of variables ... */ + + q = extptr->extp = revchain(q); + pref = 1; + for(k = TYCHAR; q ; q = q->nextp) + { + comvar = (Namep) (q->datap); + + if(comvar->vdcldone == NO) + vardcl(comvar); + type = comvar->vtype; + if (pref < type_pref[type]) + pref = type_pref[k = type]; + if(extptr->extleng % typealign[type] != 0) { + dclerr("common alignment", comvar); + --nerr; /* don't give bad return code for this */ +#if 0 + extptr->extleng = roundup(extptr->extleng, typealign[type]); +#endif + } /* if extptr -> extleng % */ + +/* Set the offset into the common block */ + + comvar->voffset = extptr->extleng; + comvar->vardesc.varno = extptr - extsymtab; + if(type == TYCHAR) + if (comvar->vleng) + size = comvar->vleng->constblock.Const.ci; + else { + dclerr("character*(*) in common", comvar); + size = 1; + } + else + size = typesize[type]; + if(t = comvar->vdim) + if( (neltp = t->nelt) && ISCONST(neltp) ) + size *= neltp->constblock.Const.ci; + else + dclerr("adjustable array in common", comvar); + +/* Adjust the length of the common block so far */ + + extptr->extleng += size; + } /* for */ + + extptr->extype = k; + +/* Determine curno and, if new, save this identifier chain */ + + q1 = extptr->extp; + for (q = extptr->allextp, i = 0; q; i++, q = q->nextp) + if (struct_eq((chainp)q->datap, q1)) + break; + if (q) + extptr->curno = extptr->maxno - i; + else { + extptr->curno = ++extptr->maxno; + extptr->allextp = mkchain((char *)extptr->extp, + extptr->allextp); + } + } /* if extptr -> extstg == STGCOMMON */ + +/* Now the hash table entries have STGCOMMON, vdcldone, voffset, and + varno. And the common block itself has its full size in extleng. */ + +} /* docommon */ + + +/* copy_data -- copy the Namep entries so they are available even after + the hash table is empty */ + + void +#ifdef KR_headers +copy_data(list) + chainp list; +#else +copy_data(chainp list) +#endif +{ + for (; list; list = list -> nextp) { + Namep namep = ALLOC (Nameblock); + int size, nd, i; + struct Dimblock *dp; + + cpn(sizeof(struct Nameblock), list->datap, (char *)namep); + namep->fvarname = strcpy(gmem(strlen(namep->fvarname)+1,0), + namep->fvarname); + namep->cvarname = strcmp(namep->fvarname, namep->cvarname) + ? strcpy(gmem(strlen(namep->cvarname)+1,0), namep->cvarname) + : namep->fvarname; + if (namep -> vleng) + namep -> vleng = (expptr) cpexpr (namep -> vleng); + if (namep -> vdim) { + nd = namep -> vdim -> ndim; + size = sizeof(struct Dimblock) + 2*sizeof(expptr)*(nd-1); + dp = (struct Dimblock *) ckalloc (size); + cpn(size, (char *)namep->vdim, (char *)dp); + namep -> vdim = dp; + dp->nelt = (expptr)cpexpr(dp->nelt); + for (i = 0; i < nd; i++) { + dp -> dims[i].dimsize = (expptr) cpexpr (dp -> dims[i].dimsize); + } /* for */ + } /* if */ + list -> datap = (char *) namep; + } /* for */ +} /* copy_data */ + + + + LOCAL void +docomleng(Void) +{ + register Extsym *p; + + for(p = extsymtab ; p < nextext ; ++p) + if(p->extstg == STGCOMMON) + { + if(p->maxleng!=0 && p->extleng!=0 && p->maxleng!=p->extleng + && strcmp(Blank, p->cextname) ) + warn1("incompatible lengths for common block %.60s", + p->fextname); + if(p->maxleng < p->extleng) + p->maxleng = p->extleng; + p->extleng = 0; + } +} + + +/* ROUTINES DEALING WITH AUTOMATIC AND TEMPORARY STORAGE */ + + void +#ifdef KR_headers +frtemp(p) + Addrp p; +#else +frtemp(Addrp p) +#endif +{ + /* put block on chain of temps to be reclaimed */ + holdtemps = mkchain((char *)p, holdtemps); +} + + void +freetemps(Void) +{ + register chainp p, p1; + register Addrp q; + register int t; + + p1 = holdtemps; + while(p = p1) { + q = (Addrp)p->datap; + t = q->vtype; + if (t == TYCHAR && q->varleng != 0) { + /* restore clobbered character string lengths */ + frexpr(q->vleng); + q->vleng = ICON(q->varleng); + } + p1 = p->nextp; + p->nextp = templist[t]; + templist[t] = p; + } + holdtemps = 0; + } + +/* allocate an automatic variable slot for each of nelt variables */ + + Addrp +#ifdef KR_headers +autovar(nelt0, t, lengp, name) + register int nelt0; + register int t; + expptr lengp; + char *name; +#else +autovar(register int nelt0, register int t, expptr lengp, char *name) +#endif +{ + ftnint leng; + register Addrp q; + register int nelt = nelt0 > 0 ? nelt0 : 1; + extern char *av_pfix[]; + + if(t == TYCHAR) + if( ISICON(lengp) ) + leng = lengp->constblock.Const.ci; + else { + Fatal("automatic variable of nonconstant length"); + } + else + leng = typesize[t]; + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = t; + if(t == TYCHAR) + { + q->vleng = ICON(leng); + q->varleng = leng; + } + q->vstg = STGAUTO; + q->ntempelt = nelt; + q->isarray = (nelt > 1); + q->memoffset = ICON(0); + + /* kludge for nls so we can have ret_val rather than ret_val_4 */ + if (*name == ' ') + unamstring(q, name); + else { + q->uname_tag = UNAM_IDENT; + temp_name(av_pfix[t], ++autonum[t], q->user.ident); + } + if (nelt0 > 0) + declare_new_addr (q); + return(q); +} + + +/* Returns a temporary of the appropriate type. Will reuse existing + temporaries when possible */ + + Addrp +#ifdef KR_headers +mktmpn(nelt, type, lengp) + int nelt; + register int type; + expptr lengp; +#else +mktmpn(int nelt, register int type, expptr lengp) +#endif +{ + ftnint leng; + chainp p, oldp; + register Addrp q; + extern int krparens; + + if(type==TYUNKNOWN || type==TYERROR) + badtype("mktmpn", type); + + if(type==TYCHAR) + if(lengp && ISICON(lengp) ) + leng = lengp->constblock.Const.ci; + else { + err("adjustable length"); + return( (Addrp) errnode() ); + } + else if (type > TYCHAR || type < TYADDR) { + erri("mktmpn: unexpected type %d", type); + exit(1); + } +/* + * if a temporary of appropriate shape is on the templist, + * remove it from the list and return it + */ + if (krparens == 2 && ONEOF(type,M(TYREAL)|M(TYCOMPLEX))) + type++; + for(oldp=CHNULL, p=templist[type]; p ; oldp=p, p=p->nextp) + { + q = (Addrp) (p->datap); + if(q->ntempelt==nelt && + (type!=TYCHAR || q->vleng->constblock.Const.ci==leng) ) + { + if(oldp) + oldp->nextp = p->nextp; + else + templist[type] = p->nextp; + free( (charptr) p); + return(q); + } + } + q = autovar(nelt, type, lengp, ""); + return(q); +} + + + + +/* mktmp -- create new local variable; call it something like name + lengp is taken directly, not copied */ + + Addrp +#ifdef KR_headers +mktmp(type, lengp) + int type; + expptr lengp; +#else +mktmp(int type, expptr lengp) +#endif +{ + Addrp rv; + /* arrange for temporaries to be recycled */ + /* at the end of this statement... */ + rv = mktmpn(1,type,lengp); + frtemp((Addrp)cpexpr((expptr)rv)); + return rv; +} + +/* mktmp0 omits frtemp() */ + Addrp +#ifdef KR_headers +mktmp0(type, lengp) + int type; + expptr lengp; +#else +mktmp0(int type, expptr lengp) +#endif +{ + Addrp rv; + /* arrange for temporaries to be recycled */ + /* when this Addrp is freed */ + rv = mktmpn(1,type,lengp); + rv->istemp = YES; + return rv; +} + +/* VARIOUS ROUTINES FOR PROCESSING DECLARATIONS */ + +/* comblock -- Declare a new common block. Input parameters name the block; + s will be NULL if the block is unnamed */ + + Extsym * +#ifdef KR_headers +comblock(s) + register char *s; +#else +comblock(register char *s) +#endif +{ + Extsym *p; + register char *t; + register int c, i; + char cbuf[256], *s0; + +/* Give the unnamed common block a unique name */ + + if(*s == 0) + p = mkext1(s0 = Blank, Blank); + else { + s0 = s; + t = cbuf; + for(i = 0; c = *t = *s++; t++) + if (c == '_') + i = 1; + if (i) + *t++ = '_'; + t[0] = '_'; + t[1] = 0; + p = mkext1(s0,cbuf); + } + if(p->extstg == STGUNKNOWN) + p->extstg = STGCOMMON; + else if(p->extstg != STGCOMMON) + { + errstr("%.52s cannot be a common block: it is a subprogram.", + s0); + return(0); + } + + return( p ); +} + + +/* incomm -- add a new variable to a common declaration */ + + void +#ifdef KR_headers +incomm(c, v) + Extsym *c; + Namep v; +#else +incomm(Extsym *c, Namep v) +#endif +{ + if (!c) + return; + if(v->vstg != STGUNKNOWN && !v->vimplstg) + dclerr(v->vstg == STGARG + ? "dummy arguments cannot be in common" + : "incompatible common declaration", v); + else + { + v->vstg = STGCOMMON; + c->extp = mkchain((char *)v, c->extp); + } +} + + + + +/* settype -- set the type or storage class of a Namep object. If + v -> vstg == STGUNKNOWN && type < 0, attempt to reset vstg to be + -type. This function will not change any earlier definitions in v, + in will only attempt to fill out more information give the other params */ + + void +#ifdef KR_headers +settype(v, type, length) + register Namep v; + register int type; + register ftnint length; +#else +settype(register Namep v, register int type, register ftnint length) +#endif +{ + int type1; + + if(type == TYUNKNOWN) + return; + + if(type==TYSUBR && v->vtype!=TYUNKNOWN && v->vstg==STGARG) + { + v->vtype = TYSUBR; + frexpr(v->vleng); + v->vleng = 0; + v->vimpltype = 0; + } + else if(type < 0) /* storage class set */ + { + if(v->vstg == STGUNKNOWN) + v->vstg = - type; + else if(v->vstg != -type) + dclerr("incompatible storage declarations", v); + } + else if(v->vtype == TYUNKNOWN + || v->vtype != type + && (v->vimpltype || v->vinftype || v->vinfproc)) + { + if( (v->vtype = lengtype(type, length))==TYCHAR ) + if (length>=0) + v->vleng = ICON(length); + else if (parstate >= INDATA) + v->vleng = ICON(1); /* avoid a memory fault */ + v->vimpltype = 0; + v->vinftype = 0; /* 19960709 */ + v->vinfproc = 0; /* 19960709 */ + + if (v->vclass == CLPROC) { + if (v->vstg == STGEXT + && (type1 = extsymtab[v->vardesc.varno].extype) + && type1 != v->vtype) + changedtype(v); + else if (v->vprocclass == PTHISPROC + && (parstate >= INDATA + || procclass == CLMAIN) + && !xretslot[type]) { + xretslot[type] = autovar(ONEOF(type, + MSKCOMPLEX|MSKCHAR) ? 0 : 1, type, + v->vleng, " ret_val"); + if (procclass == CLMAIN) + errstr( + "illegal use of %.60s (main program name)", + v->fvarname); + /* not completely right, but enough to */ + /* avoid memory faults; we won't */ + /* emit any C as we have illegal Fortran */ + } + } + } + else if(v->vtype != type && v->vtype != lengtype(type, length)) { + incompat: + dclerr("incompatible type declarations", v); + } + else if (type==TYCHAR) + if (v->vleng && v->vleng->constblock.Const.ci != length) + goto incompat; + else if (parstate >= INDATA) + v->vleng = ICON(1); /* avoid a memory fault */ +} + + + + + +/* lengtype -- returns the proper compiler type, given input of Fortran + type and length specifier */ + + int +#ifdef KR_headers +lengtype(type, len) + register int type; + ftnint len; +#else +lengtype(register int type, ftnint len) +#endif +{ + register int length = (int)len; + switch(type) + { + case TYREAL: + if(length == typesize[TYDREAL]) + return(TYDREAL); + if(length == typesize[TYREAL]) + goto ret; + break; + + case TYCOMPLEX: + if(length == typesize[TYDCOMPLEX]) + return(TYDCOMPLEX); + if(length == typesize[TYCOMPLEX]) + goto ret; + break; + + case TYINT1: + case TYSHORT: + case TYDREAL: + case TYDCOMPLEX: + case TYCHAR: + case TYLOGICAL1: + case TYLOGICAL2: + case TYUNKNOWN: + case TYSUBR: + case TYERROR: +#ifdef TYQUAD + case TYQUAD: +#endif + goto ret; + + case TYLOGICAL: + switch(length) { + case 0: return tylog; + case 1: return TYLOGICAL1; + case 2: return TYLOGICAL2; + case 4: goto ret; + } + break; + + case TYLONG: + if(length == 0) + return(tyint); + if (length == 1) + return TYINT1; + if(length == typesize[TYSHORT]) + return(TYSHORT); +#ifdef TYQUAD + if(length == typesize[TYQUAD] && use_tyquad) + return(TYQUAD); +#endif + if(length == typesize[TYLONG]) + goto ret; + break; + default: + badtype("lengtype", type); + } + + if(len != 0) + err("incompatible type-length combination"); + +ret: + return(type); +} + + + + + +/* setintr -- Set Intrinsic function */ + + void +#ifdef KR_headers +setintr(v) + register Namep v; +#else +setintr(register Namep v) +#endif +{ + int k; + + if(k = intrfunct(v->fvarname)) { + if ((*(struct Intrpacked *)&k).f4) + if (noextflag) + goto unknown; + else + dcomplex_seen++; + v->vardesc.varno = k; + } + else { + unknown: + dclerr("unknown intrinsic function", v); + return; + } + if(v->vstg == STGUNKNOWN) + v->vstg = STGINTR; + else if(v->vstg!=STGINTR) + dclerr("incompatible use of intrinsic function", v); + if(v->vclass==CLUNKNOWN) + v->vclass = CLPROC; + if(v->vprocclass == PUNKNOWN) + v->vprocclass = PINTRINSIC; + else if(v->vprocclass != PINTRINSIC) + dclerr("invalid intrinsic declaration", v); +} + + + +/* setext -- Set External declaration -- assume that unknowns will become + procedures */ + + void +#ifdef KR_headers +setext(v) + register Namep v; +#else +setext(register Namep v) +#endif +{ + if(v->vclass == CLUNKNOWN) + v->vclass = CLPROC; + else if(v->vclass != CLPROC) + dclerr("invalid external declaration", v); + + if(v->vprocclass == PUNKNOWN) + v->vprocclass = PEXTERNAL; + else if(v->vprocclass != PEXTERNAL) + dclerr("invalid external declaration", v); +} /* setext */ + + + + +/* create dimensions block for array variable */ + + void +#ifdef KR_headers +setbound(v, nd, dims) + register Namep v; + int nd; + struct Dims *dims; +#else +setbound(Namep v, int nd, struct Dims *dims) +#endif +{ + expptr q, q0, t; + struct Dimblock *p; + int i; + extern chainp new_vars; + char buf[256]; + + if(v->vclass == CLUNKNOWN) + v->vclass = CLVAR; + else if(v->vclass != CLVAR) + { + dclerr("only variables may be arrays", v); + return; + } + + v->vdim = p = (struct Dimblock *) + ckalloc( sizeof(int) + (3+2*nd)*sizeof(expptr) ); + p->ndim = nd--; + p->nelt = ICON(1); + doin_setbound = 1; + + if (noextflag) + for(i = 0; i <= nd; i++) + if (((q = dims[i].lb) && !ISINT(q->headblock.vtype)) + || ((q = dims[i].ub) && !ISINT(q->headblock.vtype))) { + sprintf(buf, "dimension %d of %s is not an integer.", + i+1, v->fvarname); + errext(buf); + break; + } + + for(i = 0; i <= nd; i++) { + if (((q = dims[i].lb) && !ISINT(q->headblock.vtype))) + dims[i].lb = mkconv(TYINT, q); + if (((q = dims[i].ub) && !ISINT(q->headblock.vtype))) + dims[i].ub = mkconv(TYINT, q); + } + + for(i = 0; i <= nd; ++i) + { + if( (q = dims[i].ub) == NULL) + { + if(i == nd) + { + frexpr(p->nelt); + p->nelt = NULL; + } + else + err("only last bound may be asterisk"); + p->dims[i].dimsize = ICON(1); + p->dims[i].dimexpr = NULL; + } + else + { + + if(dims[i].lb) + { + q = mkexpr(OPMINUS, q, cpexpr(dims[i].lb)); + q = mkexpr(OPPLUS, q, ICON(1) ); + } + if( ISCONST(q) ) + { + p->dims[i].dimsize = q; + p->dims[i].dimexpr = (expptr) PNULL; + } + else { + sprintf(buf, " %s_dim%d", v->fvarname, i+1); + p->dims[i].dimsize = (expptr) + autovar(1, tyint, EXNULL, buf); + p->dims[i].dimexpr = q; + if (i == nd) + v->vlastdim = new_vars; + v->vdimfinish = 1; + } + if(p->nelt) + p->nelt = mkexpr(OPSTAR, p->nelt, + cpexpr(p->dims[i].dimsize) ); + } + } + + q = dims[nd].lb; + q0 = 0; + if(q == NULL) + q = q0 = ICON(1); + + for(i = nd-1 ; i>=0 ; --i) + { + t = dims[i].lb; + if(t == NULL) + t = ICON(1); + if(p->dims[i].dimsize) { + if (q == q0) { + q0 = 0; + frexpr(q); + q = cpexpr(p->dims[i].dimsize); + } + else + q = mkexpr(OPSTAR, cpexpr(p->dims[i].dimsize), q); + q = mkexpr(OPPLUS, t, q); + } + } + + if( ISCONST(q) ) + { + p->baseoffset = q; + p->basexpr = NULL; + } + else + { + sprintf(buf, " %s_offset", v->fvarname); + p->baseoffset = (expptr) autovar(1, tyint, EXNULL, buf); + p->basexpr = q; + v->vdimfinish = 1; + } + doin_setbound = 0; +} + + + void +#ifdef KR_headers +wr_abbrevs(outfile, function_head, vars) + FILE *outfile; + int function_head; + chainp vars; +#else +wr_abbrevs(FILE *outfile, int function_head, chainp vars) +#endif +{ + for (; vars; vars = vars -> nextp) { + Namep name = (Namep) vars -> datap; + if (!name->visused) + continue; + + if (function_head) + nice_printf (outfile, "#define "); + else + nice_printf (outfile, "#undef "); + out_name (outfile, name); + + if (function_head) { + Extsym *comm = &extsymtab[name -> vardesc.varno]; + + nice_printf (outfile, " ("); + extern_out (outfile, comm); + nice_printf (outfile, "%d.", comm->curno); + nice_printf (outfile, "%s)", name->cvarname); + } /* if function_head */ + nice_printf (outfile, "\n"); + } /* for */ +} /* wr_abbrevs */ diff --git a/tools/connec/src/proc.o b/tools/connec/src/proc.o new file mode 100644 index 0000000000000000000000000000000000000000..6bfa1cc68507f733d46223ece96b20d75c6f32e3 GIT binary patch literal 40464 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

cD=LmX+r19SzUXYbQ+H$>yY$SJFBY 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", "<=", "!=", ">=", + " of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ", + " , ", " ? ", " : " + " abs ", " min ", " max ", " addr ", " indirect ", + " bitor ", " bitand ", " bitxor ", " bitnot ", " >> ", + }; +*/ + +/* Each of these values is defined in pccdefs */ + +int ops2 [ ] = +{ + P2BAD, P2PLUS, P2MINUS, P2STAR, P2SLASH, P2BAD, P2NEG, + P2OROR, P2ANDAND, P2EQ, P2NE, P2NOT, + P2BAD, + P2LT, P2EQ, P2GT, P2LE, P2NE, P2GE, + P2CALL, P2CALL, P2ASSIGN, P2PLUSEQ, P2STAREQ, P2CONV, P2LSHIFT, P2MOD, + P2COMOP, P2QUEST, P2COLON, + 1, P2BAD, P2BAD, P2BAD, P2BAD, + P2BITOR, P2BITAND, P2BITXOR, P2BITNOT, P2RSHIFT, + P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, + P2BAD, P2BAD, P2BAD, P2BAD, + 1,1,1,1,1, /* OPNEG1, OPDMIN, OPDMAX, OPASSIGNI, OPIDENTITY */ + 1,1,1,1, /* OPCHARCAST, OPDABS, OPMIN2, OPMAX2 */ + 1,1,1,1,1 /* OPBITTEST, OPBITCLR, OPBITSET, OPQBIT{CLR,SET} */ +}; + + + void +#ifdef KR_headers +putexpr(p) + expptr p; +#else +putexpr(expptr p) +#endif +{ +/* Write the expression to the p1 file */ + + p = (expptr) putx (fixtype (p)); + p1_expr (p); +} + + + + + + expptr +#ifdef KR_headers +putassign(lp, rp) + expptr lp; + expptr rp; +#else +putassign(expptr lp, expptr rp) +#endif +{ + return putx(fixexpr((Exprp)mkexpr(OPASSIGN, lp, rp))); +} + + + + + void +#ifdef KR_headers +puteq(lp, rp) + expptr lp; + expptr rp; +#else +puteq(expptr lp, expptr rp) +#endif +{ + putexpr(mkexpr(OPASSIGN, lp, rp) ); +} + + + + +/* put code for a *= b */ + + expptr +#ifdef KR_headers +putsteq(a, b) + Addrp a; + Addrp b; +#else +putsteq(Addrp a, Addrp b) +#endif +{ + return putx( fixexpr((Exprp) + mkexpr(OPSTAREQ, cpexpr((expptr)a), cpexpr((expptr)b)))); +} + + + + + Addrp +#ifdef KR_headers +mkfield(res, f, ty) + register Addrp res; + char *f; + int ty; +#else +mkfield(register Addrp res, char *f, int ty) +#endif +{ + res -> vtype = ty; + res -> Field = f; + return res; +} /* mkfield */ + + + Addrp +#ifdef KR_headers +realpart(p) + register Addrp p; +#else +realpart(register Addrp p) +#endif +{ + register Addrp q; + + if (p->tag == TADDR + && p->uname_tag == UNAM_CONST + && ISCOMPLEX (p->vtype)) + return (Addrp)mkrealcon (p -> vtype + TYREAL - TYCOMPLEX, + p->user.kludge.vstg1 ? p->user.Const.cds[0] + : cds(dtos(p->user.Const.cd[0]),CNULL)); + + q = (Addrp) cpexpr((expptr) p); + if( ISCOMPLEX(p->vtype) ) + q = mkfield (q, "r", p -> vtype + TYREAL - TYCOMPLEX); + + return(q); +} + + + + + expptr +#ifdef KR_headers +imagpart(p) + register Addrp p; +#else +imagpart(register Addrp p) +#endif +{ + register Addrp q; + + if( ISCOMPLEX(p->vtype) ) + { + if (p->tag == TADDR && p->uname_tag == UNAM_CONST) + return mkrealcon (p -> vtype + TYREAL - TYCOMPLEX, + p->user.kludge.vstg1 ? p->user.Const.cds[1] + : cds(dtos(p->user.Const.cd[1]),CNULL)); + q = (Addrp) cpexpr((expptr) p); + q = mkfield (q, "i", p -> vtype + TYREAL - TYCOMPLEX); + return( (expptr) q ); + } + else + +/* Cast an integer type onto a Double Real type */ + + return( mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , "0")); +} + + + + + +/* ncat -- computes the number of adjacent concatenation operations */ + + int +#ifdef KR_headers +ncat(p) + register expptr p; +#else +ncat(register expptr p) +#endif +{ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) + return( ncat(p->exprblock.leftp) + ncat(p->exprblock.rightp) ); + else return(1); +} + + + + +/* lencat -- returns the length of the concatenated string. Each + substring must have a static (i.e. compile-time) fixed length */ + + ftnint +#ifdef KR_headers +lencat(p) + register expptr p; +#else +lencat(register expptr p) +#endif +{ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) + return( lencat(p->exprblock.leftp) + lencat(p->exprblock.rightp) ); + else if( p->headblock.vleng!=NULL && ISICON(p->headblock.vleng) ) + return(p->headblock.vleng->constblock.Const.ci); + else if(p->tag==TADDR && p->addrblock.varleng!=0) + return(p->addrblock.varleng); + else + { + err("impossible element in concatenation"); + return(0); + } +} + +/* putconst -- Creates a new Addrp value which maps onto the input + constant value. The Addrp doesn't retain the value of the constant, + instead that value is copied into a table of constants (called + litpool, for pool of literal values). The only way to retrieve the + actual value of the constant is to look at the memno field of the + Addrp result. You know that the associated literal is the one referred + to by q when (q -> memno == litp -> litnum). +*/ + + Addrp +#ifdef KR_headers +putconst(p) + register Constp p; +#else +putconst(register Constp p) +#endif +{ + register Addrp q; + struct Literal *litp, *lastlit; + int k, len, type; + int litflavor; + double cd[2]; + ftnint nblanks; + char *strp; + char cdsbuf0[64], cdsbuf1[64], *ds[2]; + + if (p->tag != TCONST) + badtag("putconst", p->tag); + + q = ALLOC(Addrblock); + q->tag = TADDR; + type = p->vtype; + q->vtype = ( type==TYADDR ? tyint : type ); + q->vleng = (expptr) cpexpr(p->vleng); + q->vstg = STGCONST; + +/* Create the new label for the constant. This is wasteful of labels + because when the constant value already exists in the literal pool, + this label gets thrown away and is never reclaimed. It might be + cleaner to move this down past the first switch() statement below */ + + q->memno = newlabel(); + q->memoffset = ICON(0); + q -> uname_tag = UNAM_CONST; + +/* Copy the constant info into the Addrblock; do this by copying the + largest storage elts */ + + q -> user.Const = p -> Const; + q->user.kludge.vstg1 = p->vstg; /* distinguish string from binary fp */ + + /* check for value in literal pool, and update pool if necessary */ + + k = 1; + switch(type) + { + case TYCHAR: + if (halign) { + strp = p->Const.ccp; + nblanks = p->Const.ccp1.blanks; + len = (int)p->vleng->constblock.Const.ci; + litflavor = LIT_CHAR; + goto loop; + } + else + q->memno = BAD_MEMNO; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + k = 2; + if (p->vstg) + cd[1] = atof(ds[1] = p->Const.cds[1]); + else + ds[1] = cds(dtos(cd[1] = p->Const.cd[1]), cdsbuf1); + case TYREAL: + case TYDREAL: + litflavor = LIT_FLOAT; + if (p->vstg) + cd[0] = atof(ds[0] = p->Const.cds[0]); + else + ds[0] = cds(dtos(cd[0] = p->Const.cd[0]), cdsbuf0); + goto loop; + +#ifndef NO_LONG_LONG + case TYQUAD: + litflavor = LIT_INTQ; + goto loop; +#endif + + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: + case TYLONG: + case TYSHORT: + case TYINT1: +#ifdef TYQUAD0 + case TYQUAD: +#endif + litflavor = LIT_INT; + +/* Scan the literal pool for this constant value. If this same constant + has been assigned before, use the same label. Note that this routine + does NOT consider two differently-typed constants with the same bit + pattern to be the same constant */ + + loop: + lastlit = litpool + nliterals; + for(litp = litpool ; litplittype) switch(litflavor) + { + case LIT_CHAR: + if (len == (int)litp->litval.litival2[0] + && nblanks == litp->litval.litival2[1] + && !memcmp(strp, litp->cds[0], len)) { + q->memno = litp->litnum; + frexpr((expptr)p); + q->user.Const.ccp1.ccp0 = litp->cds[0]; + return(q); + } + break; + case LIT_FLOAT: + if(cd[0] == litp->litval.litdval[0] + && !strcmp(ds[0], litp->cds[0]) + && (k == 1 || + cd[1] == litp->litval.litdval[1] + && !strcmp(ds[1], litp->cds[1]))) { +ret: + q->memno = litp->litnum; + frexpr((expptr)p); + return(q); + } + break; + + case LIT_INT: + if(p->Const.ci == litp->litval.litival) + goto ret; + break; +#ifndef NO_LONG_LONG + case LIT_INTQ: + if(p->Const.cq == litp->litval.litqval) + goto ret; + break; +#endif + } + +/* If there's room in the literal pool, add this new value to the pool */ + + if(nliterals < maxliterals) + { + ++nliterals; + + /* litp now points to the next free elt */ + + litp->littype = type; + litp->litnum = q->memno; + switch(litflavor) + { + case LIT_CHAR: + litp->litval.litival2[0] = len; + litp->litval.litival2[1] = nblanks; + q->user.Const.ccp = litp->cds[0] = (char*) + memcpy(gmem(len,0), strp, len); + break; + + case LIT_FLOAT: + litp->litval.litdval[0] = cd[0]; + litp->cds[0] = copys(ds[0]); + if (k == 2) { + litp->litval.litdval[1] = cd[1]; + litp->cds[1] = copys(ds[1]); + } + break; + + case LIT_INT: + litp->litval.litival = p->Const.ci; + break; +#ifndef NO_LONG_LONG + case LIT_INTQ: + litp->litval.litqval = p->Const.cq; + break; +#endif + } /* switch (litflavor) */ + } + else + many("literal constants", 'L', maxliterals); + + break; + case TYADDR: + break; + default: + badtype ("putconst", p -> vtype); + break; + } /* switch */ + + if (type != TYCHAR || halign) + frexpr((expptr)p); + return( q ); +} diff --git a/tools/connec/src/put.o b/tools/connec/src/put.o new file mode 100644 index 0000000000000000000000000000000000000000..d9bbe0ca63060898df097a068b61a3596c110b4d GIT binary patch literal 7944 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/putpcc.c b/tools/connec/src/putpcc.c new file mode 100644 index 0000000..18a9df6 --- /dev/null +++ b/tools/connec/src/putpcc.c @@ -0,0 +1,2169 @@ +/**************************************************************** +Copyright 1990-1996, 2000-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* INTERMEDIATE CODE GENERATION FOR S. C. JOHNSON C COMPILERS */ +/* NEW VERSION USING BINARY POLISH POSTFIX INTERMEDIATE */ + +#include "defs.h" +#include "pccdefs.h" +#include "output.h" /* for nice_printf */ +#include "names.h" +#include "p1defs.h" + +static Addrp intdouble Argdcl((Addrp)); +static Addrp putcx1 Argdcl((tagptr)); +static tagptr putaddr Argdcl((tagptr)); +static tagptr putcall Argdcl((tagptr, Addrp*)); +static tagptr putcat Argdcl((tagptr, tagptr)); +static Addrp putch1 Argdcl((tagptr)); +static tagptr putchcmp Argdcl((tagptr)); +static tagptr putcheq Argdcl((tagptr)); +static void putct1 Argdcl((tagptr, Addrp, Addrp, ptr)); +static tagptr putcxcmp Argdcl((tagptr)); +static Addrp putcxeq Argdcl((tagptr)); +static tagptr putmnmx Argdcl((tagptr)); +static tagptr putop Argdcl((tagptr)); +static tagptr putpower Argdcl((tagptr)); +static long p1_where; + +extern int init_ac[TYSUBR+1]; +extern int ops2[]; +extern int proc_argchanges, proc_protochanges; +extern int krparens; + +#define P2BUFFMAX 128 + +/* Puthead -- output the header information about subroutines, functions + and entry points */ + + void +#ifdef KR_headers +puthead(s, Class) + char *s; + int Class; +#else +puthead(char *s, int Class) +#endif +{ + if (headerdone == NO) { + if (Class == CLMAIN) + s = "MAIN__"; + p1_head (Class, s); + headerdone = YES; + } +} + + void +#ifdef KR_headers +putif(p, else_if_p) + register expptr p; + int else_if_p; +#else +putif(register expptr p, int else_if_p) +#endif +{ + int k, n; + + if( !ISLOGICAL((k = (p = fixtype(p))->headblock.vtype )) ) + { + if(k != TYERROR) + err("non-logical expression in IF statement"); + } + else { + if (else_if_p) { + if (ei_next >= ei_last) + { + k = ei_last - ei_first; + n = k + 100; + ei_next = mem(n,0); + ei_last = ei_first + n; + if (k) + memcpy(ei_next, ei_first, k); + ei_first = ei_next; + ei_next += k; + ei_last = ei_first + n; + } + p = putx(p); + if (*ei_next++ = ftell(pass1_file) > p1_where) { + p1_if(p); + new_endif(); + } + else + p1_elif(p); + } + else { + p = putx(p); + p1_if(p); + } + } + } + + void +#ifdef KR_headers +putout(p) + expptr p; +#else +putout(expptr p) +#endif +{ + p1_expr (p); + +/* Used to make temporaries in holdtemps available here, but they */ +/* may be reused too soon (e.g. when multiple **'s are involved). */ +} + + + void +#ifdef KR_headers +putcmgo(index, nlab, labs) + expptr index; + int nlab; + struct Labelblock **labs; +#else +putcmgo(expptr index, int nlab, struct Labelblock **labs) +#endif +{ + if(! ISINT(index->headblock.vtype) ) + { + execerr("computed goto index must be integer", CNULL); + return; + } + + p1comp_goto (index, nlab, labs); +} + + static expptr +#ifdef KR_headers +krput(p) + register expptr p; +#else +krput(register expptr p) +#endif +{ + register expptr e, e1; + register unsigned op; + int t = krparens == 2 ? TYDREAL : p->exprblock.vtype; + + op = p->exprblock.opcode; + e = p->exprblock.leftp; + if (e->tag == TEXPR && e->exprblock.opcode == op) { + e1 = (expptr)mktmp(t, ENULL); + putout(putassign(cpexpr(e1), e)); + p->exprblock.leftp = e1; + } + else + p->exprblock.leftp = putx(e); + + e = p->exprblock.rightp; + if (e->tag == TEXPR && e->exprblock.opcode == op) { + e1 = (expptr)mktmp(t, ENULL); + putout(putassign(cpexpr(e1), e)); + p->exprblock.rightp = e1; + } + else + p->exprblock.rightp = putx(e); + return p; + } + + expptr +#ifdef KR_headers +putx(p) + register expptr p; +#else +putx(register expptr p) +#endif +{ + int opc; + int k; + + if (p) + switch(p->tag) + { + case TERROR: + break; + + case TCONST: + switch(p->constblock.vtype) + { + case TYLOGICAL1: + case TYLOGICAL2: + case TYLOGICAL: +#ifdef TYQUAD + case TYQUAD: +#endif + case TYLONG: + case TYSHORT: + case TYINT1: + break; + + case TYADDR: + break; + case TYREAL: + case TYDREAL: + +/* Don't write it out to the p2 file, since you'd need to call putconst, + which is just what we need to avoid in the translator */ + + break; + default: + p = putx( (expptr)putconst((Constp)p) ); + break; + } + break; + + case TEXPR: + switch(opc = p->exprblock.opcode) + { + case OPCALL: + case OPCCALL: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else p = putcall(p, (Addrp *)NULL); + break; + + case OPMIN: + case OPMAX: + p = putmnmx(p); + break; + + + case OPASSIGN: + if(ISCOMPLEX(p->exprblock.leftp->headblock.vtype) + || ISCOMPLEX(p->exprblock.rightp->headblock.vtype)) { + (void) putcxeq(p); + p = ENULL; + } else if( ISCHAR(p) ) + p = putcheq(p); + else + goto putopp; + break; + + case OPEQ: + case OPNE: + if( ISCOMPLEX(p->exprblock.leftp->headblock.vtype) || + ISCOMPLEX(p->exprblock.rightp->headblock.vtype) ) + { + p = putcxcmp(p); + break; + } + case OPLT: + case OPLE: + case OPGT: + case OPGE: + if(ISCHAR(p->exprblock.leftp)) + { + p = putchcmp(p); + break; + } + goto putopp; + + case OPPOWER: + p = putpower(p); + break; + + case OPSTAR: + /* m * (2**k) -> m<exprblock.leftp->headblock.vtype) && + ISICON(p->exprblock.rightp) && + ( (k = log_2(p->exprblock.rightp->constblock.Const.ci))>0) ) + { + p->exprblock.opcode = OPLSHIFT; + frexpr(p->exprblock.rightp); + p->exprblock.rightp = ICON(k); + goto putopp; + } + if (krparens && ISREAL(p->exprblock.vtype)) + return krput(p); + + case OPMOD: + goto putopp; + case OPPLUS: + if (krparens && ISREAL(p->exprblock.vtype)) + return krput(p); + case OPMINUS: + case OPSLASH: + case OPNEG: + case OPNEG1: + case OPABS: + case OPDABS: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else goto putopp; + break; + + case OPCONV: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else if( ISCOMPLEX(p->exprblock.leftp->headblock.vtype) ) + { + p = putx( mkconv(p->exprblock.vtype, + (expptr)realpart(putcx1(p->exprblock.leftp)))); + } + else goto putopp; + break; + + case OPNOT: + case OPOR: + case OPAND: + case OPEQV: + case OPNEQV: + case OPADDR: + case OPPLUSEQ: + case OPSTAREQ: + case OPCOMMA: + case OPQUEST: + case OPCOLON: + case OPBITOR: + case OPBITAND: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + case OPASSIGNI: + case OPIDENTITY: + case OPCHARCAST: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: + case OPBITTEST: + case OPBITCLR: + case OPBITSET: +#ifdef TYQUAD + case OPQBITSET: + case OPQBITCLR: +#endif +putopp: + p = putop(p); + break; + + case OPCONCAT: + /* weird things like ichar(a//a) */ + p = (expptr)putch1(p); + break; + + default: + badop("putx", opc); + p = errnode (); + } + break; + + case TADDR: + p = putaddr(p); + break; + + default: + badtag("putx", p->tag); + p = errnode (); + } + + return p; +} + + + + LOCAL expptr +#ifdef KR_headers +putop(p) + expptr p; +#else +putop(expptr p) +#endif +{ + expptr lp, tp; + int pt, lt, lt1; + int comma; + char *hsave; + + switch(p->exprblock.opcode) /* check for special cases and rewrite */ + { + case OPCONV: + pt = p->exprblock.vtype; + lp = p->exprblock.leftp; + lt = lp->headblock.vtype; + +/* Simplify nested type casts */ + + while(p->tag==TEXPR && p->exprblock.opcode==OPCONV && + ( (ISREAL(pt)&&ONEOF(lt,MSKREAL|MSKCOMPLEX)) || + (INT(pt)&&(ONEOF(lt,MSKINT|MSKADDR|MSKCHAR|M(TYSUBR)))) )) + { + if(pt==TYDREAL && lt==TYREAL) + { + if(lp->tag==TEXPR + && lp->exprblock.opcode == OPCONV) { + lt1 = lp->exprblock.leftp->headblock.vtype; + if (lt1 == TYDREAL) { + lp->exprblock.leftp = + putx(lp->exprblock.leftp); + return p; + } + if (lt1 == TYDCOMPLEX) { + lp->exprblock.leftp = putx( + (expptr)realpart( + putcx1(lp->exprblock.leftp))); + return p; + } + } + break; + } + else if (ISREAL(pt) && ISCOMPLEX(lt)) { + p->exprblock.leftp = putx(mkconv(pt, + (expptr)realpart( + putcx1(p->exprblock.leftp)))); + break; + } + if(lt==TYCHAR && lp->tag==TEXPR && + lp->exprblock.opcode==OPCALL) + { + +/* May want to make a comma expression here instead. I had one, but took + it out for my convenience, not for the convenience of the end user */ + + putout (putcall (lp, (Addrp *) &(p -> + exprblock.leftp))); + return putop (p); + } + if (lt == TYCHAR) { + if (ISCONST(p->exprblock.leftp) + && ISNUMERIC(p->exprblock.vtype)) { + hsave = halign; + halign = 0; + p->exprblock.leftp = putx((expptr) + putconst((Constp) + p->exprblock.leftp)); + halign = hsave; + } + else + p->exprblock.leftp = + putx(p->exprblock.leftp); + return p; + } + if (pt < lt && ONEOF(lt,MSKINT|MSKREAL)) + break; + frexpr(p->exprblock.vleng); + free( (charptr) p ); + p = lp; + if (p->tag != TEXPR) + goto retputx; + pt = lt; + lp = p->exprblock.leftp; + lt = lp->headblock.vtype; + } /* while */ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONV) + break; + retputx: + return putx(p); + + case OPADDR: + comma = NO; + lp = p->exprblock.leftp; + free( (charptr) p ); + if(lp->tag != TADDR) + { + tp = (expptr) + mktmp(lp->headblock.vtype,lp->headblock.vleng); + p = putx( mkexpr(OPASSIGN, cpexpr(tp), lp) ); + lp = tp; + comma = YES; + } + if(comma) + p = mkexpr(OPCOMMA, p, putaddr(lp)); + else + p = (expptr)putaddr(lp); + return p; + + case OPASSIGN: + case OPASSIGNI: + case OPLT: + case OPLE: + case OPGT: + case OPGE: + case OPEQ: + case OPNE: + ; + } + + if( ops2[p->exprblock.opcode] <= 0) + badop("putop", p->exprblock.opcode); + lp = p->exprblock.leftp = putx(p->exprblock.leftp); + if (p -> exprblock.rightp) { + tp = p->exprblock.rightp = putx(p->exprblock.rightp); + if (tp && ISCONST(tp) && ISCONST(lp)) + p = fold(p); + } + return p; +} + + LOCAL expptr +#ifdef KR_headers +putpower(p) + expptr p; +#else +putpower(expptr p) +#endif +{ + expptr base; + Addrp t1, t2; + ftnint k; + int type; + char buf[80]; /* buffer for text of comment */ + + if(!ISICON(p->exprblock.rightp) || + (k = p->exprblock.rightp->constblock.Const.ci)<2) + Fatal("putpower: bad call"); + base = p->exprblock.leftp; + type = base->headblock.vtype; + t1 = mktmp(type, ENULL); + t2 = NULL; + + free ((charptr) p); + p = putassign (cpexpr((expptr) t1), base); + + sprintf (buf, "Computing %ld%s power", k, + k == 2 ? "nd" : k == 3 ? "rd" : "th"); + p1_comment (buf); + + for( ; (k&1)==0 && k>2 ; k>>=1 ) + { + p = mkexpr (OPCOMMA, p, putsteq(t1, t1)); + } + + if(k == 2) { + +/* Write the power computation out immediately */ + putout (p); + p = putx( mkexpr(OPSTAR, cpexpr((expptr)t1), cpexpr((expptr)t1))); + } else if (k == 3) { + putout(p); + p = putx( mkexpr(OPSTAR, cpexpr((expptr)t1), + mkexpr(OPSTAR, cpexpr((expptr)t1), cpexpr((expptr)t1)))); + } else { + t2 = mktmp(type, ENULL); + p = mkexpr (OPCOMMA, p, putassign(cpexpr((expptr)t2), + cpexpr((expptr)t1))); + + for(k>>=1 ; k>1 ; k>>=1) + { + p = mkexpr (OPCOMMA, p, putsteq(t1, t1)); + if(k & 1) + { + p = mkexpr (OPCOMMA, p, putsteq(t2, t1)); + } + } +/* Write the power computation out immediately */ + putout (p); + p = putx( mkexpr(OPSTAR, cpexpr((expptr)t2), + mkexpr(OPSTAR, cpexpr((expptr)t1), cpexpr((expptr)t1)))); + } + frexpr((expptr)t1); + if(t2) + frexpr((expptr)t2); + return p; +} + + + + + LOCAL Addrp +#ifdef KR_headers +intdouble(p) + Addrp p; +#else +intdouble(Addrp p) +#endif +{ + register Addrp t; + + t = mktmp(TYDREAL, ENULL); + putout (putassign(cpexpr((expptr)t), (expptr)p)); + return(t); +} + + + + + +/* Complex-type variable assignment */ + + LOCAL Addrp +#ifdef KR_headers +putcxeq(p) + register expptr p; +#else +putcxeq(register expptr p) +#endif +{ + register Addrp lp, rp; + expptr code; + + if(p->tag != TEXPR) + badtag("putcxeq", p->tag); + + lp = putcx1(p->exprblock.leftp); + rp = putcx1(p->exprblock.rightp); + code = putassign ( (expptr)realpart(lp), (expptr)realpart(rp)); + + if( ISCOMPLEX(p->exprblock.vtype) ) + { + code = mkexpr (OPCOMMA, code, putassign + (imagpart(lp), imagpart(rp))); + } + putout (code); + frexpr((expptr)rp); + free ((charptr) p); + return lp; +} + + + +/* putcxop -- used to write out embedded calls to complex functions, and + complex arguments to procedures */ + + expptr +#ifdef KR_headers +putcxop(p) + expptr p; +#else +putcxop(expptr p) +#endif +{ + return (expptr)putaddr((expptr)putcx1(p)); +} + +#define PAIR(x,y) mkexpr (OPCOMMA, (x), (y)) + + LOCAL Addrp +#ifdef KR_headers +putcx1(p) + register expptr p; +#else +putcx1(register expptr p) +#endif +{ + expptr q; + Addrp lp, rp; + register Addrp resp; + int opcode; + int ltype, rtype; + long ts, tskludge; + + if(p == NULL) + return(NULL); + + switch(p->tag) + { + case TCONST: + if( ISCOMPLEX(p->constblock.vtype) ) + p = (expptr) putconst((Constp)p); + return( (Addrp) p ); + + case TADDR: + resp = &p->addrblock; + if (addressable(p)) + return (Addrp) p; + ts = tskludge = 0; + if (q = resp->memoffset) { + if (resp->uname_tag == UNAM_REF) { + q = cpexpr((tagptr)resp); + q->addrblock.vtype = tyint; + q->addrblock.cmplx_sub = 1; + p->addrblock.skip_offset = 1; + resp->user.name->vsubscrused = 1; + resp->uname_tag = UNAM_NAME; + tskludge = typesize[resp->vtype] + * (resp->Field ? 2 : 1); + } + else if (resp->isarray + && resp->vtype != TYCHAR) { + if (ONEOF(resp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && resp->uname_tag == UNAM_NAME) + q = mkexpr(OPMINUS, q, + mkintcon(resp->user.name->voffset)); + ts = typesize[resp->vtype] + * (resp->Field ? 2 : 1); + q = resp->memoffset = mkexpr(OPSLASH, q, + ICON(ts)); + } + } +#ifdef TYQUAD + resp = mktmp(q->headblock.vtype == TYQUAD ? TYQUAD : tyint, ENULL); +#else + resp = mktmp(tyint, ENULL); +#endif + putout(putassign(cpexpr((expptr)resp), q)); + p->addrblock.memoffset = tskludge + ? mkexpr(OPSTAR, (expptr)resp, ICON(tskludge)) + : (expptr)resp; + if (ts) { + resp = &p->addrblock; + q = mkexpr(OPSTAR, resp->memoffset, ICON(ts)); + if (ONEOF(resp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && resp->uname_tag == UNAM_NAME) + q = mkexpr(OPPLUS, q, + mkintcon(resp->user.name->voffset)); + resp->memoffset = q; + } + return (Addrp) p; + + case TEXPR: + if( ISCOMPLEX(p->exprblock.vtype) ) + break; + resp = mktmp(p->exprblock.vtype, ENULL); + /*first arg of above mktmp call was TYDREAL before 19950102 */ + putout (putassign( cpexpr((expptr)resp), p)); + return(resp); + + case TERROR: + return NULL; + + default: + badtag("putcx1", p->tag); + } + + opcode = p->exprblock.opcode; + if(opcode==OPCALL || opcode==OPCCALL) + { + Addrp t; + p = putcall(p, &t); + putout(p); + return t; + } + else if(opcode == OPASSIGN) + { + return putcxeq (p); + } + +/* BUG (inefficient) Generates too many temporary variables */ + + resp = mktmp(p->exprblock.vtype, ENULL); + if(lp = putcx1(p->exprblock.leftp) ) + ltype = lp->vtype; + if(rp = putcx1(p->exprblock.rightp) ) + rtype = rp->vtype; + + switch(opcode) + { + case OPCOMMA: + frexpr((expptr)resp); + resp = rp; + rp = NULL; + break; + + case OPNEG: + case OPNEG1: + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPNEG, (expptr)realpart(lp), ENULL)), + putassign( imagpart(resp), + mkexpr(OPNEG, imagpart(lp), ENULL)))); + break; + + case OPPLUS: + case OPMINUS: { expptr r; + r = putassign( (expptr)realpart(resp), + mkexpr(opcode, (expptr)realpart(lp), (expptr)realpart(rp) )); + if(rtype < TYCOMPLEX) + q = putassign( imagpart(resp), imagpart(lp) ); + else if(ltype < TYCOMPLEX) + { + if(opcode == OPPLUS) + q = putassign( imagpart(resp), imagpart(rp) ); + else + q = putassign( imagpart(resp), + mkexpr(OPNEG, imagpart(rp), ENULL) ); + } + else + q = putassign( imagpart(resp), + mkexpr(opcode, imagpart(lp), imagpart(rp) )); + r = PAIR (r, q); + putout (r); + break; + } /* case OPPLUS, OPMINUS: */ + case OPSTAR: + if(ltype < TYCOMPLEX) + { + if( ISINT(ltype) ) + lp = intdouble(lp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)lp), + (expptr)realpart(rp))), + putassign( imagpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)lp), imagpart(rp))))); + } + else if(rtype < TYCOMPLEX) + { + if( ISINT(rtype) ) + rp = intdouble(rp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)rp), + (expptr)realpart(lp))), + putassign( imagpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)rp), imagpart(lp))))); + } + else { + putout (PAIR ( + putassign( (expptr)realpart(resp), mkexpr(OPMINUS, + mkexpr(OPSTAR, (expptr)realpart(lp), + (expptr)realpart(rp)), + mkexpr(OPSTAR, imagpart(lp), imagpart(rp)))), + putassign( imagpart(resp), mkexpr(OPPLUS, + mkexpr(OPSTAR, (expptr)realpart(lp), imagpart(rp)), + mkexpr(OPSTAR, imagpart(lp), + (expptr)realpart(rp)))))); + } + break; + + case OPSLASH: + /* fixexpr has already replaced all divisions + * by a complex by a function call + */ + if( ISINT(rtype) ) + rp = intdouble(rp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSLASH, (expptr)realpart(lp), cpexpr((expptr)rp))), + putassign( imagpart(resp), + mkexpr(OPSLASH, imagpart(lp), cpexpr((expptr)rp))))); + break; + + case OPCONV: + if (!lp) + break; + if(ISCOMPLEX(lp->vtype) ) + q = imagpart(lp); + else if(rp != NULL) + q = (expptr) realpart(rp); + else + q = mkrealcon(TYDREAL, "0"); + putout (PAIR ( + putassign( (expptr)realpart(resp), (expptr)realpart(lp)), + putassign( imagpart(resp), q))); + break; + + default: + badop("putcx1", opcode); + } + + frexpr((expptr)lp); + frexpr((expptr)rp); + free( (charptr) p ); + return(resp); +} + + + + +/* Only .EQ. and .NE. may be performed on COMPLEX data, other relations + are not defined */ + + LOCAL expptr +#ifdef KR_headers +putcxcmp(p) + register expptr p; +#else +putcxcmp(register expptr p) +#endif +{ + int opcode; + register Addrp lp, rp; + expptr q; + + if(p->tag != TEXPR) + badtag("putcxcmp", p->tag); + + opcode = p->exprblock.opcode; + lp = putcx1(p->exprblock.leftp); + rp = putcx1(p->exprblock.rightp); + + q = mkexpr( opcode==OPEQ ? OPAND : OPOR , + mkexpr(opcode, (expptr)realpart(lp), (expptr)realpart(rp)), + mkexpr(opcode, imagpart(lp), imagpart(rp)) ); + + free( (charptr) lp); + free( (charptr) rp); + free( (charptr) p ); + if (ISCONST(q)) + return q; + return putx( fixexpr((Exprp)q) ); +} + +/* putch1 -- Forces constants into the literal pool, among other things */ + + LOCAL Addrp +#ifdef KR_headers +putch1(p) + register expptr p; +#else +putch1(register expptr p) +#endif +{ + Addrp t; + expptr e; + + switch(p->tag) + { + case TCONST: + return( putconst((Constp)p) ); + + case TADDR: + return( (Addrp) p ); + + case TEXPR: + switch(p->exprblock.opcode) + { + expptr q; + + case OPCALL: + case OPCCALL: + + p = putcall(p, &t); + putout (p); + break; + + case OPCONCAT: + t = mktmp(TYCHAR, ICON(lencat(p))); + q = (expptr) cpexpr(p->headblock.vleng); + p = putcat( cpexpr((expptr)t), p ); + /* put the correct length on the block */ + frexpr(t->vleng); + t->vleng = q; + putout (p); + break; + + case OPCONV: + if(!ISICON(p->exprblock.vleng) + || p->exprblock.vleng->constblock.Const.ci!=1 + || ! INT(p->exprblock.leftp->headblock.vtype) ) + Fatal("putch1: bad character conversion"); + t = mktmp(TYCHAR, ICON(1)); + e = mkexpr(OPCONV, (expptr)t, ENULL); + e->headblock.vtype = TYCHAR; + p = putop( mkexpr(OPASSIGN, cpexpr(e), p)); + putout (p); + break; + default: + badop("putch1", p->exprblock.opcode); + } + return(t); + + default: + badtag("putch1", p->tag); + } + /* NOT REACHED */ return 0; +} + + +/* putchop -- Write out a character actual parameter; that is, this is + part of a procedure invocation */ + + Addrp +#ifdef KR_headers +putchop(p) + expptr p; +#else +putchop(expptr p) +#endif +{ + p = putaddr((expptr)putch1(p)); + return (Addrp)p; +} + + + + + LOCAL expptr +#ifdef KR_headers +putcheq(p) + register expptr p; +#else +putcheq(register expptr p) +#endif +{ + expptr lp, rp; + int nbad; + + if(p->tag != TEXPR) + badtag("putcheq", p->tag); + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + frexpr(p->exprblock.vleng); + free( (charptr) p ); + +/* If s = t // u, don't bother copying the result, write it directly into + this buffer */ + + nbad = badchleng(lp) + badchleng(rp); + if( rp->tag==TEXPR && rp->exprblock.opcode==OPCONCAT ) + p = putcat(lp, rp); + else if( !nbad + && ISONE(lp->headblock.vleng) + && ISONE(rp->headblock.vleng) ) { + lp = mkexpr(OPCONV, lp, ENULL); + rp = mkexpr(OPCONV, rp, ENULL); + lp->headblock.vtype = rp->headblock.vtype = TYCHAR; + p = putop(mkexpr(OPASSIGN, lp, rp)); + } + else + p = putx( call2(TYSUBR, "s_copy", lp, rp) ); + return p; +} + + + + + LOCAL expptr +#ifdef KR_headers +putchcmp(p) + register expptr p; +#else +putchcmp(register expptr p) +#endif +{ + expptr lp, rp; + + if(p->tag != TEXPR) + badtag("putchcmp", p->tag); + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + + if(ISONE(lp->headblock.vleng) && ISONE(rp->headblock.vleng) ) { + lp = mkexpr(OPCONV, lp, ENULL); + rp = mkexpr(OPCONV, rp, ENULL); + lp->headblock.vtype = rp->headblock.vtype = TYCHAR; + } + else { + lp = call2(TYINT,"s_cmp", lp, rp); + rp = ICON(0); + } + p->exprblock.leftp = lp; + p->exprblock.rightp = rp; + p = putop(p); + return p; +} + + + + + +/* putcat -- Writes out a concatenation operation. Two temporary arrays + are allocated, putct1() is called to initialize them, and then a + call to runtime library routine s_cat() is inserted. + + This routine generates code which will perform an (nconc lhs rhs) + at runtime. The runtime funciton does not return a value, the routine + that calls this putcat must remember the name of lhs. +*/ + + + LOCAL expptr +#ifdef KR_headers +putcat(lhs0, rhs) + expptr lhs0; + register expptr rhs; +#else +putcat(expptr lhs0, register expptr rhs) +#endif +{ + register Addrp lhs = (Addrp)lhs0; + int n, tyi; + Addrp length_var, string_var; + expptr p; + static char Writing_concatenation[] = "Writing concatenation"; + +/* Create the temporary arrays */ + + n = ncat(rhs); + length_var = mktmpn(n, tyioint, ENULL); + string_var = mktmpn(n, TYADDR, ENULL); + frtemp((Addrp)cpexpr((expptr)length_var)); + frtemp((Addrp)cpexpr((expptr)string_var)); + +/* Initialize the arrays */ + + n = 0; + /* p1_comment scribbles on its argument, so we + * cannot safely pass a string literal here. */ + p1_comment(Writing_concatenation); + putct1(rhs, length_var, string_var, &n); + +/* Create the invocation */ + + tyi = tyint; + tyint = tyioint; /* for -I2 */ + p = putx (call4 (TYSUBR, "s_cat", + (expptr)lhs, + (expptr)string_var, + (expptr)length_var, + (expptr)putconst((Constp)ICON(n)))); + tyint = tyi; + + return p; +} + + + + + + LOCAL void +#ifdef KR_headers +putct1(q, length_var, string_var, ip) + register expptr q; + register Addrp length_var; + register Addrp string_var; + int *ip; +#else +putct1(register expptr q, register Addrp length_var, register Addrp string_var, int *ip) +#endif +{ + int i; + Addrp length_copy, string_copy; + expptr e; + extern int szleng; + + if(q->tag==TEXPR && q->exprblock.opcode==OPCONCAT) + { + putct1(q->exprblock.leftp, length_var, string_var, + ip); + putct1(q->exprblock.rightp, length_var, string_var, + ip); + frexpr (q -> exprblock.vleng); + free ((charptr) q); + } + else + { + i = (*ip)++; + e = cpexpr(q->headblock.vleng); + if (!e) + return; /* error -- character*(*) */ + length_copy = (Addrp) cpexpr((expptr)length_var); + length_copy->memoffset = + mkexpr(OPPLUS,length_copy->memoffset, ICON(i*szleng)); + string_copy = (Addrp) cpexpr((expptr)string_var); + string_copy->memoffset = + mkexpr(OPPLUS, string_copy->memoffset, + ICON(i*typesize[TYADDR])); + putout (PAIR (putassign((expptr)length_copy, e), + putassign((expptr)string_copy, addrof((expptr)putch1(q))))); + } +} + +/* putaddr -- seems to write out function invocation actual parameters */ + + LOCAL expptr +#ifdef KR_headers +putaddr(p0) + expptr p0; +#else +putaddr(expptr p0) +#endif +{ + register Addrp p; + chainp cp; + + if (!(p = (Addrp)p0)) + return ENULL; + + if( p->tag==TERROR || (p->memoffset!=NULL && ISERROR(p->memoffset)) ) + { + frexpr((expptr)p); + return ENULL; + } + if (p->isarray && p->memoffset) + if (p->uname_tag == UNAM_REF) { + cp = p->memoffset->listblock.listp; + for(; cp; cp = cp->nextp) + cp->datap = (char *)fixtype((tagptr)cp->datap); + } + else + p->memoffset = putx(p->memoffset); + return (expptr) p; +} + + LOCAL expptr +#ifdef KR_headers +addrfix(e) + expptr e; +#else +addrfix(expptr e) +#endif + /* fudge character string length if it's a TADDR */ +{ + return e->tag == TADDR ? mkexpr(OPIDENTITY, e, ENULL) : e; + } + + LOCAL int +#ifdef KR_headers +typekludge(ccall, q, at, j) + int ccall; + register expptr q; + Atype *at; + int j; +#else +typekludge(int ccall, register expptr q, Atype *at, int j) +#endif + /* j = alternate type */ +{ + register int i, k; + extern int iocalladdr; + register Namep np; + + /* Return value classes: + * < 100 ==> Fortran arg (pointer to type) + * < 200 ==> C arg + * < 300 ==> procedure arg + * < 400 ==> external, no explicit type + * < 500 ==> arg that may turn out to be + * either a variable or a procedure + */ + + k = q->headblock.vtype; + if (ccall) { + if (k == TYREAL) + k = TYDREAL; /* force double for library routines */ + return k + 100; + } + if (k == TYADDR) + return iocalladdr; + i = q->tag; + if ((i == TEXPR && q->exprblock.opcode != OPCOMMA_ARG) + || (i == TADDR && q->addrblock.charleng) + || i == TCONST) + k = TYFTNLEN + 100; + else if (i == TADDR) + switch(q->addrblock.vclass) { + case CLPROC: + if (q->addrblock.uname_tag != UNAM_NAME) + k += 200; + else if ((np = q->addrblock.user.name)->vprocclass + != PTHISPROC) { + if (k && !np->vimpltype) + k += 200; + else { + if (j > 200 && infertypes && j < 300) { + k = j; + inferdcl(np, j-200); + } + else k = (np->vstg == STGEXT + ? extsymtab[np->vardesc.varno].extype + : 0) + 200; + at->cp = mkchain((char *)np, at->cp); + } + } + else if (k == TYSUBR) + k += 200; + break; + + case CLUNKNOWN: + if (q->addrblock.vstg == STGARG + && q->addrblock.uname_tag == UNAM_NAME) { + k += 400; + at->cp = mkchain((char *)q->addrblock.user.name, + at->cp); + } + } + else if (i == TNAME && q->nameblock.vstg == STGARG) { + np = &q->nameblock; + switch(np->vclass) { + case CLPROC: + if (!np->vimpltype) + k += 200; + else if (j <= 200 || !infertypes || j >= 300) + k += 300; + else { + k = j; + inferdcl(np, j-200); + } + goto add2chain; + + case CLUNKNOWN: + /* argument may be a scalar variable or a function */ + if (np->vimpltype && j && infertypes + && j < 300) { + inferdcl(np, j % 100); + k = j; + } + else + k += 400; + + /* to handle procedure args only so far known to be + * external, save a pointer to the symbol table entry... + */ + add2chain: + at->cp = mkchain((char *)np, at->cp); + } + } + return k; + } + + char * +#ifdef KR_headers +Argtype(k, buf) + int k; + char *buf; +#else +Argtype(int k, char *buf) +#endif +{ + if (k < 100) { + sprintf(buf, "%s variable", ftn_types[k]); + return buf; + } + if (k < 200) { + k -= 100; + return ftn_types[k]; + } + if (k < 300) { + k -= 200; + if (k == TYSUBR) + return ftn_types[TYSUBR]; + sprintf(buf, "%s function", ftn_types[k]); + return buf; + } + if (k < 400) + return "external argument"; + k -= 400; + sprintf(buf, "%s argument", ftn_types[k]); + return buf; + } + + static void +#ifdef KR_headers +atype_squawk(at, msg) + Argtypes *at; + char *msg; +#else +atype_squawk(Argtypes *at, char *msg) +#endif +{ + register Atype *a, *ae; + warn(msg); + for(a = at->atypes, ae = a + at->nargs; a < ae; a++) + frchain(&a->cp); + at->nargs = -1; + if (at->changes & 2 && !at->defined) + proc_protochanges++; + } + + static char inconsist[] = "inconsistent calling sequences for "; + + void +#ifdef KR_headers +bad_atypes(at, fname, i, j, k, here, prev) + Argtypes *at; + char *fname; + int i; + int j; + int k; + char *here; + char *prev; +#else +bad_atypes(Argtypes *at, char *fname, int i, int j, int k, char *here, char *prev) +#endif +{ + char buf[208], buf1[32], buf2[32]; + + sprintf(buf, "%s%.90s,\n\targ %d: %s%s%s %s.", + inconsist, fname, i, here, Argtype(k, buf1), + prev, Argtype(j, buf2)); + atype_squawk(at, buf); + } + + int +#ifdef KR_headers +type_fixup(at, a, k) + Argtypes *at; + Atype *a; + int k; +#else +type_fixup(Argtypes *at, Atype *a, int k) +#endif +{ + register struct Entrypoint *ep; + if (!infertypes) + return 0; + for(ep = entries; ep; ep = ep->entnextp) + if (ep->entryname && at == ep->entryname->arginfo) { + a->type = k % 100; + return proc_argchanges = 1; + } + return 0; + } + + + void +#ifdef KR_headers +save_argtypes(arglist, at0, at1, ccall, fname, stg, nchargs, type, zap) + chainp arglist; + Argtypes **at0; + Argtypes **at1; + int ccall; + char *fname; + int stg; + int nchargs; + int type; + int zap; +#else +save_argtypes(chainp arglist, Argtypes **at0, Argtypes **at1, int ccall, char *fname, int stg, int nchargs, int type, int zap) +#endif +{ + Argtypes *at; + chainp cp; + int i, i0, j, k, nargs, nbad, *t, *te; + Atype *atypes; + expptr q; + char buf[208], buf1[32], buf2[32]; + static int initargs[4] = {TYCOMPLEX, TYDCOMPLEX, TYCHAR, TYFTNLEN+100}; + static int *init_ap[TYSUBR+1] = {0,0,0,0,0,0,0, +#ifdef TYQUAD + 0, +#endif + initargs, initargs+1,0,0,0,initargs+2}; + + i0 = init_ac[type]; + t = init_ap[type]; + te = t + i0; + if (at = *at0) { + *at1 = at; + nargs = at->nargs; + if (nargs < 0 && type && at->changes & 2 && !at->defined) + --proc_protochanges; + if (at->dnargs >= 0 && zap != 2) + type = 0; + if (nargs < 0) { /* inconsistent usage seen */ + if (type) + goto newlist; + return; + } + atypes = at->atypes; + i = nchargs; + for(nbad = 0; t < te; atypes++) { + if (++i > nargs) { + toomany: + i = nchargs + i0; + for(cp = arglist; cp; cp = cp->nextp) + i++; + toofew: + switch(zap) { + case 2: zap = 6; break; + case 1: if (at->defined & 4) + return; + } + sprintf(buf, + "%s%.90s:\n\there %d, previously %d args and string lengths.", + inconsist, fname, i, nargs); + atype_squawk(at, buf); + if (type) { + t = init_ap[type]; + goto newlist; + } + return; + } + j = atypes->type; + k = *t++; + if (j != k && j-400 != k) { + cp = 0; + goto badtypes; + } + } + for(cp = arglist; cp; atypes++, cp = cp->nextp) { + if (++i > nargs) + goto toomany; + j = atypes->type; + if (!(q = (expptr)cp->datap)) + continue; + k = typekludge(ccall, q, atypes, j); + if (k >= 300 || k == j) + continue; + if (j >= 300) { + if (k >= 200) { + if (k == TYUNKNOWN + 200) + continue; + if (j % 100 != k - 200 + && k != TYSUBR + 200 + && j != TYUNKNOWN + 300 + && !type_fixup(at,atypes,k)) + goto badtypes; + } + else if (j % 100 % TYSUBR != k % TYSUBR + && !type_fixup(at,atypes,k)) + goto badtypes; + } + else if (k < 200 || j < 200) + if (j) { + if (k == TYUNKNOWN + && q->tag == TNAME + && q->nameblock.vinfproc) { + q->nameblock.vdcldone = 0; + impldcl((Namep)q); + } + goto badtypes; + } + else ; /* fall through to update */ + else if (k == TYUNKNOWN+200) + continue; + else if (j != TYUNKNOWN+200) + { + badtypes: + if (++nbad == 1) + bad_atypes(at, fname, i - nchargs, + j, k, "here ", ", previously"); + else + fprintf(stderr, + "\targ %d: here %s, previously %s.\n", + i - nchargs, Argtype(k,buf1), + Argtype(j,buf2)); + if (!cp) + break; + continue; + } + /* We've subsequently learned the right type, + as in the call on zoo below... + + subroutine foo(x, zap) + external zap + call goo(zap) + x = zap(3) + call zoo(zap) + end + */ + if (!nbad) { + atypes->type = k; + at->changes |= 1; + } + } + if (i < nargs) + goto toofew; + if (nbad) { + if (type) { + /* we're defining the procedure */ + t = init_ap[type]; + te = t + i0; + proc_argchanges = 1; + goto newlist; + } + return; + } + if (zap == 1 && (at->changes & 5) != 5) + at->changes = 0; + return; + } + newlist: + i = i0 + nchargs; + for(cp = arglist; cp; cp = cp->nextp) + i++; + k = sizeof(Argtypes) + (i-1)*sizeof(Atype); + *at0 = *at1 = at = stg == STGEXT ? (Argtypes *)gmem(k,1) + : (Argtypes *) mem(k,1); + at->dnargs = at->nargs = i; + at->defined = zap & 6; + at->changes = type ? 0 : 4; + atypes = at->atypes; + for(; t < te; atypes++) { + atypes->type = *t++; + atypes->cp = 0; + } + for(cp = arglist; cp; atypes++, cp = cp->nextp) { + atypes->cp = 0; + atypes->type = (q = (expptr)cp->datap) + ? typekludge(ccall, q, atypes, 0) + : 0; + } + for(; --nchargs >= 0; atypes++) { + atypes->type = TYFTNLEN + 100; + atypes->cp = 0; + } + } + + static char* +#ifdef KR_headers +get_argtypes(p, pat0, pat1) Exprp p; Argtypes ***pat0, ***pat1; +#else +get_argtypes(Exprp p, Argtypes ***pat0, Argtypes ***pat1) +#endif +{ + Addrp a; + Argtypes **at0, **at1; + Namep np; + Extsym *e; + char *fname; + + a = (Addrp)p->leftp; + switch(a->vstg) { + case STGEXT: + switch(a->uname_tag) { + case UNAM_EXTERN: /* e.g., sqrt() */ + e = extsymtab + a->memno; + at0 = at1 = &e->arginfo; + fname = e->fextname; + break; + case UNAM_NAME: + np = a->user.name; + at0 = &extsymtab[np->vardesc.varno].arginfo; + at1 = &np->arginfo; + fname = np->fvarname; + break; + default: + goto bug; + } + break; + case STGARG: + if (a->uname_tag != UNAM_NAME) + goto bug; + np = a->user.name; + at0 = at1 = &np->arginfo; + fname = np->fvarname; + break; + default: + bug: + Fatal("Confusion in saveargtypes"); + } + *pat0 = at0; + *pat1 = at1; + return fname; + } + + void +#ifdef KR_headers +saveargtypes(p) + register Exprp p; +#else +saveargtypes(register Exprp p) +#endif + /* for writing prototypes */ +{ + Argtypes **at0, **at1; + chainp arglist; + expptr rp; + char *fname; + + fname = get_argtypes(p, &at0, &at1); + rp = p->rightp; + arglist = rp && rp->tag == TLIST ? rp->listblock.listp : 0; + save_argtypes(arglist, at0, at1, p->opcode == OPCCALL, + fname, p->leftp->addrblock.vstg, 0, 0, 0); + } + +/* putcall - fix up the argument list, and write out the invocation. p + is expected to be initialized and point to an OPCALL or OPCCALL + expression. The return value is a pointer to a temporary holding the + result of a COMPLEX or CHARACTER operation, or NULL. */ + + LOCAL expptr +#ifdef KR_headers +putcall(p0, temp) + expptr p0; + Addrp *temp; +#else +putcall(expptr p0, Addrp *temp) +#endif +{ + register Exprp p = (Exprp)p0; + chainp arglist; /* Pointer to actual arguments, if any */ + chainp charsp; /* List of copies of the variables which + hold the lengths of character + parameters (other than procedure + parameters) */ + chainp cp; /* Iterator over argument lists */ + register expptr q; /* Pointer to the current argument */ + Addrp fval; /* Function return value */ + int type; /* type of the call - presumably this was + set elsewhere */ + int byvalue; /* True iff we don't want to massage the + parameter list, since we're calling a C + library routine */ + char *s; + Argtypes *at, **at0, **at1; + Atype *At, *Ate; + + type = p -> vtype; + charsp = NULL; + byvalue = (p->opcode == OPCCALL); + +/* Verify the actual parameters */ + + if (p == (Exprp) NULL) + err ("putcall: NULL call expression"); + else if (p -> tag != TEXPR) + erri ("putcall: expected TEXPR, got '%d'", p -> tag); + +/* Find the argument list */ + + if(p->rightp && p -> rightp -> tag == TLIST) + arglist = p->rightp->listblock.listp; + else + arglist = NULL; + +/* Count the number of explicit arguments, including lengths of character + variables */ + + if (!byvalue) { + get_argtypes(p, &at0, &at1); + At = Ate = 0; + if ((at = *at0) && at->nargs >= 0) { + At = at->atypes; + Ate = At + at->nargs; + At += init_ac[type]; + } + for(cp = arglist ; cp ; cp = cp->nextp) { + q = (expptr) cp->datap; + if( ISCONST(q) ) { + +/* Even constants are passed by reference, so we need to put them in the + literal table */ + + q = (expptr) putconst((Constp)q); + cp->datap = (char *) q; + } + +/* Save the length expression of character variables (NOT character + procedures) for the end of the argument list */ + + if( ISCHAR(q) && + (q->headblock.vclass != CLPROC + || q->headblock.vstg == STGARG + && q->tag == TADDR + && q->addrblock.uname_tag == UNAM_NAME + && q->addrblock.user.name->vprocclass == PTHISPROC) + && (!At || At->type % 100 % TYSUBR == TYCHAR)) + { + p0 = cpexpr(q->headblock.vleng); + charsp = mkchain((char *)p0, charsp); + if (q->headblock.vclass == CLUNKNOWN + && q->headblock.vstg == STGARG) + q->addrblock.user.name->vpassed = 1; + else if (q->tag == TADDR + && q->addrblock.uname_tag == UNAM_CONST) + p0->constblock.Const.ci + += q->addrblock.user.Const.ccp1.blanks; + } + if (At && ++At == Ate) + At = 0; + } + } + charsp = revchain(charsp); + +/* If the routine is a CHARACTER function ... */ + + if(type == TYCHAR) + { + if( ISICON(p->vleng) ) + { + +/* Allocate a temporary to hold the return value of the function */ + + fval = mktmp(TYCHAR, p->vleng); + } + else { + err("adjustable character function"); + if (temp) + *temp = 0; + return 0; + } + } + +/* If the routine is a COMPLEX function ... */ + + else if( ISCOMPLEX(type) ) + fval = mktmp(type, ENULL); + else + fval = NULL; + +/* Write the function name, without taking its address */ + + p -> leftp = putx(fixtype(putaddr(p->leftp))); + + if(fval) + { + chainp prepend; + +/* Prepend a copy of the function return value buffer out as the first + argument. */ + + prepend = mkchain((char *)putx(putaddr(cpexpr((expptr)fval))), arglist); + +/* If it's a character function, also prepend the length of the result */ + + if(type==TYCHAR) + { + + prepend->nextp = mkchain((char *)putx(mkconv(TYLENG, + p->vleng)), arglist); + } + if (!(q = p->rightp)) + p->rightp = q = (expptr)mklist(CHNULL); + q->listblock.listp = prepend; + } + +/* Scan through the fortran argument list */ + + for(cp = arglist ; cp ; cp = cp->nextp) + { + q = (expptr) (cp->datap); + if (q == ENULL) + err ("putcall: NULL argument"); + +/* call putaddr only when we've got a parameter for a C routine or a + memory resident parameter */ + + if (q -> tag == TCONST && !byvalue) + q = (expptr) putconst ((Constp)q); + + if(q->tag==TADDR && (byvalue || q->addrblock.vstg!=STGREG) ) { + if (q->addrblock.parenused + && !byvalue && q->headblock.vtype != TYCHAR) + goto make_copy; + cp->datap = (char *)putaddr(q); + } + else if( ISCOMPLEX(q->headblock.vtype) ) + cp -> datap = (char *) putx (fixtype(putcxop(q))); + else if (ISCHAR(q) ) + cp -> datap = (char *) putx (fixtype((expptr)putchop(q))); + else if( ! ISERROR(q) ) + { + if(byvalue) { + if (q->tag == TEXPR && q->exprblock.opcode == OPCONV) { + if (ISCOMPLEX(q->exprblock.leftp->headblock.vtype) + && q->exprblock.leftp->tag == TEXPR) + q->exprblock.leftp = putcxop(q->exprblock.leftp); + else + q->exprblock.leftp = putx(q->exprblock.leftp); + } + else + cp -> datap = (char *) putx(q); + } + else if (q->tag == TEXPR && q->exprblock.opcode == OPCHARCAST) + cp -> datap = (char *) putx(q); + else { + expptr t, t1; + +/* If we've got a register parameter, or (maybe?) a constant, save it in a + temporary first */ + make_copy: + t = (expptr) mktmp(q->headblock.vtype, q->headblock.vleng); + +/* Assign to temporary variables before invoking the subroutine or + function */ + + t1 = putassign( cpexpr(t), q ); + if (doin_setbound) + t = mkexpr(OPCOMMA_ARG, t1, t); + else + putout(t1); + cp -> datap = (char *) t; + } /* else */ + } /* if !ISERROR(q) */ + } + +/* Now adjust the lengths of the CHARACTER parameters */ + + for(cp = charsp ; cp ; cp = cp->nextp) + cp->datap = (char *)addrfix(putx( + /* in case MAIN has a character*(*)... */ + (s = cp->datap) ? mkconv(TYLENG,(expptr)s) + : ICON(0))); + +/* ... and add them to the end of the argument list */ + + hookup (arglist, charsp); + +/* Return the name of the temporary used to hold the results, if any was + necessary. */ + + if (temp) *temp = fval; + else frexpr ((expptr)fval); + + saveargtypes(p); + + return (expptr) p; +} + + static expptr +#ifdef KR_headers +foldminmax(op, type, p) int op; int type; chainp p; +#else +foldminmax(int op, int type, chainp p) +#endif +{ + Constp c, c1; + ftnint i, i1; + double d, d1; + int dstg, d1stg; + char *s, *s1; + + c = ALLOC(Constblock); + c->tag = TCONST; + c->vtype = type; + s = s1 = 0; + + switch(type) { + case TYREAL: + case TYDREAL: + c1 = (Constp)p->datap; + d = ISINT(c1->vtype) ? (double)c1->Const.ci + : c1->vstg ? atof(c1->Const.cds[0]) : c1->Const.cd[0]; + dstg = 0; + if (ISINT(c1->vtype)) + d = (double)c1->Const.ci; + else if (dstg = c1->vstg) + d = atof(s = c1->Const.cds[0]); + else + d = c1->Const.cd[0]; + while(p = p->nextp) { + c1 = (Constp)p->datap; + d1stg = 0; + if (ISINT(c1->vtype)) + d1 = (double)c1->Const.ci; + else if (d1stg = c1->vstg) + d1 = atof(s1 = c1->Const.cds[0]); + else + d1 = c1->Const.cd[0]; + if (op == OPMIN) { + if (d > d1) + goto d1copy; + } + else if (d < d1) { + d1copy: + d = d1; + dstg = d1stg; + s = s1; + } + } + if (c->vstg = dstg) + c->Const.cds[0] = s; + else + c->Const.cd[0] = d; + break; + default: + i = ((Constp)p->datap)->Const.ci; + while(p = p->nextp) { + i1 = ((Constp)p->datap)->Const.ci; + if (op == OPMIN) { + if (i > i1) + i = i1; + } + else if (i < i1) + i = i1; + } + c->Const.ci = i; + } + return (expptr)c; + } + +/* putmnmx -- Put min or max. p must point to an EXPR, not just a + CONST */ + + LOCAL expptr +#ifdef KR_headers +putmnmx(p) + register expptr p; +#else +putmnmx(register expptr p) +#endif +{ + int op, op2, type; + expptr arg, qp, temp; + chainp p0, p1; + Addrp sp, tp; + char comment_buf[80]; + char *what; + + if(p->tag != TEXPR) + badtag("putmnmx", p->tag); + + type = p->exprblock.vtype; + op = p->exprblock.opcode; + op2 = op == OPMIN ? OPMIN2 : OPMAX2; + p0 = p->exprblock.leftp->listblock.listp; + free( (charptr) (p->exprblock.leftp) ); + free( (charptr) p ); + + /* for param statements, deal with constant expressions now */ + + for(p1 = p0;; p1 = p1->nextp) { + if (!p1) { + /* all constants */ + p = foldminmax(op, type, p0); + frchain(&p0); + return p; + } + else if (!ISCONST(((expptr)p1->datap))) + break; + } + + /* special case for two addressable operands */ + + if (addressable((expptr)p0->datap) + && (p1 = p0->nextp) + && addressable((expptr)p1->datap) + && !p1->nextp) { + if (type == TYREAL && forcedouble) + op2 = op == OPMIN ? OPDMIN : OPDMAX; + p = mkexpr(op2, mkconv(type, cpexpr((expptr)p0->datap)), + mkconv(type, cpexpr((expptr)p1->datap))); + frchain(&p0); + return p; + } + + /* general case */ + + sp = mktmp(type, ENULL); + +/* We only need a second temporary if the arg list has an unaddressable + value */ + + tp = (Addrp) NULL; + qp = ENULL; + for (p1 = p0 -> nextp; p1; p1 = p1 -> nextp) + if (!addressable ((expptr) p1 -> datap)) { + tp = mktmp(type, ENULL); + qp = mkexpr(op2, cpexpr((expptr)sp), cpexpr((expptr)tp)); + qp = fixexpr((Exprp)qp); + break; + } /* if */ + +/* Now output the appropriate number of assignments and comparisons. Min + and max are implemented by the simple O(n) algorithm: + + min (a, b, c, d) ==> + { t1, t2; + + t1 = a; + t2 = b; t1 = (t1 < t2) ? t1 : t2; + t2 = c; t1 = (t1 < t2) ? t1 : t2; + t2 = d; t1 = (t1 < t2) ? t1 : t2; + } +*/ + + if (!doin_setbound) { + switch(op) { + case OPLT: + case OPMIN: + case OPDMIN: + case OPMIN2: + what = "IN"; + break; + default: + what = "AX"; + } + sprintf (comment_buf, "Computing M%s", what); + p1_comment (comment_buf); + } + + p1 = p0->nextp; + temp = (expptr)p0->datap; + if (addressable(temp) && addressable((expptr)p1->datap)) { + p = mkconv(type, cpexpr(temp)); + arg = mkconv(type, cpexpr((expptr)p1->datap)); + temp = mkexpr(op2, p, arg); + if (!ISCONST(temp)) + temp = fixexpr((Exprp)temp); + p1 = p1->nextp; + } + p = putassign (cpexpr((expptr)sp), temp); + + for(; p1 ; p1 = p1->nextp) + { + if (addressable ((expptr) p1 -> datap)) { + arg = mkconv(type, cpexpr((expptr)p1->datap)); + temp = mkexpr(op2, cpexpr((expptr)sp), arg); + temp = fixexpr((Exprp)temp); + } else { + temp = (expptr) cpexpr (qp); + p = mkexpr(OPCOMMA, p, + putassign(cpexpr((expptr)tp), (expptr)p1->datap)); + } /* else */ + + if(p1->nextp) + p = mkexpr(OPCOMMA, p, + putassign(cpexpr((expptr)sp), temp)); + else { + if (type == TYREAL && forcedouble) + temp->exprblock.opcode = + op == OPMIN ? OPDMIN : OPDMAX; + if (doin_setbound) + p = mkexpr(OPCOMMA, p, temp); + else { + putout (p); + p = putx(temp); + } + if (qp) + frexpr (qp); + } /* else */ + } /* for */ + + frchain( &p0 ); + return p; +} + + + void +#ifdef KR_headers +putwhile(p) + expptr p; +#else +putwhile(expptr p) +#endif +{ + int k, n; + + if (wh_next >= wh_last) + { + k = wh_last - wh_first; + n = k + 100; + wh_next = mem(n,0); + wh_last = wh_first + n; + if (k) + memcpy(wh_next, wh_first, k); + wh_first = wh_next; + wh_next += k; + wh_last = wh_first + n; + } + if( !ISLOGICAL((k = (p = fixtype(p))->headblock.vtype))) + { + if(k != TYERROR) + err("non-logical expression in DO WHILE statement"); + } + else { + p = putx(p); + *wh_next++ = ftell(pass1_file) > p1_where; + p1put(P1_WHILE2START); + p1_expr(p); + } + } + + void +#ifdef KR_headers +westart(elseif) int elseif; +#else +westart(int elseif) +#endif +{ + static int we[2] = { P1_WHILE1START, P1_ELSEIFSTART }; + p1put(we[elseif]); + p1_where = ftell(pass1_file); + } diff --git a/tools/connec/src/putpcc.o b/tools/connec/src/putpcc.o new file mode 100644 index 0000000000000000000000000000000000000000..5bdae7523f402bdbf7cf105dc755ba075e44283e GIT binary patch literal 41448 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/sysdep.c b/tools/connec/src/sysdep.c new file mode 100644 index 0000000..93a1e5b --- /dev/null +++ b/tools/connec/src/sysdep.c @@ -0,0 +1,697 @@ +/**************************************************************** +Copyright 1990 - 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ +#include "defs.h" +#include "usignal.h" + +char binread[] = "rb", textread[] = "r"; +char binwrite[] = "wb", textwrite[] = "w"; +char *c_functions = "c_functions"; +char *coutput = "c_output"; +char *initfname = "raw_data"; +char *initbname = "raw_data.b"; +char *blkdfname = "block_data"; +char *p1_file = "p1_file"; +char *p1_bakfile = "p1_file.BAK"; +char *sortfname = "init_file"; +char *proto_fname = "proto_file"; + +char link_msg[] = "on Microsoft Windows system, link with libf2c.lib;\n\ + on Linux or Unix systems, link with .../path/to/libf2c.a -lm\n\ + or, if you install libf2c.a in a standard place, with -lf2c -lm\n\ + -- in that order, at the end of the command line, as in\n\ + cc *.o -lf2c -lm\n\ + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,\n\n\ + http://www.netlib.org/f2c/libf2c.zip"; + +char *outbuf = "", *outbtail; + +#undef WANT_spawnvp +#ifdef MSDOS +#ifndef NO_spawnvp +#define WANT_spawnvp +#endif +#endif + +#ifdef _WIN32 +#include /* for GetVolumeInformation */ +#undef WANT_spawnvp +#define WANT_spawnvp +#undef MSDOS +#define MSDOS +#endif + +#ifdef WANT_spawnvp +#include +#ifndef _P_WAIT +#define _P_WAIT P_WAIT /* Symantec C/C++ */ +#endif +static char **spargv, **pfname; +#endif + +char *tmpdir = ""; + +#ifdef __cplusplus +#define Cextern extern "C" +extern "C" { + static void flovflo(int), killed(int); + static int compare(const void *a, const void *b); +} +#else +#define Cextern extern +#endif + +Cextern int unlink Argdcl((const char *)); +Cextern int fork Argdcl((void)), getpid Argdcl((void)), wait Argdcl((int*)); + + void +#ifdef KR_headers +Un_link_all(cdelete) + int cdelete; +#else +Un_link_all(int cdelete) +#endif +{ + if (!debugflag) { + unlink(c_functions); + unlink(initfname); + unlink(p1_file); + unlink(sortfname); + unlink(blkdfname); + if (cdelete && coutput) + unlink(coutput); + } + } + +#ifndef MSDOS +#include "sysdep.hd" +#include /* for mkdtemp and rmdir */ +#endif + +#ifndef NO_TEMPDIR + static void +rmtdir(Void) +{ + char *s; + if (*(s = tmpdir)) { + tmpdir = ""; + rmdir(s); + } + } +#endif /*NO_TEMPDIR*/ + + static void +alloc_names(Void) +{ + int k = strlen(tmpdir) + 24; + c_functions = (char *)ckalloc(7*k); + initfname = c_functions + k; + initbname = initfname + k; + blkdfname = initbname + k; + p1_file = blkdfname + k; + p1_bakfile = p1_file + k; + sortfname = p1_bakfile + k; + } + + void +set_tmp_names(Void) +{ +#ifdef MSDOS + char buf[64], *s, *t; +#ifdef _WIN32 + DWORD flags, maxlen, volser; + char volname[512], f2c[24], fsname[512], *name1; + int i; + + if (debugflag == 1) + return; + i = sprintf(f2c, "%x", _getpid()); + if (!GetVolumeInformation(NULL, volname, sizeof(volname), &volser, &maxlen, + &flags, fsname, sizeof(fsname)) + || maxlen < i+8) /* FAT16 */ + strcpy(f2c, "f2c_"); +#else + static char f2c[] = "f2c_"; + if (debugflag == 1) + return; +#endif + + if (!*tmpdir || *tmpdir == '.' && !tmpdir[1]) + t = ""; + else { + /* substitute \ for / to avoid confusion with a + * switch indicator in the system("sort ...") + * call in formatdata.c + */ + for(s = tmpdir, t = buf; *s; s++, t++) + if ((*t = *s) == '/') + *t = '\\'; + if (t[-1] != '\\') + *t++ = '\\'; + *t = 0; + t = buf; + } + alloc_names(); + sprintf(c_functions, "%s%sfunc", t, f2c); + sprintf(initfname, "%s%srd", t, f2c); + sprintf(blkdfname, "%s%sblkd", t, f2c); + sprintf(p1_file, "%s%sp1f", t, f2c); + sprintf(p1_bakfile, "%s%sp1fb", t, f2c); + sprintf(sortfname, "%s%ssort", t, f2c); +#else /*!MSDOS*/ + long pid; + +#define L_TDNAME 20 +#ifdef NO_MKDTEMP +#ifdef NO_MKSTEMP +#undef L_TDNAME +#define L_TDNAME L_tmpnam +#endif +#endif + static char tdbuf[L_TDNAME]; + + if (debugflag == 1) + return; + pid = getpid(); + if (!*tmpdir) { +#ifdef NO_TEMPDIR + tmpdir = "/tmp"; +#else +#ifdef NO_MKDTEMP +#ifdef NO_MKSTEMP + if (!(tmpdir = tmpnam(tdbuf))) { + fprintf(stderr, "tmpnam failed (for -T)\n"); + exit(1); + } +#else + int f; + strcpy(tdbuf, "/tmp/f2ctd_XXXXXX"); + f = mkstemp(tdbuf); + if (f >= 0) { + close(f); + remove(tmpdir = tdbuf); + } + else { + fprintf(stderr, "mkstemp failed (for -T)\n"); + exit(1); + } +#endif /*NO_MKSTEMP*/ + if (mkdir(tdbuf,0700)) { + fprintf(stderr, "mkdir failed (for -T)\n"); + exit(1); + } +#else /*!NO_MKDTEMP*/ + strcpy(tdbuf, "/tmp/f2ctd_XXXXXX"); + if (!(tmpdir = mkdtemp(tdbuf))) { + fprintf(stderr, "mkdtemp failed (for -T)\n"); + exit(1); + } +#endif /*NO_MKDTEMP*/ + if (!debugflag) + atexit(rmtdir); +#endif /*NO_TEMPDIR*/ + } + alloc_names(); + sprintf(c_functions, "%s/f2c%ld_func", tmpdir, pid); + sprintf(initfname, "%s/f2c%ld_rd", tmpdir, pid); + sprintf(blkdfname, "%s/f2c%ld_blkd", tmpdir, pid); + sprintf(p1_file, "%s/f2c%ld_p1f", tmpdir, pid); + sprintf(p1_bakfile, "%s/f2c%ld_p1fb", tmpdir, pid); + sprintf(sortfname, "%s/f2c%ld_sort", tmpdir, pid); +#endif /*MSDOS*/ + sprintf(initbname, "%s.b", initfname); + if (debugflag) + fprintf(diagfile, "%s %s %s %s %s %s\n", c_functions, + initfname, blkdfname, p1_file, p1_bakfile, sortfname); + } + + char * +#ifdef KR_headers +c_name(s, ft) + char *s; + int ft; +#else +c_name(char *s, int ft) +#endif +{ + char *b, *s0; + int c; + + b = s0 = s; + while(c = *s++) + if (c == '/') + b = s; + if (--s < s0 + 3 || s[-2] != '.' + || ((c = *--s) != 'f' && c != 'F')) { + infname = s0; + Fatal("file name must end in .f or .F"); + } + strcpy(outbtail, b); + outbtail[s-b] = ft; + b = copys(outbuf); + return b; + } + + static void +#ifdef KR_headers +killed(sig) + int sig; +#else +killed(int sig) +#endif +{ + sig = sig; /* shut up warning */ + signal(SIGINT, SIG_IGN); +#ifdef SIGQUIT + signal(SIGQUIT, SIG_IGN); +#endif +#ifdef SIGHUP + signal(SIGHUP, SIG_IGN); +#endif + signal(SIGTERM, SIG_IGN); + Un_link_all(1); + exit(126); + } + + static void +#ifdef KR_headers +sig1catch(sig) + int sig; +#else +sig1catch(int sig) +#endif +{ + sig = sig; /* shut up warning */ + if (signal(sig, SIG_IGN) != SIG_IGN) + signal(sig, killed); + } + + static void +#ifdef KR_headers +flovflo(sig) + int sig; +#else +flovflo(int sig) +#endif +{ + sig = sig; /* shut up warning */ + Fatal("floating exception during constant evaluation; cannot recover"); + /* vax returns a reserved operand that generates + an illegal operand fault on next instruction, + which if ignored causes an infinite loop. + */ + signal(SIGFPE, flovflo); +} + + void +#ifdef KR_headers +sigcatch(sig) + int sig; +#else +sigcatch(int sig) +#endif +{ + sig = sig; /* shut up warning */ + sig1catch(SIGINT); +#ifdef SIGQUIT + sig1catch(SIGQUIT); +#endif +#ifdef SIGHUP + sig1catch(SIGHUP); +#endif + sig1catch(SIGTERM); + signal(SIGFPE, flovflo); /* catch overflows */ + } + +/* argkludge permits wild-card expansion and caching of the original or expanded */ +/* argv to kludge around the lack of fork() and exec() when necessary. */ + + void +#ifdef KR_headers +argkludge(pargc, pargv) int *pargc; char ***pargv; +#else +argkludge(int *pargc, char ***pargv) +#endif +{ +#ifdef WANT_spawnvp + size_t L, L1; + int argc, i, nf; + char **a, **argv, *s, *t, *t0; + + /* Assume wild-card expansion has been done by Microsoft's setargv.obj */ + + /* Count Fortran input files. */ + + L = argc = *pargc; + argv = *pargv; + for(i = nf = 0; i < argc; i++) { + L += L1 = strlen(s = argv[i]); + if (L1 > 2 && s[L1-2] == '.') + switch(s[L1-1]) { + case 'f': + case 'F': + nf++; + } + } + if (nf <= 1) + return; + + /* Cache inputs */ + + i = argc - nf + 2; + a = spargv = (char**)Alloc(i*sizeof(char*) + L); + t = (char*)(a + i); + for(i = 0; i < argc; i++) { + *a++ = t0 = t; + for(s = argv[i]; *t++ = *s; s++); + if (t-t0 > 3 && s[-2] == '.') + switch(s[-1]) { + case 'f': + case 'F': + --a; + t = t0; + } + } + pfname = a++; + *a = 0; +#endif + } + + int +#ifdef KR_headers +dofork(fname) char *fname; +#else +dofork(char *fname) +#endif +{ + extern int retcode; +#ifdef MSDOS +#ifdef WANT_spawnvp + *pfname = fname; + retcode |= _spawnvp(_P_WAIT, spargv[0], (char const*const*)spargv); +#else /*_WIN32*/ + Fatal("Only one Fortran input file allowed under MS-DOS"); +#endif /*_WIN32*/ +#else + int pid, status, w; + + if (!(pid = fork())) + return 1; + if (pid == -1) + Fatal("bad fork"); + while((w = wait(&status)) != pid) + if (w == -1) + Fatal("bad wait code"); + retcode |= status >> 8; +#endif + return 0; + } + +/* Initialization of tables that change with the character set... */ + +char escapes[Table_size]; + +#ifdef non_ASCII +char *str_fmt[Table_size]; +static char *str0fmt[127] = { /*}*/ +#else +char *str_fmt[Table_size] = { +#endif + "\\000", "\\001", "\\002", "\\003", "\\004", "\\005", "\\006", "\\007", + "\\b", "\\t", "\\n", "\\013", "\\f", "\\r", "\\016", "\\017", + "\\020", "\\021", "\\022", "\\023", "\\024", "\\025", "\\026", "\\027", + "\\030", "\\031", "\\032", "\\033", "\\034", "\\035", "\\036", "\\037", + " ", "!", "\\\"", "#", "$", "%%", "&", "'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~" + }; + +#ifdef non_ASCII +char *chr_fmt[Table_size]; +static char *chr0fmt[127] = { /*}*/ +#else +char *chr_fmt[Table_size] = { +#endif + "\\0", "\\1", "\\2", "\\3", "\\4", "\\5", "\\6", "\\7", + "\\b", "\\t", "\\n", "\\13", "\\f", "\\r", "\\16", "\\17", + "\\20", "\\21", "\\22", "\\23", "\\24", "\\25", "\\26", "\\27", + "\\30", "\\31", "\\32", "\\33", "\\34", "\\35", "\\36", "\\37", + " ", "!", "\"", "#", "$", "%%", "&", "\\'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~" + }; + + void +fmt_init(Void) +{ + static char *str1fmt[6] = + { "\\b", "\\t", "\\n", "\\f", "\\r", "\\013" }; + register int i, j; + register char *s; + + /* str_fmt */ + +#ifdef non_ASCII + i = 0; +#else + i = 127; +#endif + s = Alloc(5*(Table_size - i)); + for(; i < Table_size; i++) { + sprintf(str_fmt[i] = s, "\\%03o", i); + s += 5; + } +#ifdef non_ASCII + for(i = 32; i < 127; i++) { + s = str0fmt[i]; + str_fmt[*(unsigned char *)s] = s; + } + str_fmt['"'] = "\\\""; +#else + if (Ansi == 1) + str_fmt[7] = chr_fmt[7] = "\\a"; +#endif + + /* chr_fmt */ + +#ifdef non_ASCII + for(i = 0; i < 32; i++) + chr_fmt[i] = chr0fmt[i]; +#else + i = 127; +#endif + for(; i < Table_size; i++) + chr_fmt[i] = "\\%o"; +#ifdef non_ASCII + for(i = 32; i < 127; i++) { + s = chr0fmt[i]; + j = *(unsigned char *)s; + if (j == '\\') + j = *(unsigned char *)(s+1); + chr_fmt[j] = s; + } +#endif + + /* escapes (used in lex.c) */ + + for(i = 0; i < Table_size; i++) + escapes[i] = i; + for(s = "btnfr0", i = 0; i < 6; i++) + escapes[*(unsigned char *)s++] = "\b\t\n\f\r"[i]; + /* finish str_fmt and chr_fmt */ + + if (Ansi) + str1fmt[5] = "\\v"; + if ('\v' == 'v') { /* ancient C compiler */ + str1fmt[5] = "v"; +#ifndef non_ASCII + escapes['v'] = 11; +#endif + } + else + escapes['v'] = '\v'; + for(s = "\b\t\n\f\r\v", i = 0; j = *(unsigned char *)s++;) + str_fmt[j] = chr_fmt[j] = str1fmt[i++]; + /* '\v' = 11 for both EBCDIC and ASCII... */ + chr_fmt[11] = (char*)(Ansi ? "\\v" : "\\13"); + } + + void +outbuf_adjust(Void) +{ + int n, n1; + char *s; + + n = n1 = strlen(outbuf); + if (*outbuf && outbuf[n-1] != '/') + n1++; + s = Alloc(n+64); + outbtail = s + n1; + strcpy(s, outbuf); + if (n != n1) + strcpy(s+n, "/"); + outbuf = s; + } + + +/* Unless SYSTEM_SORT is defined, the following gives a simple + * in-core version of dsort(). On Fortran source with huge DATA + * statements, the in-core version may exhaust the available memory, + * in which case you might either recompile this source file with + * SYSTEM_SORT defined (if that's reasonable on your system), or + * replace the dsort below with a more elaborate version that + * does a merging sort with the help of auxiliary files. + */ + +#ifdef SYSTEM_SORT + + int +#ifdef KR_headers +dsort(from, to) + char *from; + char *to; +#else +dsort(char *from, char *to) +#endif +{ + char buf[200]; + sprintf(buf, "sort <%s >%s", from, to); + return system(buf) >> 8; + } +#else + + static int +#ifdef KR_headers + compare(a,b) + char *a, *b; +#else + compare(const void *a, const void *b) +#endif +{ return strcmp(*(char **)a, *(char **)b); } + + int +#ifdef KR_headers +dsort(from, to) + char *from; + char *to; +#else +dsort(char *from, char *to) +#endif +{ + struct Memb { + struct Memb *next; + int n; + char buf[32000]; + }; + typedef struct Memb memb; + memb *mb, *mb1; + register char *x, *x0, *xe; + register int c, n; + FILE *f; + char **z, **z0; + int nn = 0; + + f = opf(from, textread); + mb = (memb *)Alloc(sizeof(memb)); + mb->next = 0; + x0 = x = mb->buf; + xe = x + sizeof(mb->buf); + n = 0; + for(;;) { + c = getc(f); + if (x >= xe && (c != EOF || x != x0)) { + if (!n) + return 126; + nn += n; + mb->n = n; + mb1 = (memb *)Alloc(sizeof(memb)); + mb1->next = mb; + mb = mb1; + memcpy(mb->buf, x0, n = x-x0); + x0 = mb->buf; + x = x0 + n; + xe = x0 + sizeof(mb->buf); + n = 0; + } + if (c == EOF) + break; + if (c == '\n') { + ++n; + *x++ = 0; + x0 = x; + } + else + *x++ = c; + } + clf(&f, from, 1); + f = opf(to, textwrite); + if (x > x0) { /* shouldn't happen */ + *x = 0; + ++n; + } + mb->n = n; + nn += n; + if (!nn) /* shouldn't happen */ + goto done; + z = z0 = (char **)Alloc(nn*sizeof(char *)); + for(mb1 = mb; mb1; mb1 = mb1->next) { + x = mb1->buf; + n = mb1->n; + for(;;) { + *z++ = x; + if (--n <= 0) + break; + while(*x++); + } + } + qsort((char *)z0, nn, sizeof(char *), compare); + for(n = nn, z = z0; n > 0; n--) + fprintf(f, "%s\n", *z++); + free((char *)z0); + done: + clf(&f, to, 1); + do { + mb1 = mb->next; + free((char *)mb); + } + while(mb = mb1); + return 0; + } +#endif diff --git a/tools/connec/src/sysdep.h b/tools/connec/src/sysdep.h new file mode 100644 index 0000000..f9b7cbc --- /dev/null +++ b/tools/connec/src/sysdep.h @@ -0,0 +1,101 @@ +/**************************************************************** +Copyright 1990, 1991, 1994 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* This file is included at the start of defs.h; this file + * is an initial attempt to gather in one place some declarations + * that may need to be tweaked on some systems. + */ + +#ifdef __STDC__ +#undef KR_headers +#endif + +#ifndef KR_headers +#ifndef ANSI_Libraries +#define ANSI_Libraries +#endif +#ifndef ANSI_Prototypes +#define ANSI_Prototypes +#endif +#endif + +#ifdef __BORLANDC__ +#define MSDOS +#endif + +#ifdef __ZTC__ /* Zortech */ +#define MSDOS +#endif + +#ifdef MSDOS +#define ANSI_Libraries +#define ANSI_Prototypes +#define LONG_CAST (long) +#else +#define LONG_CAST +#endif + +#include + +#ifdef ANSI_Libraries +#include +#include +#else +char *calloc(), *malloc(), *realloc(); +void *memcpy(), *memset(); +#ifndef _SIZE_T +typedef unsigned int size_t; +#endif +#ifndef atol + long atol(); +#endif + +#ifdef ANSI_Prototypes +extern double atof(const char *); +extern double strtod(const char*, char**); +#else +extern double atof(), strtod(); +#endif +#endif + +/* On systems like VMS where fopen might otherwise create + * multiple versions of intermediate files, you may wish to + * #define scrub(x) unlink(x) + */ +#ifndef scrub +#define scrub(x) /* do nothing */ +#endif + +/* On systems that severely limit the total size of statically + * allocated arrays, you may need to change the following to + * extern char **chr_fmt, *escapes, **str_fmt; + * and to modify sysdep.c appropriately + */ +extern char *chr_fmt[], escapes[], *str_fmt[]; + +#include + +#include "ctype.h" + +#define Bits_per_Byte 8 +#define Table_size (1 << Bits_per_Byte) diff --git a/tools/connec/src/sysdep.hd b/tools/connec/src/sysdep.hd new file mode 100644 index 0000000..e15e92f --- /dev/null +++ b/tools/connec/src/sysdep.hd @@ -0,0 +1 @@ +/*OK*/ diff --git a/tools/connec/src/sysdep.o b/tools/connec/src/sysdep.o new file mode 100644 index 0000000000000000000000000000000000000000..5be9828f3428eb82c40d13ebd1847fc417a3b462 GIT binary patch literal 23560 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 +#include +#include + + int +#ifdef KR_headers +main(argc, argv) int argc; char **argv; +#else +main(int argc, char **argv) +#endif +{ + char buf[16]; + if (argc < 0) { +#ifndef NO_MKDTEMP + mkdtemp(buf); +#else + mkstemp(buf); +#endif + } + return 0; + } diff --git a/tools/connec/src/tokdefs.h b/tools/connec/src/tokdefs.h new file mode 100644 index 0000000..35e3d72 --- /dev/null +++ b/tools/connec/src/tokdefs.h @@ -0,0 +1,100 @@ +#define SEOS 1 +#define SCOMMENT 2 +#define SLABEL 3 +#define SUNKNOWN 4 +#define SHOLLERITH 5 +#define SICON 6 +#define SRCON 7 +#define SDCON 8 +#define SBITCON 9 +#define SOCTCON 10 +#define SHEXCON 11 +#define STRUE 12 +#define SFALSE 13 +#define SNAME 14 +#define SNAMEEQ 15 +#define SFIELD 16 +#define SSCALE 17 +#define SINCLUDE 18 +#define SLET 19 +#define SASSIGN 20 +#define SAUTOMATIC 21 +#define SBACKSPACE 22 +#define SBLOCK 23 +#define SCALL 24 +#define SCHARACTER 25 +#define SCLOSE 26 +#define SCOMMON 27 +#define SCOMPLEX 28 +#define SCONTINUE 29 +#define SDATA 30 +#define SDCOMPLEX 31 +#define SDIMENSION 32 +#define SDO 33 +#define SDOUBLE 34 +#define SELSE 35 +#define SELSEIF 36 +#define SEND 37 +#define SENDFILE 38 +#define SENDIF 39 +#define SENTRY 40 +#define SEQUIV 41 +#define SEXTERNAL 42 +#define SFORMAT 43 +#define SFUNCTION 44 +#define SGOTO 45 +#define SASGOTO 46 +#define SCOMPGOTO 47 +#define SARITHIF 48 +#define SLOGIF 49 +#define SIMPLICIT 50 +#define SINQUIRE 51 +#define SINTEGER 52 +#define SINTRINSIC 53 +#define SLOGICAL 54 +#define SNAMELIST 55 +#define SOPEN 56 +#define SPARAM 57 +#define SPAUSE 58 +#define SPRINT 59 +#define SPROGRAM 60 +#define SPUNCH 61 +#define SREAD 62 +#define SREAL 63 +#define SRETURN 64 +#define SREWIND 65 +#define SSAVE 66 +#define SSTATIC 67 +#define SSTOP 68 +#define SSUBROUTINE 69 +#define STHEN 70 +#define STO 71 +#define SUNDEFINED 72 +#define SWRITE 73 +#define SLPAR 74 +#define SRPAR 75 +#define SEQUALS 76 +#define SCOLON 77 +#define SCOMMA 78 +#define SCURRENCY 79 +#define SPLUS 80 +#define SMINUS 81 +#define SSTAR 82 +#define SSLASH 83 +#define SPOWER 84 +#define SCONCAT 85 +#define SAND 86 +#define SOR 87 +#define SNEQV 88 +#define SEQV 89 +#define SNOT 90 +#define SEQ 91 +#define SLT 92 +#define SGT 93 +#define SLE 94 +#define SGE 95 +#define SNE 96 +#define SENDDO 97 +#define SWHILE 98 +#define SSLASHD 99 +#define SBYTE 100 diff --git a/tools/connec/src/tokens b/tools/connec/src/tokens new file mode 100644 index 0000000..07b1881 --- /dev/null +++ b/tools/connec/src/tokens @@ -0,0 +1,100 @@ +SEOS +SCOMMENT +SLABEL +SUNKNOWN +SHOLLERITH +SICON +SRCON +SDCON +SBITCON +SOCTCON +SHEXCON +STRUE +SFALSE +SNAME +SNAMEEQ +SFIELD +SSCALE +SINCLUDE +SLET +SASSIGN +SAUTOMATIC +SBACKSPACE +SBLOCK +SCALL +SCHARACTER +SCLOSE +SCOMMON +SCOMPLEX +SCONTINUE +SDATA +SDCOMPLEX +SDIMENSION +SDO +SDOUBLE +SELSE +SELSEIF +SEND +SENDFILE +SENDIF +SENTRY +SEQUIV +SEXTERNAL +SFORMAT +SFUNCTION +SGOTO +SASGOTO +SCOMPGOTO +SARITHIF +SLOGIF +SIMPLICIT +SINQUIRE +SINTEGER +SINTRINSIC +SLOGICAL +SNAMELIST +SOPEN +SPARAM +SPAUSE +SPRINT +SPROGRAM +SPUNCH +SREAD +SREAL +SRETURN +SREWIND +SSAVE +SSTATIC +SSTOP +SSUBROUTINE +STHEN +STO +SUNDEFINED +SWRITE +SLPAR +SRPAR +SEQUALS +SCOLON +SCOMMA +SCURRENCY +SPLUS +SMINUS +SSTAR +SSLASH +SPOWER +SCONCAT +SAND +SOR +SNEQV +SEQV +SNOT +SEQ +SLT +SGT +SLE +SGE +SNE +SENDDO +SWHILE +SSLASHD +SBYTE diff --git a/tools/connec/src/usignal.h b/tools/connec/src/usignal.h new file mode 100644 index 0000000..ba4ee6a --- /dev/null +++ b/tools/connec/src/usignal.h @@ -0,0 +1,7 @@ +#include +#ifndef SIGHUP +#define SIGHUP 1 /* hangup */ +#endif +#ifndef SIGQUIT +#define SIGQUIT 3 /* quit */ +#endif diff --git a/tools/connec/src/vax.c b/tools/connec/src/vax.c new file mode 100644 index 0000000..63a7d8c --- /dev/null +++ b/tools/connec/src/vax.c @@ -0,0 +1,585 @@ +/**************************************************************** +Copyright 1990, 1992-1994, 2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "pccdefs.h" +#include "output.h" + +int regnum[] = { + 11, 10, 9, 8, 7, 6 }; + +/* Put out a constant integer */ + + void +#ifdef KR_headers +prconi(fp, n) + FILEP fp; + ftnint n; +#else +prconi(FILEP fp, ftnint n) +#endif +{ + fprintf(fp, "\t%ld\n", n); +} + +#ifndef NO_LONG_LONG + void +#ifdef KR_headers +prconq(fp, n) FILEP fp; Llong n; +#else +prconq(FILEP fp, Llong n) +#endif +{ + fprintf(fp, "\t%lld\n", n); + } +#endif + + +/* Put out a constant address */ + + void +#ifdef KR_headers +prcona(fp, a) + FILEP fp; + ftnint a; +#else +prcona(FILEP fp, ftnint a) +#endif +{ + fprintf(fp, "\tL%ld\n", a); +} + + + void +#ifdef KR_headers +prconr(fp, x, k) + FILEP fp; + Constp x; + int k; +#else +prconr(FILEP fp, Constp x, int k) +#endif +{ + char *x0, *x1; + char cdsbuf0[64], cdsbuf1[64]; + + if (k > 1) { + if (x->vstg) { + x0 = x->Const.cds[0]; + x1 = x->Const.cds[1]; + } + else { + x0 = cds(dtos(x->Const.cd[0]), cdsbuf0); + x1 = cds(dtos(x->Const.cd[1]), cdsbuf1); + } + fprintf(fp, "\t%s %s\n", x0, x1); + } + else + fprintf(fp, "\t%s\n", x->vstg ? x->Const.cds[0] + : cds(dtos(x->Const.cd[0]), cdsbuf0)); +} + + + char * +#ifdef KR_headers +memname(stg, mem) + int stg; + long mem; +#else +memname(int stg, long mem) +#endif +{ + static char s[20]; + + switch(stg) + { + case STGCOMMON: + case STGEXT: + sprintf(s, "_%s", extsymtab[mem].cextname); + break; + + case STGBSS: + case STGINIT: + sprintf(s, "v.%ld", mem); + break; + + case STGCONST: + sprintf(s, "L%ld", mem); + break; + + case STGEQUIV: + sprintf(s, "q.%ld", mem+eqvstart); + break; + + default: + badstg("memname", stg); + } + return(s); +} + +extern void addrlit Argdcl((Addrp)); + +/* make_int_expr -- takes an arbitrary expression, and replaces all + occurrences of arguments with indirection */ + + expptr +#ifdef KR_headers +make_int_expr(e) + expptr e; +#else +make_int_expr(expptr e) +#endif +{ + chainp listp; + Addrp ap; + expptr e1; + + if (e != ENULL) + switch (e -> tag) { + case TADDR: + if (e->addrblock.isarray) { + if (e1 = e->addrblock.memoffset) + e->addrblock.memoffset = make_int_expr(e1); + } + else if (e->addrblock.vstg == STGARG + || e->addrblock.vstg == STGCOMMON + && e->addrblock.uname_tag == UNAM_NAME + && e->addrblock.user.name->vcommequiv) + e = mkexpr(OPWHATSIN, e, ENULL); + break; + case TEXPR: + e -> exprblock.leftp = make_int_expr (e -> exprblock.leftp); + e -> exprblock.rightp = make_int_expr (e -> exprblock.rightp); + break; + case TLIST: + for(listp = e->listblock.listp; listp; listp = listp->nextp) + if ((ap = (Addrp)listp->datap) + && ap->tag == TADDR + && ap->uname_tag == UNAM_CONST) + addrlit(ap); + break; + default: + break; + } /* switch */ + + return e; +} /* make_int_expr */ + + + +/* prune_left_conv -- used in prolog() to strip type cast away from + left-hand side of parameter adjustments. This is necessary to avoid + error messages from cktype() */ + + expptr +#ifdef KR_headers +prune_left_conv(e) + expptr e; +#else +prune_left_conv(expptr e) +#endif +{ + struct Exprblock *leftp; + + if (e && e -> tag == TEXPR && e -> exprblock.leftp && + e -> exprblock.leftp -> tag == TEXPR) { + leftp = &(e -> exprblock.leftp -> exprblock); + if (leftp -> opcode == OPCONV) { + e -> exprblock.leftp = leftp -> leftp; + free ((charptr) leftp); + } + } + + return e; +} /* prune_left_conv */ + + + static int wrote_comment; + static FILE *comment_file; + + static void +write_comment(Void) +{ + if (!wrote_comment) { + wrote_comment = 1; + nice_printf (comment_file, "/* Parameter adjustments */\n"); + } + } + + static int * +count_args(Void) +{ + register int *ac; + register chainp cp; + register struct Entrypoint *ep; + register Namep q; + + ac = (int *)ckalloc(nallargs*sizeof(int)); + + for(ep = entries; ep; ep = ep->entnextp) + for(cp = ep->arglist; cp; cp = cp->nextp) + if (q = (Namep)cp->datap) + ac[q->argno]++; + return ac; + } + + static int nu, *refs, *used; + static void awalk Argdcl((expptr)); + + static void +#ifdef KR_headers +aawalk(P) + struct Primblock *P; +#else +aawalk(struct Primblock *P) +#endif +{ + chainp p; + expptr q; + + if (P->argsp) + for(p = P->argsp->listp; p; p = p->nextp) { + q = (expptr)p->datap; + if (q->tag != TCONST) + awalk(q); + } + if (P->namep->vtype == TYCHAR) { + if (q = P->fcharp) + awalk(q); + if (q = P->lcharp) + awalk(q); + } + } + + static void +#ifdef KR_headers +afwalk(P) + struct Primblock *P; +#else +afwalk(struct Primblock *P) +#endif +{ + chainp p; + expptr q; + Namep np; + + for(p = P->argsp->listp; p; p = p->nextp) { + q = (expptr)p->datap; + switch(q->tag) { + case TPRIM: + np = q->primblock.namep; + if (np->vknownarg) + if (!refs[np->argno]++) + used[nu++] = np->argno; + if (q->primblock.argsp == 0) { + if (q->primblock.namep->vclass == CLPROC + && q->primblock.namep->vprocclass + != PTHISPROC + || q->primblock.namep->vdim != NULL) + continue; + } + default: + awalk(q); + /* no break */ + case TCONST: + continue; + } + } + } + + static void +#ifdef KR_headers +awalk(e) + expptr e; +#else +awalk(expptr e) +#endif +{ + Namep np; + top: + if (!e) + return; + switch(e->tag) { + default: + badtag("awalk", e->tag); + case TCONST: + case TERROR: + case TLIST: + return; + case TADDR: + if (e->addrblock.uname_tag == UNAM_NAME) { + np = e->addrblock.user.name; + if (np->vknownarg && !refs[np->argno]++) + used[nu++] = np->argno; + } + e = e->addrblock.memoffset; + goto top; + case TPRIM: + np = e->primblock.namep; + if (np->vknownarg && !refs[np->argno]++) + used[nu++] = np->argno; + if (e->primblock.argsp && np->vclass != CLVAR) + afwalk((struct Primblock *)e); + else + aawalk((struct Primblock *)e); + return; + case TEXPR: + awalk(e->exprblock.rightp); + e = e->exprblock.leftp; + goto top; + } + } + + static chainp +#ifdef KR_headers +argsort(p0) + chainp p0; +#else +argsort(chainp p0) +#endif +{ + Namep *args, q, *stack; + int i, nargs, nout, nst; + chainp *d, *da, p, rv, *rvp; + struct Dimblock *dp; + + if (!p0) + return p0; + for(nargs = 0, p = p0; p; p = p->nextp) + nargs++; + args = (Namep *)ckalloc(i = nargs*(sizeof(Namep) + 2*sizeof(chainp) + + 2*sizeof(int))); + memset((char *)args, 0, i); + stack = args + nargs; + d = (chainp *)(stack + nargs); + refs = (int *)(d + nargs); + used = refs + nargs; + + for(p = p0; p; p = p->nextp) { + q = (Namep) p->datap; + args[q->argno] = q; + } + for(p = p0; p; p = p->nextp) { + q = (Namep) p->datap; + if (!(dp = q->vdim)) + continue; + i = dp->ndim; + while(--i >= 0) + awalk(dp->dims[i].dimexpr); + awalk(dp->basexpr); + while(nu > 0) { + refs[i = used[--nu]] = 0; + d[i] = mkchain((char *)q, d[i]); + } + } + for(i = nst = 0; i < nargs; i++) + for(p = d[i]; p; p = p->nextp) + refs[((Namep)p->datap)->argno]++; + while(--i >= 0) + if (!refs[i]) + stack[nst++] = args[i]; + if (nst == nargs) { + rv = p0; + goto done; + } + nout = 0; + rv = 0; + rvp = &rv; + while(nst > 0) { + nout++; + q = stack[--nst]; + *rvp = p = mkchain((char *)q, CHNULL); + rvp = &p->nextp; + da = d + q->argno; + for(p = *da; p; p = p->nextp) + if (!--refs[(q = (Namep)p->datap)->argno]) + stack[nst++] = q; + frchain(da); + } + if (nout < nargs) + for(i = 0; i < nargs; i++) + if (refs[i]) { + q = args[i]; + errstr("Can't adjust %.38s correctly\n\ + due to dependencies among arguments.", + q->fvarname); + *rvp = p = mkchain((char *)q, CHNULL); + rvp = &p->nextp; + frchain(d+i); + } + done: + free((char *)args); + return rv; + } + + void +#ifdef KR_headers +prolog(outfile, p) + FILE *outfile; + register chainp p; +#else +prolog(FILE *outfile, register chainp p) +#endif +{ + int addif, addif0, i, nd; + ftnint size; + int *ac; + register Namep q; + register struct Dimblock *dp; + chainp p0, p1; + + if(procclass == CLBLOCK) + return; + p0 = p; + p1 = p = argsort(p); + wrote_comment = 0; + comment_file = outfile; + ac = 0; + +/* Compute the base addresses and offsets for the array parameters, and + assign these values to local variables */ + + addif = addif0 = nentry > 1; + for(; p ; p = p->nextp) + { + q = (Namep) p->datap; + if(dp = q->vdim) /* if this param is an array ... */ + { + expptr Q, expr; + + /* See whether to protect the following with an if. */ + /* This only happens when there are multiple entries. */ + + nd = dp->ndim - 1; + if (addif0) { + if (!ac) + ac = count_args(); + if (ac[q->argno] == nentry) + addif = 0; + else if (dp->basexpr + || dp->baseoffset->constblock.Const.ci) + addif = 1; + else for(addif = i = 0; i <= nd; i++) + if (dp->dims[i].dimexpr + && (i < nd || !q->vlastdim)) { + addif = 1; + break; + } + if (addif) { + write_comment(); + nice_printf(outfile, "if (%s) {\n", /*}*/ + q->cvarname); + next_tab(outfile); + } + } + for(i = 0 ; i <= nd; ++i) + +/* Store the variable length of each dimension (which is fixed upon + runtime procedure entry) into a local variable */ + + if ((Q = dp->dims[i].dimexpr) + && (i < nd || !q->vlastdim)) { + expr = (expptr)cpexpr(Q); + write_comment(); + out_and_free_statement (outfile, mkexpr (OPASSIGN, + fixtype(cpexpr(dp->dims[i].dimsize)), expr)); + } /* if dp -> dims[i].dimexpr */ + +/* size will equal the size of a single element, or -1 if the type is + variable length character type */ + + size = typesize[ q->vtype ]; + if(q->vtype == TYCHAR) + if( ISICON(q->vleng) ) + size *= q->vleng->constblock.Const.ci; + else + size = -1; + + /* Fudge the argument pointers for arrays so subscripts + * are 0-based. Not done if array bounds are being checked. + */ + if(dp->basexpr) { + +/* Compute the base offset for this procedure */ + + write_comment(); + out_and_free_statement (outfile, mkexpr (OPASSIGN, + cpexpr(fixtype(dp->baseoffset)), + cpexpr(fixtype(dp->basexpr)))); + } /* if dp -> basexpr */ + + if(! checksubs) { + if(dp->basexpr) { + expptr tp; + +/* If the base of this array has a variable adjustment ... */ + + tp = (expptr) cpexpr (dp -> baseoffset); + if(size < 0 || q -> vtype == TYCHAR) + tp = mkexpr (OPSTAR, tp, cpexpr (q -> vleng)); + + write_comment(); + tp = mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv(TYINT, fixtype + (fixtype (tp)))); +/* Avoid type clash by removing the type conversion */ + tp = prune_left_conv (tp); + out_and_free_statement (outfile, tp); + } else if(dp->baseoffset->constblock.Const.ci != 0) { + +/* if the base of this array has a nonzero constant adjustment ... */ + + expptr tp; + + write_comment(); + if(size > 0 && q -> vtype != TYCHAR) { + tp = prune_left_conv (mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv (TYINT, fixtype + (cpexpr (dp->baseoffset))))); + out_and_free_statement (outfile, tp); + } else { + tp = prune_left_conv (mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv (TYINT, fixtype + (mkexpr (OPSTAR, cpexpr (dp -> baseoffset), + cpexpr (q -> vleng)))))); + out_and_free_statement (outfile, tp); + } /* else */ + } /* if dp -> baseoffset -> const */ + } /* if !checksubs */ + + if (addif) { + nice_printf(outfile, /*{*/ "}\n"); + prev_tab(outfile); + } + } + } + if (wrote_comment) + nice_printf (outfile, "\n/* Function Body */\n"); + if (ac) + free((char *)ac); + if (p0 != p1) + frchain(&p1); +} /* prolog */ diff --git a/tools/connec/src/vax.o b/tools/connec/src/vax.o new file mode 100644 index 0000000000000000000000000000000000000000..ceabaf50b27817b52d324b30c6fa4b0fd7bdbb0c GIT binary patch literal 12104 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 P>cS(s#%)%VGTi>}XU`^y literal 0 HcmV?d00001 diff --git a/tools/connec/src/xsum.c b/tools/connec/src/xsum.c new file mode 100644 index 0000000..a5d70e4 --- /dev/null +++ b/tools/connec/src/xsum.c @@ -0,0 +1,239 @@ +/**************************************************************** +Copyright 1990, 1993, 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that the copyright notice and this permission notice and warranty +disclaimer appear in supporting documentation, and that the names of +AT&T, Bell Laboratories, Lucent or Bellcore or any of their entities +not be used in advertising or publicity pertaining to distribution of +the software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability and +fitness. In no event shall AT&T or Bellcore be liable for any +special, indirect or consequential damages or any damages whatsoever +resulting from loss of use, data or profits, whether in an action of +contract, negligence or other tortious action, arising out of or in +connection with the use or performance of this software. +****************************************************************/ + +#undef _POSIX_SOURCE +#define _POSIX_SOURCE +#include "stdio.h" +#ifndef KR_headers +#include "stdlib.h" +#include "sys/types.h" +#ifndef MSDOS +#include "unistd.h" /* for read, close */ +#endif +#include "fcntl.h" /* for declaration of open, O_RDONLY */ +#endif +#ifdef MSDOS +#include "io.h" +#endif +#ifndef O_RDONLY +#define O_RDONLY 0 +#endif +#ifndef O_BINARY +#define O_BINARY O_RDONLY +#endif + + char *progname; + static int ignore_cr; + + void +#ifdef KR_headers +usage(rc) +#else +usage(int rc) +#endif +{ + fprintf(stderr, "usage: %s [-r] [file [file...]]\n\ + option -r ignores carriage return characters\n", progname); + exit(rc); + } + +typedef unsigned char Uchar; + + long +#ifdef KR_headers +sum32(sum, x, n) + register long sum; + register Uchar *x; + int n; +#else +sum32(register long sum, register Uchar *x, int n) +#endif +{ + register Uchar *xe; + static long crc_table[256] = { + 0, 151466134, 302932268, 453595578, + -9583591, -160762737, -312236747, -463170141, + -19167182, -136529756, -321525474, -439166584, + 28724267, 145849533, 330837255, 448732561, + -38334364, -189783822, -273059512, -423738914, + 47895677, 199091435, 282375505, 433292743, + 57448534, 174827712, 291699066, 409324012, + -67019697, -184128295, -300991133, -418902539, + -76668728, -227995554, -379567644, -530091662, + 67364049, 218420295, 369985021, 520795499, + 95791354, 213031020, 398182870, 515701056, + -86479645, -203465611, -388624945, -506380967, + 114897068, 266207290, 349655424, 500195606, + -105581387, -256654301, -340093543, -490887921, + -134039394, -251295736, -368256590, -485758684, + 124746887, 241716241, 358686123, 476458301, + -153337456, -2395898, -455991108, -304803798, + 162629001, 11973919, 465560741, 314102835, + 134728098, 16841012, 436840590, 319723544, + -144044613, -26395347, -446403433, -329032703, + 191582708, 40657250, 426062040, 274858062, + -200894995, -50223749, -435620671, -284179369, + -172959290, -55056048, -406931222, -289830788, + 182263263, 64630089, 416513267, 299125861, + 229794136, 78991822, 532414580, 381366498, + -220224191, -69691945, -523123603, -371788549, + -211162774, -93398532, -513308602, -396314416, + 201600371, 84090341, 503991391, 386759881, + -268078788, -117292630, -502591472, -351526778, + 258520357, 107972019, 493278217, 341959839, + 249493774, 131713432, 483432482, 366454964, + -239911657, -122417791, -474129349, -356881235, + -306674912, -457198666, -4791796, -156118374, + 315967289, 466778031, 14362133, 165418627, + 325258002, 442776452, 23947838, 141187752, + -334573813, -452329571, -33509849, -150495567, + 269456196, 419996626, 33682024, 184992510, + -278767779, -429561909, -43239823, -194312473, + -288089226, -405591072, -52790694, -170046772, + 297394031, 415166457, 62373443, 179343061, + 383165416, 533828478, 81314500, 232780370, + -373594127, -524527769, -72022307, -223201717, + -401789990, -519431348, -100447498, -217810336, + 392228803, 510123861, 91131631, 208256633, + -345918580, -496598246, -110112096, -261561802, + 336361365, 487278339, 100800185, 251995695, + 364526526, 482151208, 129260178, 246639108, + -354943065, -472854735, -119955829, -237064675, + 459588272, 308539942, 157983644, 7181066, + -469170519, -317835713, -167286907, -16754925, + -440448382, -323454444, -139383890, -21619912, + 450006683, 332774925, 148697015, 31186721, + -422325548, -271261118, -186797064, -36011154, + 431888077, 280569435, 196114401, 45565815, + 403200742, 286222960, 168180682, 50400092, + -412770561, -295522711, -177471533, -59977915, + -536157576, -384970002, -234585260, -83643454, + 526853729, 375396087, 225003341, 74348507, + 517040714, 399923932, 215944038, 98057200, + -507728301, -390357307, -206385281, -88735767, + 498987548, 347783818, 263426864, 112501670, + -489671163, -338229613, -253864151, -103192641, + -479823314, -362722632, -244835582, -126932076, + 470531639, 353144481, 235265819, 117632909 + }; + + xe = x + n; + while(x < xe) + sum = crc_table[(sum ^ *x++) & 0xff] ^ (sum >> 8 & 0xffffff); + return sum; + } + + int +#ifdef KR_headers +cr_purge(buf, n) + Uchar *buf; + int n; +#else +cr_purge(Uchar *buf, int n) +#endif +{ + register Uchar *b, *b1, *be; + b = buf; + be = b + n; + while(b < be) + if (*b++ == '\r') { + b1 = b - 1; + while(b < be) + if ((*b1 = *b++) != '\r') + b1++; + return b1 - buf; + } + return n; + } + +static Uchar Buf[16*1024]; + + void +#ifdef KR_headers +process(s, x) + char *s; + int x; +#else +process(char *s, int x) +#endif +{ + register int n; + long fsize, sum; + + sum = 0; + fsize = 0; + while((n = read(x, (char *)Buf, sizeof(Buf))) > 0) { + if (ignore_cr) + n = cr_purge(Buf, n); + fsize += n; + sum = sum32(sum, Buf, n); + } + sum &= 0xffffffff; + if (n==0) + printf("%s\t%lx\t%ld\n", s, sum & 0xffffffff, fsize); + else { perror(s); } + close(x); + } + + int +#ifdef KR_headers +main(argc, argv) + char **argv; +#else +main(int argc, char **argv) +#endif +{ + int x; + char *s; + static int rc; + + progname = *argv; + argc = argc; /* turn off "not used" warning */ + s = *++argv; + if (s && *s == '-') { + switch(s[1]) { + case '?': + usage(0); + case 'r': + ignore_cr = 1; + case '-': + break; + default: + fprintf(stderr, "invalid option %s\n", s); + usage(1); + } + s = *++argv; + } + if (s) do { + x = open(s, O_RDONLY|O_BINARY); + if (x < 0) { + fprintf(stderr, "%s: can't open %s\n", progname, s); + rc |= 1; + } + else + process(s, x); + } + while(s = *++argv); + else { + process("/dev/stdin", fileno(stdin)); + } + return rc; + } diff --git a/tools/connec/src/xsum.out b/tools/connec/src/xsum.out new file mode 100644 index 0000000..e337db7 --- /dev/null +++ b/tools/connec/src/xsum.out @@ -0,0 +1,59 @@ +Notice 76f23b4 1212 +README f11dd32a 7973 +cds.c 147aded1 4221 +data.c 32116b2 10688 +defines.h fd9fa7c5 8720 +defs.h e48cebb 34523 +equiv.c fdeff25 9340 +error.c ef1dd812 5015 +exec.c e8f52ce0 21217 +expr.c 6bfe005 72276 +f2c.1 b0441b2 7532 +f2c.1t bf1f87 7574 +f2c.h e770b7d8 4688 +format.c f00da069 59974 +format.h b396862 458 +formatdata.c 1f0f56eb 28988 +ftypes.h e2533d86 1836 +gram.c 3794117 64242 +gram.dcl e38579ff 8463 +gram.exec e20ca496 3033 +gram.expr eca86241 3193 +gram.head e6bbfeab 7362 +gram.io 101f7521 3350 +init.c fe1abab5 11833 +intr.c 1ebf37ee 25016 +io.c 1739e50 30664 +iob.h ece45655 548 +lex.c 1b0d5df9 34746 +machdefs.h 4950e5b 659 +main.c e23f7b59 20898 +makefile.u e0dd1cab 3710 +makefile.vc eb8aae7c 2685 +malloc.c 3505600 4020 +mem.c ad64d7c 5437 +memset.c 12a1e1aa 2121 +misc.c 8d99c9 22945 +names.c fa887031 21553 +names.h 110806d6 569 +niceprintf.c 141fb644 10950 +niceprintf.h c31f08c 412 +output.c ff23aa0b 43483 +output.h fa6797d9 2103 +p1defs.h 1b02743 5741 +p1output.c ff485aba 14681 +parse.h 18d34e6b 1119 +parse_args.c eb2fd4ea 14145 +pccdefs.h 1b4fbbee 1195 +pread.c fb4d5427 17831 +proc.c e6d47490 39179 +put.c af0be95 10345 +putpcc.c 7669b2f 46093 +sysdep.c f34bbeb6 15877 +sysdep.h e7826434 2755 +sysdeptest.c 449a7d0 428 +tokens 188b7c5d 733 +usignal.h 1c4ce909 124 +vax.c 8b21b83 12436 +version.c f5590e6a 107 +xsum.c e05654a7 6653 diff --git a/tools/connec/src/xsum0.out b/tools/connec/src/xsum0.out new file mode 100644 index 0000000..e337db7 --- /dev/null +++ b/tools/connec/src/xsum0.out @@ -0,0 +1,59 @@ +Notice 76f23b4 1212 +README f11dd32a 7973 +cds.c 147aded1 4221 +data.c 32116b2 10688 +defines.h fd9fa7c5 8720 +defs.h e48cebb 34523 +equiv.c fdeff25 9340 +error.c ef1dd812 5015 +exec.c e8f52ce0 21217 +expr.c 6bfe005 72276 +f2c.1 b0441b2 7532 +f2c.1t bf1f87 7574 +f2c.h e770b7d8 4688 +format.c f00da069 59974 +format.h b396862 458 +formatdata.c 1f0f56eb 28988 +ftypes.h e2533d86 1836 +gram.c 3794117 64242 +gram.dcl e38579ff 8463 +gram.exec e20ca496 3033 +gram.expr eca86241 3193 +gram.head e6bbfeab 7362 +gram.io 101f7521 3350 +init.c fe1abab5 11833 +intr.c 1ebf37ee 25016 +io.c 1739e50 30664 +iob.h ece45655 548 +lex.c 1b0d5df9 34746 +machdefs.h 4950e5b 659 +main.c e23f7b59 20898 +makefile.u e0dd1cab 3710 +makefile.vc eb8aae7c 2685 +malloc.c 3505600 4020 +mem.c ad64d7c 5437 +memset.c 12a1e1aa 2121 +misc.c 8d99c9 22945 +names.c fa887031 21553 +names.h 110806d6 569 +niceprintf.c 141fb644 10950 +niceprintf.h c31f08c 412 +output.c ff23aa0b 43483 +output.h fa6797d9 2103 +p1defs.h 1b02743 5741 +p1output.c ff485aba 14681 +parse.h 18d34e6b 1119 +parse_args.c eb2fd4ea 14145 +pccdefs.h 1b4fbbee 1195 +pread.c fb4d5427 17831 +proc.c e6d47490 39179 +put.c af0be95 10345 +putpcc.c 7669b2f 46093 +sysdep.c f34bbeb6 15877 +sysdep.h e7826434 2755 +sysdeptest.c 449a7d0 428 +tokens 188b7c5d 733 +usignal.h 1c4ce909 124 +vax.c 8b21b83 12436 +version.c f5590e6a 107 +xsum.c e05654a7 6653

>= 1) + x *= x; + else + break; + } + return(pow); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_ri.c b/tools/connec/libf2c/pow_ri.c new file mode 100644 index 0000000..e29d416 --- /dev/null +++ b/tools/connec/libf2c/pow_ri.c @@ -0,0 +1,41 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double pow_ri(ap, bp) real *ap; integer *bp; +#else +double pow_ri(real *ap, integer *bp) +#endif +{ +double pow, x; +integer n; +unsigned long u; + +pow = 1; +x = *ap; +n = *bp; + +if(n != 0) + { + if(n < 0) + { + n = -n; + x = 1/x; + } + for(u = n; ; ) + { + if(u & 01) + pow *= x; + if(u >>= 1) + x *= x; + else + break; + } + } +return(pow); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_ri.o b/tools/connec/libf2c/pow_ri.o new file mode 100644 index 0000000000000000000000000000000000000000..e9f5b4505257e40744b3944c4254bfe6eee1f2f5 GIT binary patch literal 1504 zcmbu8zfTi!6u{q61w`-)A%+Bpx)?O_O-Ug(4A|HxXMzqUnCKw6)@v}(mfU?Cs{>3- zE{u+j{uvM*WOQ?M)HIr=9b8QGy}S3y*W+%H*QD>g&-eYh_r2S@yLNBLvOvUw6*%#P z0=yeKu}h&@f(aOhzMZw5H^V(Ud!DGXf2a$6`{^+n?J=R9%g(PaJ^R^F&7S+z`R;uF zrZ4sEC&%wC-A8@Y`O*In)|9{Q?P)fx*N?zzXRX=sk(`Stk=B;#y6VUQ>zcx=L79lx48FN z6wOa_$8V&BjAXE<$Tcr; + x.i = a->i; + } + + for(u = n; ; ) + { + if(u & 01) + { + t = q.r * x.r - q.i * x.i; + q.i = q.r * x.i + q.i * x.r; + q.r = t; + } + if(u >>= 1) + { + t = x.r * x.r - x.i * x.i; + x.i = 2 * x.r * x.i; + x.r = t; + } + else + break; + } + done: + p->i = q.i; + p->r = q.r; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_zi.o b/tools/connec/libf2c/pow_zi.o new file mode 100644 index 0000000000000000000000000000000000000000..66ddb01cb87094d294513101d3e31302b127d037 GIT binary patch literal 1920 zcmbu9&1(};5Wr`%rH!>s(xMQoNDon>&?TWQh9Wj;)ASvp1>2MsEz9PMmNtzf8;w2a zp;ib*@b1NC=P1%oYGa`B?*O!mFzxuz#)dCbi3&Ac~n-tOL;h{qg? z0zwqH3{6i^fN+~+H_R|}Ll-2b+4{bpReq(}X4_dm&ag_<=M8SL%~Ncn>c0P&&_=Z! zsJlJwb$3sj4~>`;t*Fn*D!b@4P~7Lty1!S^JxR;&U1C3~tn!6b>g?e#ky-=4W;-== zHtY7+>hAd(>W`>#%x$6GuDfsSBYXK&G2f&9%40rRG4ng9al^R}IQI@?-|jt=_r#hO zsIUaEO*})I4O%BEb+Gjp{_6|R8zoQ~LJmexa8p^k21?nZ^mTPOA7KNj6Q}uHopi+I zdEkh+yz6Sz6?S~?ba|0PT+YaG9wn=T(L--?e0-$epGcNg%~JnGZCDEo43-*R@NO`q z1%}RB^f2LQLv4Ap04hGML&D^Xxw1NQ1RpwrgBBkT!p;0`eQgPJy=WS#Wj(dHtY?j-70@T+Q)7|1J{5~i zPt52uk+JxM4r_XP=@#E~hHD3EI_=NjmSiPP-4uM8b7EZ*-{#!D&NnH(Q;P4G;{WbAd8VPquYo-NOc6*lQU9Mr=w4p|s~g~}XK&uAa< zCVDwP$9XUJg$nUzig>|=FLa3K(|ySj=J`<>qAl_S9z>&6{ad_#Q76?;aUx&vF=Vur z{fnW05Q+WUu=@;SXiar, a->i) ); +logi = atan2(a->i, a->r); + +x = exp( logr * b->r - logi * b->i ); +y = logr * b->i + logi * b->r; + +r->r = x * cos(y); +r->i = x * sin(y); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/pow_zz.o b/tools/connec/libf2c/pow_zz.o new file mode 100644 index 0000000000000000000000000000000000000000..3196158648034a173fa9ab2e2f1feaa39fd07a38 GIT binary patch literal 1792 zcmbu9-)qxQ6vt10xJ5hCZ2C}~NFJip9}As26a{Izb<41BV{O6VB&2QT#I+quinWLe z199L${{#OB|AFb=d=Y%{Pw>H~fo}snC%L!1W~~o;N^;Nr-19vrIrpY7@`c%GBm&$b za2t9vPH~L){H*V0VFVIjl*&bO`$uMe=g{2wY3_VINGb~w-iE$Ylz%%&j?QSr@^rf! zz_n!h8_r6!uyPV-A2DoIQ_%a26Agc%rS;@%~%uP?-vSU-%>Lj(Bm04^QjbS9J|6#R<)_{f0xu>t(_0Dczv zn9v7*50IT35Dy#8hu}VHRGTi?p53?tYnD~DD=s+gP1tNcu{s^F<_e2BqhKx0&KC0} zt7PN~c?%PwjR%8&+)to?_$x3~;M6tFrv!dn;4Gb=Cn4~6LOgYu=TRAt;z+&jn(jWW zdv*nM*V_ulb?$9B8@BE_Z4Y$cb=Ix5ExYc3Uc*-hz2dr{SDW>^)4-5M({uE>h4O^! z+11D0{Qv2wsHf)*pRg=4GQMBIEc9*&so(V1lEq6jg&pxWgVbB9!%t?4@k@+T-$avG z6HO7K&-EOiN2g!?*Q`FTL-h%9J?FIlR4V*MF0uN!^oNDMBh!gf4r}x5$y|0O8pTn{8*#7815a# Nzh`ho6r&&3{{|2PxQGA% literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/qbitbits.c b/tools/connec/libf2c/qbitbits.c new file mode 100644 index 0000000..ba1b5bd --- /dev/null +++ b/tools/connec/libf2c/qbitbits.c @@ -0,0 +1,72 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LONGBITS +#define LONGBITS 32 +#endif + +#ifndef LONG8BITS +#define LONG8BITS (2*LONGBITS) +#endif + + longint +#ifdef KR_headers +qbit_bits(a, b, len) longint a; integer b, len; +#else +qbit_bits(longint a, integer b, integer len) +#endif +{ + /* Assume 2's complement arithmetic */ + + ulongint x, y; + + x = (ulongint) a; + y = (ulongint)-1L; + x >>= b; + y <<= len; + return (longint)(x & ~y); + } + + longint +#ifdef KR_headers +qbit_cshift(a, b, len) longint a; integer b, len; +#else +qbit_cshift(longint a, integer b, integer len) +#endif +{ + ulongint x, y, z; + + x = (ulongint)a; + if (len <= 0) { + if (len == 0) + return 0; + goto full_len; + } + if (len >= LONG8BITS) { + full_len: + if (b >= 0) { + b %= LONG8BITS; + return (longint)(x << b | x >> LONG8BITS - b ); + } + b = -b; + b %= LONG8BITS; + return (longint)(x << LONG8BITS - b | x >> b); + } + y = z = (unsigned long)-1; + y <<= len; + z &= ~y; + y &= x; + x &= z; + if (b >= 0) { + b %= len; + return (longint)(y | z & (x << b | x >> len - b)); + } + b = -b; + b %= len; + return (longint)(y | z & (x >> b | x << len - b)); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/qbitshft.c b/tools/connec/libf2c/qbitshft.c new file mode 100644 index 0000000..78e7b95 --- /dev/null +++ b/tools/connec/libf2c/qbitshft.c @@ -0,0 +1,17 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + + longint +#ifdef KR_headers +qbit_shift(a, b) longint a; integer b; +#else +qbit_shift(longint a, integer b) +#endif +{ + return b >= 0 ? a << b : (longint)((ulongint)a >> -b); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_abs.c b/tools/connec/libf2c/r_abs.c new file mode 100644 index 0000000..f3291fb --- /dev/null +++ b/tools/connec/libf2c/r_abs.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double r_abs(x) real *x; +#else +double r_abs(real *x) +#endif +{ +if(*x >= 0) + return(*x); +return(- *x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_abs.o b/tools/connec/libf2c/r_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..91c5918ec2b2b940f493262b3fde9bd71ef0acc2 GIT binary patch literal 1616 zcmbtT%}(1u5FX>ENhxhY1QHTel~dJLW#x$QqaKi}2)LjMA<=>L8!2!A z9-$A?hp5yS;Dq`fTsR=n8G9yK*3P9J%bxkZoo{z$*L%LXvo+;7Am+dZjFGSams8`| zPeLD_!V|bISBhm-ASNnYmp}jdUH+J$Bu*0T&xJ|MF>p@zz!_GY#hGI12NqC4{uz%w z7r}P3`L_0Qzdh*bL2XT~C~s+bkf8cmeO-BtS1Bv`6TF+-A%Kfdp1JTKkH+kz)6AF) z#SBM;3#AGCqY3ho}{_V_8Tlr{kuoZtqf? z=LF)ZD&cDefA7Ch@kv()ZBVg}Qhz8>6dnaiheHi2>K_C;P@PyeOi*7%L|Nfs>su6b zLr|0lsvXCmI{j`p?4i2X*P+^ezrPggp!1z8`9DYfP#@`jj_2|@9PJmM0ye*=}QG6B(gr*k~A8$Nx5vcwIZQy(%mLFaBy+-XE-}K zN;vp4933PiE)EiAw(sfd%ho~6=IzY<-u&LYnb|#$CF4z+20}DggqkN%fNWFE)?HJF zAauam#Yk*SL7O`c88vFP+z73JLDl+UvQ03SYH;)5117^7Po;Qj_U z)}aXXvRAr~TQg!58B$`&r5k$TP&Ukb$p#~lOf4@ZjZ{3o9ZMVOrR8MIKu#x-QJQhJ z;rjflN*HYt8eiR9nSD}l%p5S=DOdG@u*%kv$sFt00p^<4fw5mU3l^|F(=mbNY#Ug< zR47p({{xPF zC_=OBk8N6^P8>YQq1S6GRU6@ZBtI6a>V$;~1Uq~km@83)r6Nn7}f&4J=zK z6s#hK6ibf9QY%~Iwqs@w++zRm3G?%+H=y&}VvgMX-W!4;Tr>+Emn?UD2>l#vK~0dj zIf0LHTzd8{W83`#M7S18@P$8whFAT2kNWf$1YgvTAx5FH-Qd$Nf7LNDW{u;sW**^z8DmV9;g6n@1y&s?{nrhlV4Ke|`7ccNVILWAT; TqSo)mJum(%58RQsWUBlRnEg~~ literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_atan.c b/tools/connec/libf2c/r_atan.c new file mode 100644 index 0000000..7656982 --- /dev/null +++ b/tools/connec/libf2c/r_atan.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double atan(); +double r_atan(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_atan(real *x) +#endif +{ +return( atan(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_atan.o b/tools/connec/libf2c/r_atan.o new file mode 100644 index 0000000000000000000000000000000000000000..7dafa1d957071328680591cd2a7e9311d13c2f89 GIT binary patch literal 1368 zcmb_bJ4*vW5S~la#8-?WB19yW_#jJyilQKAG>Jk`e1X~=7rhYBOCWavwa~)G(w|{% zWhrRk&#<%*6l^R6ow@Alx||l`guR*hcD|XN+098NpABdl2+?2$zC3{fYzDq;-7|G) zgH~8LeGC^no~~aywnGnuFPz?nZveWz7y#{P6|{q>7HbQI&oMFKeSEKn^n4_`5(xw3 z=H{m2gByif*{#JV*f>ijMr)pzI!;ZpNB64sPLvB?sGl53 T)cT#c=f{8Lfm;%nOqKrue^FFo literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_atn2.c b/tools/connec/libf2c/r_atn2.c new file mode 100644 index 0000000..ab957b8 --- /dev/null +++ b/tools/connec/libf2c/r_atn2.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double atan2(); +double r_atn2(x,y) real *x, *y; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_atn2(real *x, real *y) +#endif +{ +return( atan2(*x,*y) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_atn2.o b/tools/connec/libf2c/r_atn2.o new file mode 100644 index 0000000000000000000000000000000000000000..7fcee7c93c04eef31971b22c1536ba202a2d3007 GIT binary patch literal 1384 zcmbtTOG^VW5T3Pa*9WzVf}ltbB0ezGM^O}HZEdSi6nq@?vTk*yplzX>f_l({f1p3b zv!{Yy{0II74}yYML1(s!#;|(OS(0z&o0&{9$zG;&nI^*kDF!UTmnB(%LerOS`Kkq- z&;hGgPv%kAbN#hzFN}DP7eZcj3()Jw0vP9;V4OycfzGg5!ve$)3f~anN+h}) zF#)ov)Iw}@Ctoe`YHW@rSbTD(>RVG6Q}Zl7JJw)D?r#tZJPAMuzaR-gOAw9Gtv~SL zA9y^6Ce+iY#*s-Y^eFrEdx2a8M^HRC+$l{%#dbJ?oy~0|mvi<;CbN~^wzrp)xwMU$ z0Db-p(2Phm-rgG$6Fgn#w|i#ZS&=(=U>>hDupqUHd*U$eo^oKm>K5#yic@rf9pY|) zs|Av^@uYMDjSXuT>nBUKanD(-Q2piBkP8yA?5ArH zHCpqp`4;BVn)*3q{c-fEBI`?BL#Nc$xEs|_bUl`Az4sJerwQey0nm;}?_KX7-K&0f bO1Tz=hRIMwuiuTnpnOwoYFEi6RnPwbg#}qq literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_cnjg.c b/tools/connec/libf2c/r_cnjg.c new file mode 100644 index 0000000..cef0e4b --- /dev/null +++ b/tools/connec/libf2c/r_cnjg.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +VOID r_cnjg(r, z) complex *r, *z; +#else +VOID r_cnjg(complex *r, complex *z) +#endif +{ + real zi = z->i; + r->r = z->r; + r->i = -zi; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_cnjg.o b/tools/connec/libf2c/r_cnjg.o new file mode 100644 index 0000000000000000000000000000000000000000..b13867885b2aa81b7b826cf1f9a10157cd9ea5b1 GIT binary patch literal 1440 zcmbtT%`QVx5T2_={k9qlQH!nw;iQd!3u)5ONE!=?SaMqzL0h@^G${)_f(P&*_7dr1 zcm#=!g@l>gnL4gp3#PeezWL_woH;!=8^z5o%K{M#*5S(%7T}=k3+H^8gCQ7%*LY$x zip%h8d?X&<>n0b%LiEuOqUE-Y5R9^6UG0F?NLZ=C-q;;BOdvnOzH!!2$miG6Q@f>l zRoBzYYEfn8=Ig$dz0R(v%))ewmG}-i5_%$l2>!w(0?{xUqkB5=y&d>i2fptI-iYiCk~Crx;=kRi@-8ddE`jp2+tMe3T<6?Y z+G%J|Ztc+4wkmr%yMz`woRj?{*RD9A$OWq8d7#R*O2w&SLbawHRoLF0^R!()^IQLG zN%Ovglh1M0_B`1Bc1Gk<_|a|V@H3^!fn!Yeqb5pjO!!IWlN=}NfPu_ic(FyVqJ!!h z&&LnF;DlM$qNKmr3kbsY{~WS^ij#cVe;zps4gRz4kqZ+p+jeasqMCor-^N_3nZeH# z=|5wVh^4>iJ%cktpG?ERk|z||!P%3q$pJ5{2T;?i49<_Z;MpnVfg25xVMwt52>QbE M-#E~Jyuajs0-%smasU7T literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_cos.c b/tools/connec/libf2c/r_cos.c new file mode 100644 index 0000000..4418f0c --- /dev/null +++ b/tools/connec/libf2c/r_cos.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double cos(); +double r_cos(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_cos(real *x) +#endif +{ +return( cos(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_cos.o b/tools/connec/libf2c/r_cos.o new file mode 100644 index 0000000000000000000000000000000000000000..e11527dcaaa5dca56e9f635fdc0cc5e7a87006ae GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?qDGA(BB+o`e2^ugqA1AuNTLu7Y68*bxWp4dlR)kQYN3UVr9Z>k z%2Lq6pJ8bsDA-sCI&;}Io8@95PPmK(?u7>#nIo z5ISJ(;w7-({d)J_z3YD_eC^^Pa1YSu#sFxiTc90>w85Z1aD|BpAL4ucq*uE_n_U5b z#LCKicr=r%6rDSits7#{`zMZD9FQ zp$ap~E+jI6r?M7b79@P$8uhFAS3kNWf$1YgvjL5xDx7ki1Am+-VdTMKAW&cE_? zpy_hb?EgiO`;GKU!XR}C7uNI63AU3T4<5R(w|{% zWhrRk&#<%*6l^R6ow@Alx||l`9D6hK?R+!4GkcoKrURM=LNu6zFHfKV+kr1z_e>qy zpcR&CkKz4}r|XxF-OvN!OSRkZ4M4XS1E3wRgI0}deQlxeIVL8&pYQdMUW`Q7B4L2c z!oo~!Xe(DKx|P@zOR)IZM8)&QPsXQNd~&#sa_(;`=z9ZzAbx%lghoFYqnm!fLqFhn z4@IbARKdul9(PIS^m>69W$=rKvXL)21u!z%)%j%BSWTxlQk%wRaz2|fkkgKfqyZP5 z?(MxUF| zwpGNCV#&2wW@T&4an1aJSL`2tF@9ck0y@tv`o-PvcSEob7xhBNCCeReLN5oKQ4=I4 zC-6~@OV8e8YAkD{qq(YgC&~pcG(e6d TYW+^!^W(qrz#WN8rpo^Snypl7 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_dim.c b/tools/connec/libf2c/r_dim.c new file mode 100644 index 0000000..d573ca3 --- /dev/null +++ b/tools/connec/libf2c/r_dim.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double r_dim(a,b) real *a, *b; +#else +double r_dim(real *a, real *b) +#endif +{ +return( *a > *b ? *a - *b : 0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_dim.o b/tools/connec/libf2c/r_dim.o new file mode 100644 index 0000000000000000000000000000000000000000..ebd1a9b305fd56f8c45f99ff249ef50ce8e02a63 GIT binary patch literal 1200 zcmbtT%}&BV5S~&MP-D?}Fu?;}j2hWM{Ea522`U%k!N|p!V1XKp7Lv9Y^q@X~2ai69 z@d)98G~orDp}Tcm=|v~meluU^o1ZN_9vmIUG!2Alum|6fU;#cQ(j3qxOu#twjZ_@Z zl)<{U$-Z&k?HgyE-lg%;=?$`Gc?s?Q1hjTaOHalVFIX#u{5*e`<_N_?VJEXxsg_^}8+{)?w;n~~-TcXi9P zD+eIM6*QT2#Q@B^b9}3U=(_>dh3DICADC<3Sj?`MFI~&Afz>SE0#@-nVAZDM*bPi+ zG<};Dk4st4x2o5?)Bk|xr#aOdFnQT8OX$3qFS&rRsQOdzJ&q=Ve1?6FsW=SN$$(sV2=Ko9MqHljw{70{10O zPJNRD$rn07QLNrQy?f^g9gayv`ZcTfN4&Z_N!q-T`VUb1Pek z%2Lq6pJ8bsDA-sCI&;}I>vCF%6K-eb+xcd8W;dttRH8xCK!^r&Q1=81kZY*hx@+pt z4sEb}_7o^|KHt1{ZuuVxUp~7F+yeBtF#y`}I%w69*5B?ATwr3t2l!qu>7`(3Ef@eu zE-uc5hqL)g$*F{=*d&Wa#w)HDJBdxR=)_13<=o$t&$9ynAO5_=2TfiuMmPU}`+vZ( z4@GE}-O_p7o)M#ygp^ovDYF+2Wy7i-f{{$67v@t&I+56jXN=7JLMm<$uY(qpM*Qd$ z?;kY@qfJ8B_w8PpeN=SJJTTiS*YvKi%GSQg9INU8b4_d4D3r~j1#HK3OkjE22DW`r zELtTDDIGW#ORi=kwqtJZxyAlr3G?%+H=y&}VvgMX-W!7b_|YtM{A9W3L+ImR3u=PI z%?W&r<{9 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_imag.c b/tools/connec/libf2c/r_imag.c new file mode 100644 index 0000000..1b4de14 --- /dev/null +++ b/tools/connec/libf2c/r_imag.c @@ -0,0 +1,16 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double r_imag(z) complex *z; +#else +double r_imag(complex *z) +#endif +{ +return(z->i); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_imag.o b/tools/connec/libf2c/r_imag.o new file mode 100644 index 0000000000000000000000000000000000000000..66285bdbef10394e4ffd22f076fdf8978d3604e0 GIT binary patch literal 1184 zcmbu7&rZTX5XPqz17ySHKv!o>WLP!j}hkK+2gx6D(I3< lD8+wscz(#kcSlQ;8gV@`T;cxHijDF=Q{h?9HT((tzX4k!JVO8g literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_int.c b/tools/connec/libf2c/r_int.c new file mode 100644 index 0000000..bff8717 --- /dev/null +++ b/tools/connec/libf2c/r_int.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double floor(); +double r_int(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_int(real *x) +#endif +{ +return( (*x>0) ? floor(*x) : -floor(- *x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_int.o b/tools/connec/libf2c/r_int.o new file mode 100644 index 0000000000000000000000000000000000000000..13741a080aa6358d8b72a54201ad31e0fc36cca6 GIT binary patch literal 2088 zcmb`IPj6B|5Wt60+p29B8%>DSNK7=?&<#kd#)D#r?ZHNk>7S&U5TK7#Es(&YK@XOX z;K}GW@C$hHB*hQlpNn4o0v@zulR)JG=WhxVyG876^by0B%9w z6AJKtylG1}HAe0MG;WL2>2wanX5H}k zKC*_@boyo_x{<4u+*;(iUe@u&WX*VqSBV=s zzI3HaW&8*o^xYwVApZO$2-fCV1A<^GVUeyGgvlXBAP7?<`0)|^#1QYEt>Jl2n32Qt zJZbpw3aGw*Gdg4VxT(J}xjD-`Vnehq;4^2{v$t1zEgc7Ju2PerCP~c_HOo-RJT1AD zN-8ymHdWyW4-ko*3*uA-;TO>+Ax>)(o+gMwd>S9&8GRqua&R$l#PTd7vDeq+6tjTz%Y87<8Tr4_RR$VH)j$XaLu~>Dp`R6>7e^ay`T1WSs^>d}z?Cm@I z18YV$j}M*B6h5}3_$dEiNP9}La#O<0FEgKGU(^vBv?sR6O%R>LPRi?z5Aj6fb}-uA z`_b1c98c%PmK4XwY>2kZU+^6?{MH}l3CcQY{q$9lc;OF`(W|^Se~;gfT?699o7hV^ z|2FONwp?vu^?0=r}_aMHq>J9P`8QsIII@572C_YiJJz@2kcIuR;Y*m z10MZzih2TYAkvVg^cbvQ-L0vykr z+D>dba1rL9b@V0IEqp!xUf9i^5dW>PbCz`L=zZ=TK>qXc;>(Yp?p`7e#X5Kh)_&1i zn#<;1VAC*tc#Ztcv}c z%A|G#kijoaGH@o1M(=Y|`0NxO`$&-t%ucY$%qQ!ijKv9Wfb+;LXnn=ALvDVGKM1#G zLw~dfq1WFl+u$|b&FY5hZ8jQ@>RaB{M%Ar*fM=QrO@ONW@iUP{#nUyQu9z=r{2%v5 zL@x%?Z-aS1gYA__`km)0_x~uWpXxSG)1N5V#ze)e*qIVXE^`> literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_log.c b/tools/connec/libf2c/r_log.c new file mode 100644 index 0000000..94c79b0 --- /dev/null +++ b/tools/connec/libf2c/r_log.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double log(); +double r_log(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_log(real *x) +#endif +{ +return( log(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_log.o b/tools/connec/libf2c/r_log.o new file mode 100644 index 0000000000000000000000000000000000000000..7d5f0c82cea6a99a1a35cbca2a3b1b3449ba5ed9 GIT binary patch literal 1368 zcmb_aJ4*vW5S~la#CH_&feNX_2QCR36a_gSNfd&jMu;}YMNb3f0l5pPg%&oJ{tRm? zOF;{NhNXp|U}GWZ%w<>C<+KpzxSg4A=G)nw*^_uG;nOq_qQMM&c>)E<_`Yo2HFao$ zMp!(34DPl*UB9$$1s(`rJiQIx0Cc!H0NT+SXa^y!wJ;X-|Z0*jAUwMZZ>7CBogcKw2_{jOT`T+8~M^6g_~(XsllI4 z_x4_uFxn(EzHf77_F=&>v%qYpT-7;Ym94zV9P7XV=9*T{*e#m{3)qh7n832O4Q#tq zC|E^IDV7|IC6_lwZO7c+cZ>bQ66WVsC!q7aKl{S{Z+Ani7k}!7j=wB-Jh7XD^{5FF zlN0y|$E9cQGBWN85aC)V!597j8eaA9J?hh|6ns%Xh8U%)FZK*EFX7vMhNjV?J^#wr zkxP53_Z0PqF(!+sFZ2=yg)Qe@%8q2Kx#X+8r}Qh%dFHwSHNAJWe>7M1?nJrZh5E^n TM6KV3F)#irPu!HaWUBlRp3zhz literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_mod.c b/tools/connec/libf2c/r_mod.c new file mode 100644 index 0000000..63ed175 --- /dev/null +++ b/tools/connec/libf2c/r_mod.c @@ -0,0 +1,46 @@ +#include "f2c.h" + +#ifdef KR_headers +#ifdef IEEE_drem +double drem(); +#else +double floor(); +#endif +double r_mod(x,y) real *x, *y; +#else +#ifdef IEEE_drem +double drem(double, double); +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif +double r_mod(real *x, real *y) +#endif +{ +#ifdef IEEE_drem + double xa, ya, z; + if ((ya = *y) < 0.) + ya = -ya; + z = drem(xa = *x, ya); + if (xa > 0) { + if (z < 0) + z += ya; + } + else if (z > 0) + z -= ya; + return z; +#else + double quotient; + if( (quotient = (double)*x / *y) >= 0) + quotient = floor(quotient); + else + quotient = -floor(-quotient); + return(*x - (*y) * quotient ); +#endif +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_mod.o b/tools/connec/libf2c/r_mod.o new file mode 100644 index 0000000000000000000000000000000000000000..bf101c82664ca9170906d19c3f09abc3e9973021 GIT binary patch literal 2104 zcmbtU&1(};5TA6lt=jg*q99fzCyAwbY)q@A2aN<<4@H8s6|Gp(WS4*@kz^~?gVl>S z!L#W9;ZZ9{!Bg=AK@b%^NDoT%DCo@Yo9uLxBGec5&HR4z_2zwK<;?VCS1blRVsH{d z#4Ny*9ig7})hrA^Ke+1q)1T^656br_54$S4)>Kzsx=QzxTYVmx^`?ra2%-MTRWn}^ zj|Eu&QuiLB+B~a9o?((Ns0@EZzt>H*y51c+&b)1^%b&^Ms@ZR@ntQY1xaxvmohD7hbOrs`Bw!m^M4S$%%2earvC@sxLNTEi=Z1`J&dv)-_MBx8 zbiGz8cm-W-c;gbJk0T;4r@Y|S3l#@6`GH<+G(Z3G1#D2_k zJj=`$@p%)U;6Nk!ezTl3@pK>MxNhP{B#AoLW%@KKo%&CjC&}xl{^?(X$+T m+Z@0zx_|WF673x+unn0YAVzdqd(qY@K5Nd;6S1U5=0 ? + floor(*x + .5) : -floor(.5 - *x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_nint.o b/tools/connec/libf2c/r_nint.o new file mode 100644 index 0000000000000000000000000000000000000000..675cc28027ef2259a2bf51e4a98b2a0135279298 GIT binary patch literal 2264 zcmbtU%}-N75TEjdq9R*~CMX(v(NqGP)`Aib+N4oD5MmV67!^zHOZ{l8?Zco4(TnjW zM-L{(|3p4w>dlXnH{!voq+CsO=Iu`3@LFPm({yKkzn$6Hot=FP=O)f~L?XZvfin;w zW&!#;13TlJ8Bov*8!8r6+Mlf6bJed;8|r$!p|0&AA6F%o8Y*_!+Fx8X^$qb+gY^&f z@;#c33u8M*BJAeb$IPy#$f@SY)6l+P#Pck0F1^&i!QP z@oe^VJTW~xSN7)Or}U^!4yWgQlzNsL)5($JhGqXPwA1!R0UZ3b69;y*qtRP5f$(sk zOQ67XpgRDvg0v6y1f<95_<{j#ZY!Yxt(U7L$1PvoJj6!v$e7EdjY}78+ftsrD+cwex!P6O- z_umj=^6wG+DB2{%)9YaWTSTG|-;00dxlxIi>%T@!5?=qEpvF{_=<&(v;hLAr-?!WPZ$;;$bA?|<204;ue;6n_#}EUksEacO zHpf@C<<~7kcTah^fBP+e%<_E}vr5=vhhGR|*6A(clQy37@VcCzb!LnBi#9&afmZW7 zV}04iQ~ybMXyb<@i8kkDdJ>Ix^_#Z`p@+WUJUgV7Gh{{@Xk|BV0u literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_sign.c b/tools/connec/libf2c/r_sign.c new file mode 100644 index 0000000..797db1a --- /dev/null +++ b/tools/connec/libf2c/r_sign.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double r_sign(a,b) real *a, *b; +#else +double r_sign(real *a, real *b) +#endif +{ +double x; +x = (*a >= 0 ? *a : - *a); +return( *b >= 0 ? x : -x); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_sign.o b/tools/connec/libf2c/r_sign.o new file mode 100644 index 0000000000000000000000000000000000000000..7c661ff743bc6722f6f00c8bb5eedf359c9f30da GIT binary patch literal 1720 zcmbtT&1w`u5U$BYH!(l6`2mG^SP(=d+sr00S#pq-#l%Ap5u%`nIJ=n`Np=@zdLeo+ zc?2K9V;&>m)yMFb<3jKtXw^*BY^P`TqBV3^)z|fPS5^0%KHJ$Ea~u$H;0X*pK>_OS z&~7AV17=|c241=3sT+hu3j^=%1p>34nn{4E!FTUXvUd6NK&;DzZA@o|EoO!-GU9xG z1;Qm^Uy-;lUIb%wQhRRAg;EY9z=eqs_~Z!uRt`_^E}!SkBr>1p6ywxSQ^=n;`jGWl z?KFMBsYcTZM0@ea4_(MA8bcms`}nPQSVnyL`pmcbmK}Eg&KnJQF>owDgdN0Gh8f<3$X8&5vh%Mou+ic)4(P!EYKFH7#@ zKI8KoCrYznzZCIBQ+~9s%|By)g|#SoU!u2gf%u%RguyqqmNO(ZB!7XQqES@;Id3R+ zQvLK73SaP-h|&4>pYj8-BB5AQUZX>M{wx0-a%oQ=hbeOYBNIeh&KJFJU}or*=@_=~ v1R~$=J+1xXfI1VV(WhbekN$DHcB1;c>1}chvCp5wwIcon^W`1N7B>GcEi-uP literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_sin.c b/tools/connec/libf2c/r_sin.c new file mode 100644 index 0000000..37e0df2 --- /dev/null +++ b/tools/connec/libf2c/r_sin.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double sin(); +double r_sin(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_sin(real *x) +#endif +{ +return( sin(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_sin.o b/tools/connec/libf2c/r_sin.o new file mode 100644 index 0000000000000000000000000000000000000000..a88cb7b22740a3797d4a6a40ac83162a5af4864e GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;ya3n5QS9Y1D6C1ih`WRBnmp({{xPF zC_=OBknZ0l*8}@z?j8uAcVLolFCX*Y9O=EL@A)PRY*Fg(PBYt#> zxA(e)(I%nm`*yF)J}Nk72AJ)X>pCy2vUO-O$ErHOT+_-Mxw2WXfbE%%2`ppVz_O)6 z!75@%vE*1RwX!vCJ7)I4E%pyfn4ed@0iEX-bL8&#-VhAoN3+oJljV*Np`U{-s0k7` zC-5$yaAj;a8mV%ylbj`p>BIqkC0*C&~pcG)Rsl TYW;59^Wwkqz#WN8rpo^SH{VnS literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_sinh.c b/tools/connec/libf2c/r_sinh.c new file mode 100644 index 0000000..39878f0 --- /dev/null +++ b/tools/connec/libf2c/r_sinh.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double sinh(); +double r_sinh(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_sinh(real *x) +#endif +{ +return( sinh(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_sinh.o b/tools/connec/libf2c/r_sinh.o new file mode 100644 index 0000000000000000000000000000000000000000..668766f922c4b4548d8b1be214659a7582d931b3 GIT binary patch literal 1368 zcmb_bJ4*vW5S}w?;xkc1govaPA7qJWP!!}eCQ%5AFHoD~5>FzU1acRM7FwjS^k-OG zSqfVCGb}9x1se-NXD++CE~kY!VQ*%>oo{Amc5|A{q#860glI4eU!Fh#wi>={-8FS+ zhc;NOJqGrIPuDNO9sdL2i?!Rp4M2|@1E3wRfmRJ^;dX!E91|1X&-Z#sFLZ`hI|Bge zL}EHJw3)3Gol0bq#aS#mUU9v#ld&lln;5R6oco*dd3FHc!=IPBFjtMMl+rVIbPlTUWy#bx)7IWn8_udc;=Gr7kUXdg)PTj%8q2KvE-|>r|>JzdFHwmHT@ga`O&?qy%Xhv7aAZ( U619F8?s@TFdEmChB~#^p0J6$dZ~y=R literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/r_sqrt.c b/tools/connec/libf2c/r_sqrt.c new file mode 100644 index 0000000..e7b2c1c --- /dev/null +++ b/tools/connec/libf2c/r_sqrt.c @@ -0,0 +1,19 @@ +#include "f2c.h" + +#ifdef KR_headers +double sqrt(); +double r_sqrt(x) real *x; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +double r_sqrt(real *x) +#endif +{ +return( sqrt(*x) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/r_sqrt.o b/tools/connec/libf2c/r_sqrt.o new file mode 100644 index 0000000000000000000000000000000000000000..b927646e11e95b2e2ecc0cf1d2a1f79bda505c68 GIT binary patch literal 1400 zcmbtTPfrt35TB)L7fRSdJT$?WJrLtRUW!08kdQ6V7L!JzmV;b2Tik|3TjK6(tQ_FL z7vO{VAxQ9mH&4coK%!AouO>RP`=-1u+lx-~_BZp}nfIH{dwW=}RYnX0*bG>Ki-=i( z?#PAjM6Ltlkb{k*Z-u7y{nS<0bbU0YkSZ*Mg^ZP~FOibYYJ zo$o}^+`-%Jq+ z_*mog)X#dL`CP{o#mU*zyDuu?r@}Ery6?&P@my6}AI_A}%{~)5N&QKrle44Df@;D1+N?Z0KyCwSp@og5Kf~I} zQqaPmVQC>K*jNZUbJ^8(IW5Eqw=?tYd^0< zd#_0pZ4$b^Z}-aF!y>nHz+7Ib>4LN>&c4mKbHIUlrcfig+r?(*avi<~O6so`2GsOHvr2X8QL5p(!m2V=K za_W7``op-VimWg7B5q1sjk{DG#nxlV*Jn@RSAz2_bTexD&*<}`d)0d<%7rM@PmUsb S{SMsoNg*sjfOU|H7%mMa&F zP6>oZ6abEofOp#m8QMliGL$D7Q&BDZ`%AFWOuK=4+6C`g= z;-dmrp1sG|^1c93p{0_1=?|jeSO4CpKD`CWm-QzRqfq_Do+0KZBJJnaELxQFuY41^ zlvD3h)*rz=Rb+jsmvB?sYTTvjD7GF;zCL>jzY?5hp_@_Dzfqqb-K*X^Q7%NG0df@4 S>v!UwAOBSZZYx|eb^ZsL7gT8g literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/rawio.h b/tools/connec/libf2c/rawio.h new file mode 100644 index 0000000..fd36a48 --- /dev/null +++ b/tools/connec/libf2c/rawio.h @@ -0,0 +1,41 @@ +#ifndef KR_headers +#ifdef MSDOS +#include "io.h" +#ifndef WATCOM +#define close _close +#define creat _creat +#define open _open +#define read _read +#define write _write +#endif /*WATCOM*/ +#endif /*MSDOS*/ +#ifdef __cplusplus +extern "C" { +#endif +#ifndef MSDOS +#ifdef OPEN_DECL +extern int creat(const char*,int), open(const char*,int); +#endif +extern int close(int); +extern int read(int,void*,size_t), write(int,void*,size_t); +extern int unlink(const char*); +#ifndef _POSIX_SOURCE +#ifndef NON_UNIX_STDIO +extern FILE *fdopen(int, const char*); +#endif +#endif +#endif /*KR_HEADERS*/ + +extern char *mktemp(char*); + +#ifdef __cplusplus + } +#endif +#endif + +#include "fcntl.h" + +#ifndef O_WRONLY +#define O_RDONLY 0 +#define O_WRONLY 1 +#endif diff --git a/tools/connec/libf2c/rdfmt.c b/tools/connec/libf2c/rdfmt.c new file mode 100644 index 0000000..09f3ccf --- /dev/null +++ b/tools/connec/libf2c/rdfmt.c @@ -0,0 +1,553 @@ +#include "f2c.h" +#include "fio.h" + +#ifdef KR_headers +extern double atof(); +#define Const /*nothing*/ +#else +#define Const const +#undef abs +#undef min +#undef max +#include "stdlib.h" +#endif + +#include "fmt.h" +#include "fp.h" +#include "ctype.h" +#ifdef __cplusplus +extern "C" { +#endif + + static int +#ifdef KR_headers +rd_Z(n,w,len) Uint *n; ftnlen len; +#else +rd_Z(Uint *n, int w, ftnlen len) +#endif +{ + long x[9]; + char *s, *s0, *s1, *se, *t; + Const char *sc; + int ch, i, w1, w2; + static char hex[256]; + static int one = 1; + int bad = 0; + + if (!hex['0']) { + sc = "0123456789"; + while(ch = *sc++) + hex[ch] = ch - '0' + 1; + sc = "ABCDEF"; + while(ch = *sc++) + hex[ch] = hex[ch + 'a' - 'A'] = ch - 'A' + 11; + } + s = s0 = (char *)x; + s1 = (char *)&x[4]; + se = (char *)&x[8]; + if (len > 4*sizeof(long)) + return errno = 117; + while (w) { + GET(ch); + if (ch==',' || ch=='\n') + break; + w--; + if (ch > ' ') { + if (!hex[ch & 0xff]) + bad++; + *s++ = ch; + if (s == se) { + /* discard excess characters */ + for(t = s0, s = s1; t < s1;) + *t++ = *s++; + s = s1; + } + } + } + if (bad) + return errno = 115; + w = (int)len; + w1 = s - s0; + w2 = w1+1 >> 1; + t = (char *)n; + if (*(char *)&one) { + /* little endian */ + t += w - 1; + i = -1; + } + else + i = 1; + for(; w > w2; t += i, --w) + *t = 0; + if (!w) + return 0; + if (w < w2) + s0 = s - (w << 1); + else if (w1 & 1) { + *t = hex[*s0++ & 0xff] - 1; + if (!--w) + return 0; + t += i; + } + do { + *t = hex[*s0 & 0xff]-1 << 4 | hex[s0[1] & 0xff]-1; + t += i; + s0 += 2; + } + while(--w); + return 0; + } + + static int +#ifdef KR_headers +rd_I(n,w,len, base) Uint *n; int w; ftnlen len; register int base; +#else +rd_I(Uint *n, int w, ftnlen len, register int base) +#endif +{ + int ch, sign; + longint x = 0; + + if (w <= 0) + goto have_x; + for(;;) { + GET(ch); + if (ch != ' ') + break; + if (!--w) + goto have_x; + } + sign = 0; + switch(ch) { + case ',': + case '\n': + w = 0; + goto have_x; + case '-': + sign = 1; + case '+': + break; + default: + if (ch >= '0' && ch <= '9') { + x = ch - '0'; + break; + } + goto have_x; + } + while(--w) { + GET(ch); + if (ch >= '0' && ch <= '9') { + x = x*base + ch - '0'; + continue; + } + if (ch != ' ') { + if (ch == '\n' || ch == ',') + w = 0; + break; + } + if (f__cblank) + x *= base; + } + if (sign) + x = -x; + have_x: + if(len == sizeof(integer)) + n->il=x; + else if(len == sizeof(char)) + n->ic = (char)x; +#ifdef Allow_TYQUAD + else if (len == sizeof(longint)) + n->ili = x; +#endif + else + n->is = (short)x; + if (w) { + while(--w) + GET(ch); + return errno = 115; + } + return 0; +} + + static int +#ifdef KR_headers +rd_L(n,w,len) ftnint *n; ftnlen len; +#else +rd_L(ftnint *n, int w, ftnlen len) +#endif +{ int ch, dot, lv; + + if (w <= 0) + goto bad; + for(;;) { + GET(ch); + --w; + if (ch != ' ') + break; + if (!w) + goto bad; + } + dot = 0; + retry: + switch(ch) { + case '.': + if (dot++ || !w) + goto bad; + GET(ch); + --w; + goto retry; + case 't': + case 'T': + lv = 1; + break; + case 'f': + case 'F': + lv = 0; + break; + default: + bad: + for(; w > 0; --w) + GET(ch); + /* no break */ + case ',': + case '\n': + return errno = 116; + } + switch(len) { + case sizeof(char): *(char *)n = (char)lv; break; + case sizeof(short): *(short *)n = (short)lv; break; + default: *n = lv; + } + while(w-- > 0) { + GET(ch); + if (ch == ',' || ch == '\n') + break; + } + return 0; +} + + static int +#ifdef KR_headers +rd_F(p, w, d, len) ufloat *p; ftnlen len; +#else +rd_F(ufloat *p, int w, int d, ftnlen len) +#endif +{ + char s[FMAX+EXPMAXDIGS+4]; + register int ch; + register char *sp, *spe, *sp1; + double x; + int scale1, se; + long e, exp; + + sp1 = sp = s; + spe = sp + FMAX; + exp = -d; + x = 0.; + + do { + GET(ch); + w--; + } while (ch == ' ' && w); + switch(ch) { + case '-': *sp++ = ch; sp1++; spe++; + case '+': + if (!w) goto zero; + --w; + GET(ch); + } + while(ch == ' ') { +blankdrop: + if (!w--) goto zero; GET(ch); } + while(ch == '0') + { if (!w--) goto zero; GET(ch); } + if (ch == ' ' && f__cblank) + goto blankdrop; + scale1 = f__scale; + while(isdigit(ch)) { +digloop1: + if (sp < spe) *sp++ = ch; + else ++exp; +digloop1e: + if (!w--) goto done; + GET(ch); + } + if (ch == ' ') { + if (f__cblank) + { ch = '0'; goto digloop1; } + goto digloop1e; + } + if (ch == '.') { + exp += d; + if (!w--) goto done; + GET(ch); + if (sp == sp1) { /* no digits yet */ + while(ch == '0') { +skip01: + --exp; +skip0: + if (!w--) goto done; + GET(ch); + } + if (ch == ' ') { + if (f__cblank) goto skip01; + goto skip0; + } + } + while(isdigit(ch)) { +digloop2: + if (sp < spe) + { *sp++ = ch; --exp; } +digloop2e: + if (!w--) goto done; + GET(ch); + } + if (ch == ' ') { + if (f__cblank) + { ch = '0'; goto digloop2; } + goto digloop2e; + } + } + switch(ch) { + default: + break; + case '-': se = 1; goto signonly; + case '+': se = 0; goto signonly; + case 'e': + case 'E': + case 'd': + case 'D': + if (!w--) + goto bad; + GET(ch); + while(ch == ' ') { + if (!w--) + goto bad; + GET(ch); + } + se = 0; + switch(ch) { + case '-': se = 1; + case '+': +signonly: + if (!w--) + goto bad; + GET(ch); + } + while(ch == ' ') { + if (!w--) + goto bad; + GET(ch); + } + if (!isdigit(ch)) + goto bad; + + e = ch - '0'; + for(;;) { + if (!w--) + { ch = '\n'; break; } + GET(ch); + if (!isdigit(ch)) { + if (ch == ' ') { + if (f__cblank) + ch = '0'; + else continue; + } + else + break; + } + e = 10*e + ch - '0'; + if (e > EXPMAX && sp > sp1) + goto bad; + } + if (se) + exp -= e; + else + exp += e; + scale1 = 0; + } + switch(ch) { + case '\n': + case ',': + break; + default: +bad: + return (errno = 115); + } +done: + if (sp > sp1) { + while(*--sp == '0') + ++exp; + if (exp -= scale1) + sprintf(sp+1, "e%ld", exp); + else + sp[1] = 0; + x = atof(s); + } +zero: + if (len == sizeof(real)) + p->pf = x; + else + p->pd = x; + return(0); + } + + + static int +#ifdef KR_headers +rd_A(p,len) char *p; ftnlen len; +#else +rd_A(char *p, ftnlen len) +#endif +{ int i,ch; + for(i=0;i=len) + { for(i=0;i0;f__cursor--) if((ch=(*f__getn)())<0) return(ch); + if(f__cursor<0) + { if(f__recpos+f__cursor < 0) /*err(elist->cierr,110,"fmt")*/ + f__cursor = -f__recpos; /* is this in the standard? */ + if(f__external == 0) { + extern char *f__icptr; + f__icptr += f__cursor; + } + else if(f__curunit && f__curunit->useek) + (void) FSEEK(f__cf, f__cursor,SEEK_CUR); + else + err(f__elist->cierr,106,"fmt"); + f__recpos += f__cursor; + f__cursor=0; + } + switch(p->op) + { + default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op); + sig_die(f__fmtbuf, 1); + case IM: + case I: ch = rd_I((Uint *)ptr,p->p1,len, 10); + break; + + /* O and OM don't work right for character, double, complex, */ + /* or doublecomplex, and they differ from Fortran 90 in */ + /* showing a minus sign for negative values. */ + + case OM: + case O: ch = rd_I((Uint *)ptr, p->p1, len, 8); + break; + case L: ch = rd_L((ftnint *)ptr,p->p1,len); + break; + case A: ch = rd_A(ptr,len); + break; + case AW: + ch = rd_AW(ptr,p->p1,len); + break; + case E: case EE: + case D: + case G: + case GE: + case F: ch = rd_F((ufloat *)ptr,p->p1,p->p2.i[0],len); + break; + + /* Z and ZM assume 8-bit bytes. */ + + case ZM: + case Z: + ch = rd_Z((Uint *)ptr, p->p1, len); + break; + } + if(ch == 0) return(ch); + else if(ch == EOF) return(EOF); + if (f__cf) + clearerr(f__cf); + return(errno); +} + + int +#ifdef KR_headers +rd_ned(p) struct syl *p; +#else +rd_ned(struct syl *p) +#endif +{ + switch(p->op) + { + default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op); + sig_die(f__fmtbuf, 1); + case APOS: + return(rd_POS(p->p2.s)); + case H: return(rd_H(p->p1,p->p2.s)); + case SLASH: return((*f__donewrec)()); + case TR: + case X: f__cursor += p->p1; + return(1); + case T: f__cursor=p->p1-f__recpos - 1; + return(1); + case TL: f__cursor -= p->p1; + if(f__cursor < -f__recpos) /* TL1000, 1X */ + f__cursor = -f__recpos; + return(1); + } +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/rdfmt.o b/tools/connec/libf2c/rdfmt.o new file mode 100644 index 0000000000000000000000000000000000000000..b6f802bb11e6157ef60303288cebcdbf9c11b1b5 GIT binary patch literal 9848 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 Z;hdu>;kWoi`c-qNx}@8;(W_Jce*k?wXB+?k literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/rewind.c b/tools/connec/libf2c/rewind.c new file mode 100644 index 0000000..9a0e07e --- /dev/null +++ b/tools/connec/libf2c/rewind.c @@ -0,0 +1,30 @@ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef KR_headers +integer f_rew(a) alist *a; +#else +integer f_rew(alist *a) +#endif +{ + unit *b; + if(a->aunit>=MXUNIT || a->aunit<0) + err(a->aerr,101,"rewind"); + b = &f__units[a->aunit]; + if(b->ufd == NULL || b->uwrt == 3) + return(0); + if(!b->useek) + err(a->aerr,106,"rewind") + if(b->uwrt) { + (void) t_runc(a); + b->uwrt = 3; + } + rewind(b->ufd); + b->uend=0; + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/rewind.o b/tools/connec/libf2c/rewind.o new file mode 100644 index 0000000000000000000000000000000000000000..a09c1968058b258882da00fd9de7be2ffc7edb05 GIT binary patch literal 2200 zcmbW2O-vI}5XWaJN(HPHAt6DNUNmT6(}E}xqTRN@qK!l;35lA`QkHxeQ_!>Q`&v`YExsS@oS|++8qdDFm(E?LfMJ9i-*3)YaM)e2EL&jr=(C zwa`K*Lg5z;N~rT`KnX=kje2vaQwfC=p`g+NW69)Dq!BG?NatWzb;UBM*#x(sb>LbtcOv3(1$nq@SqPrRKwjfS6dHd4A-au&mKUV@V%V1 zM0U(aPitQ9J$*j>f)Bs!!$D3bqhM=R(age}hGzkv+MI6di=d6AClX3pn;0FP9LZ=I zC6OM{fE^c2Gc3!@Ym51;ZZG6b3M-lmb^#NiIrjm3+K~{p9Xy9*Jvb(7z(%Xg`8k4U zq;J8-`89%Qq(6d2a5_Dl z?=bGIKO*q|e$V8>y_~JjfLyRGx1Z-D%UIN9+gP?iw(_&Mb)<>OF`SaenAhekJ!gPS zK9FY$1(37(T+T2t!pz%-Ja%=ew_xkpJ1qPDJF1`R_TIQSGBSSN-I=T9W9qxG(H_OI ziS~wFu|c*d&FG{dzp0%}e2Q_pAEI4hao!ux@V^^5gh9k;UqqW`!juSc%=2?he-`!X z-z12}>!kV#@p#VZ{glf4i}H#Wiayc2nC>~fbHDKu7)$SrViS$$KO;gM^ZdM@7MLjg z!UZC%qa~Sl?J1uend) + while((ch=getc(f__cf))!='\n') + if (ch == EOF) { + f__curunit->uend = 1; + break; + } + f__cursor=f__recpos=0; + return(1); +} + + int +x_getc(Void) +{ int ch; + if(f__curunit->uend) return(EOF); + ch = getc(f__cf); + if(ch!=EOF && ch!='\n') + { f__recpos++; + return(ch); + } + if(ch=='\n') + { (void) ungetc(ch,f__cf); + return(ch); + } + if(f__curunit->uend || feof(f__cf)) + { errno=0; + f__curunit->uend=1; + return(-1); + } + return(-1); +} + + int +x_endp(Void) +{ + xrd_SL(); + return f__curunit->uend == 1 ? EOF : 0; +} + + int +x_rev(Void) +{ + (void) xrd_SL(); + return(0); +} +#ifdef KR_headers +integer s_rsfe(a) cilist *a; /* start */ +#else +integer s_rsfe(cilist *a) /* start */ +#endif +{ int n; + if(!f__init) f_init(); + f__reading=1; + f__sequential=1; + f__formatted=1; + f__external=1; + if(n=c_sfe(a)) return(n); + f__elist=a; + f__cursor=f__recpos=0; + f__scale=0; + f__fmtbuf=a->cifmt; + f__cf=f__curunit->ufd; + if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio"); + f__getn= x_getc; + f__doed= rd_ed; + f__doned= rd_ned; + fmt_bg(); + f__doend=x_endp; + f__donewrec=xrd_SL; + f__dorevert=x_rev; + f__cblank=f__curunit->ublnk; + f__cplus=0; + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr,errno,"read start"); + if(f__curunit->uend) + err(f__elist->ciend,(EOF),"read start"); + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/rsfe.o b/tools/connec/libf2c/rsfe.o new file mode 100644 index 0000000000000000000000000000000000000000..4ee95b28f2b74057497673eabd68c60093b19195 GIT binary patch literal 5160 zcmbW4U2IfE6vt;nf2!`NwKkm|o?ryz%R~P(% zxInVmAjV($@?bO(3`RWvxij?ixs8_rUtD4K<;V&=L}li?NobLR@MZtH)$DCK|+KVU@0gt;+2nR;d^hh51%x z4O*9QD_yJerj@SUDEy*zMq)9zACVSNvBs){=&?#)gooi(I?!h1I@EZ4sPU7bs~5&= z3`!?3>S4;FaDc~A9;P6?CWKR8l0%2e7j_MouGe`TyUdb=- zquH>I`b+J5(yptuq+vjPyz%&!ziX^YXPXL>q&qIUt4)|$s+H? zU9T@ETqmAtmJP%NndTQFw12Az6`Mk{Cr=E&MvDx7x9Z!0vLn(|vn3J+U#|E(#dk-- zQol>_sfuqRK9lNL7swm9wMUvtH3M~#aC<%c9|R-$8XHUY)mX9fAm>&xA=uG()7@QEtH$q@HX$L`nCfy(seHho|B!)WPgL{2 zmN?>U_7n8inb<~yez$=?W#G>kc&~xy4g5s|f5pIGHSm)Le#*c zQVEgIAeCRyRc&3)8~Aqy{+O@6)w^mWK_c&fs6tc2N+WE9Y%*mz(MB2%vMcTHV{=U42O5S<4;AFkNc)!To zE;QYg?WE9^&UlFeX=gk;u?K+MWl<&zZXw$z%~QFoublMV7Cpz!k}uN2QQw!9hR}N6 zb&|k+H!YRnKz|`G?2X-i&_%L)4lyXdsT{>E2TkTry5?rK~8@fIVGskH!jQ_59a6Tu|a{~eA{--Jq|Mhff{|lHtz7ur(t&C$$ z^}4KP9OsMXos2JLd@JL4H){Q-6-PXi>C*A+Wqdy49`n=4_R;}fw#NKnk7OY27zhyGl~r!)OK8K0#%@}0)`T&CZ^_(I0#F}{>>{+zC4 zd^Xcx!+0~}9gHtv{7J_7I__ZnKBm8$@q38ted00B{TyMO@6Xp2$Ncbhf1mNCY}`S{ zx&B!L|59-j_}bO$c#i4w{qwCs|Dr*^nS4Uft+tqKx5@h$-=W%@1H7o(_)dgqKNY_z z4yjUe{rxJU`F$BLo}kim{jyirT&F)C^_-$7qHZolFF@$DMq83WpF=S0Y3z*{ zU0lL-s-+yG30s^I5S%#>oO$36qrqgQ`irB#Pj#0bUze+>1NA_dVzaV;QyZ#MkFW6x zs#J|%eSGTmNBq#!_B#F!Vi-U8kL*eikPbx0?YD$@f-3MCRR6E`-O6W+cBo2izbL@< z_`2Mw>;r0I29m8J+D><&9h`gg%~bXWRf%^t<}f∾= f__svic->icirlen) { + if (f__recpos++ == f__svic->icirlen) + return '\n'; + z_rnew(); + } + f__recpos++; + if(f__icptr >= f__icend) + return EOF; + return(*f__icptr++); + } + + static +#ifdef KR_headers +int i_ungetc(ch, f) int ch; FILE *f; +#else +int i_ungetc(int ch, FILE *f) +#endif +{ + if (--f__recpos == f__svic->icirlen) + return '\n'; + if (f__recpos < -1) + err(f__svic->icierr,110,"recend"); + /* *--icptr == ch, and icptr may point to read-only memory */ + return *--f__icptr /* = ch */; + } + + static void +#ifdef KR_headers +c_lir(a) icilist *a; +#else +c_lir(icilist *a) +#endif +{ + extern int l_eof; + f__reading = 1; + f__external = 0; + f__formatted = 1; + f__svic = a; + L_len = a->icirlen; + f__recpos = -1; + f__icnum = f__recpos = 0; + f__cursor = 0; + l_getc = i_getc; + l_ungetc = i_ungetc; + l_eof = 0; + f__icptr = a->iciunit; + f__icend = f__icptr + a->icirlen*a->icirnum; + f__cf = 0; + f__curunit = 0; + f__elist = (cilist *)a; + } + + +#ifdef KR_headers +integer s_rsli(a) icilist *a; +#else +integer s_rsli(icilist *a) +#endif +{ + f__lioproc = l_read; + f__lquit = 0; + f__lcount = 0; + c_lir(a); + f__doend = 0; + return(0); + } + +integer e_rsli(Void) +{ return 0; } + +#ifdef KR_headers +integer s_rsni(a) icilist *a; +#else +extern int x_rsne(cilist*); + +integer s_rsni(icilist *a) +#endif +{ + extern int nml_read; + integer rv; + cilist ca; + ca.ciend = a->iciend; + ca.cierr = a->icierr; + ca.cifmt = a->icifmt; + c_lir(a); + rv = x_rsne(&ca); + nml_read = 0; + return rv; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/rsli.o b/tools/connec/libf2c/rsli.o new file mode 100644 index 0000000000000000000000000000000000000000..a61663bced81e3bf5850eee1752d7f719c94324e GIT binary patch literal 4152 zcmbW3U2GIp6vyv&!IrPG@*!3HShZ@wFt!4*K-7hnc5E6zD1yXfx=g2ZWp}2`&Pqih zChJSHmSCc>ZxY{#CK8`YOti5k7!#w$2jBI<8hkW{sBu02JNK}+!`{SrHh1nhzkANP zXYTCWI~Vp3545CGf+Z!M5eS9WzugQ{Z z_bYqPP&PVJy;(oM$&Q`unL~9|^4iaG^#!~7Tbo_oEuxK!vUuTBH;0Q|{jzPrp4kcf zIe>JKLpOe&TS-6$tF$zinzeQ~Yw!C0d`ER&l_Px#MO$TtYP_~w&mL)(*HdAsTZP4w z&(%q8{LY^0<{G!(&=!aOsn@mToB2g)iX~Eoq?LMYpwS5 zvQDx)V0SF0kZAgscrj#YNM+YXI=jZ~?Hgp0N~=9ftJAw6y+Y6R{4scm4f0BVoO6do zYATc3yt=jR68(!Z#P3yOS5*(YTj^8iFSKV)tZZ-FyXts*8<`!{4uO-5-rX^97(fT+jA{1$Vr44?CaZ|?K*n0;zyP2Q`Szad)xMkw0d6e z>9x9dY>BCgH+AWzZe#OAA8u&HhSpSP^{rMf5H~4>T;6E7nuLl07fv43TLBmTVLmYK}qv{-0 zqnix=4;r|zhWon3xZ@ODzfyuyex=}wDJLxZ9!#%TC`Y2`obn=9c!Y}uK~7QLJ?*#? zr=9V9p$NZXA(#vUmpm)J^esAGFpd$o5?1^|B!-=$=Sv{5Hx+rIpO?V}xlfXB=;g-> z{wa7B+{q{ueyJ#-IOl}EcNPO<0XEfgT#AfwCxbFZ#`6*7a|VYG?%O-;92^)pvVX)G z*}HFeze6>9Vdw`=F>v!yA&`X>&s3-`1O{O#A4OiA)-Qlj+2tUFR&)c}3F8IkouY-z zyQ$s8K}6E7)*l>u0dx33z&oiihYkV9f%$iwrv3yV2{?{w=JKpn`~m7Y&$FaM;E&yn z`4Aup_@mUAzXV7EzJ?m-e;JSj{7!1jCjm*o*Hhy>7XV4X@1e&27XeAYamFxz7mx(} zE^3_TGU*U-oRQ2w1SA2+rx@q?1ds$A>%ja|K$0Z?BF2*I>-?j}_4eHh1{KJ}Im)7^A%nK0Q_snHcdVobfPU@`QykVVx|Oh2;jNl1H1B zWg{_W$2yDHQj~-y@tUr<84Ky_xH43x;QdXP2XT{s@^vo1V8_s40Fb=~hkvLH2> x^o5;Vd$=A_@%;SpZsQzFt{+&lsWR%pKc1K{VahYDS^Om&E+i9ick7yr{}<9Jn7IG| literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/rsne.c b/tools/connec/libf2c/rsne.c new file mode 100644 index 0000000..e8e9dae --- /dev/null +++ b/tools/connec/libf2c/rsne.c @@ -0,0 +1,618 @@ +#include "f2c.h" +#include "fio.h" +#include "lio.h" + +#define MAX_NL_CACHE 3 /* maximum number of namelist hash tables to cache */ +#define MAXDIM 20 /* maximum number of subscripts */ + + struct dimen { + ftnlen extent; + ftnlen curval; + ftnlen delta; + ftnlen stride; + }; + typedef struct dimen dimen; + + struct hashentry { + struct hashentry *next; + char *name; + Vardesc *vd; + }; + typedef struct hashentry hashentry; + + struct hashtab { + struct hashtab *next; + Namelist *nl; + int htsize; + hashentry *tab[1]; + }; + typedef struct hashtab hashtab; + + static hashtab *nl_cache; + static int n_nlcache; + static hashentry **zot; + static int colonseen; + extern ftnlen f__typesize[]; + + extern flag f__lquit; + extern int f__lcount, nml_read; + extern int t_getc(Void); + +#ifdef KR_headers + extern char *malloc(), *memset(); +#define Const /*nothing*/ + +#ifdef ungetc + static int +un_getc(x,f__cf) int x; FILE *f__cf; +{ return ungetc(x,f__cf); } +#else +#define un_getc ungetc + extern int ungetc(); +#endif + +#else +#define Const const +#undef abs +#undef min +#undef max +#include "stdlib.h" +#include "string.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ungetc + static int +un_getc(int x, FILE *f__cf) +{ return ungetc(x,f__cf); } +#else +#define un_getc ungetc +extern int ungetc(int, FILE*); /* for systems with a buggy stdio.h */ +#endif +#endif + + static Vardesc * +#ifdef KR_headers +hash(ht, s) hashtab *ht; register char *s; +#else +hash(hashtab *ht, register char *s) +#endif +{ + register int c, x; + register hashentry *h; + char *s0 = s; + + for(x = 0; c = *s++; x = x & 0x4000 ? ((x << 1) & 0x7fff) + 1 : x << 1) + x += c; + for(h = *(zot = ht->tab + x % ht->htsize); h; h = h->next) + if (!strcmp(s0, h->name)) + return h->vd; + return 0; + } + + hashtab * +#ifdef KR_headers +mk_hashtab(nl) Namelist *nl; +#else +mk_hashtab(Namelist *nl) +#endif +{ + int nht, nv; + hashtab *ht; + Vardesc *v, **vd, **vde; + hashentry *he; + + hashtab **x, **x0, *y; + for(x = &nl_cache; y = *x; x0 = x, x = &y->next) + if (nl == y->nl) + return y; + if (n_nlcache >= MAX_NL_CACHE) { + /* discard least recently used namelist hash table */ + y = *x0; + free((char *)y->next); + y->next = 0; + } + else + n_nlcache++; + nv = nl->nvars; + if (nv >= 0x4000) + nht = 0x7fff; + else { + for(nht = 1; nht < nv; nht <<= 1); + nht += nht - 1; + } + ht = (hashtab *)malloc(sizeof(hashtab) + (nht-1)*sizeof(hashentry *) + + nv*sizeof(hashentry)); + if (!ht) + return 0; + he = (hashentry *)&ht->tab[nht]; + ht->nl = nl; + ht->htsize = nht; + ht->next = nl_cache; + nl_cache = ht; + memset((char *)ht->tab, 0, nht*sizeof(hashentry *)); + vd = nl->vars; + vde = vd + nv; + while(vd < vde) { + v = *vd++; + if (!hash(ht, v->name)) { + he->next = *zot; + *zot = he; + he->name = v->name; + he->vd = v; + he++; + } + } + return ht; + } + +static char Alpha[256], Alphanum[256]; + + static VOID +nl_init(Void) { + Const char *s; + int c; + + if(!f__init) + f_init(); + for(s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; c = *s++; ) + Alpha[c] + = Alphanum[c] + = Alpha[c + 'a' - 'A'] + = Alphanum[c + 'a' - 'A'] + = c; + for(s = "0123456789_"; c = *s++; ) + Alphanum[c] = c; + } + +#define GETC(x) (x=(*l_getc)()) +#define Ungetc(x,y) (*l_ungetc)(x,y) + + static int +#ifdef KR_headers +getname(s, slen) register char *s; int slen; +#else +getname(register char *s, int slen) +#endif +{ + register char *se = s + slen - 1; + register int ch; + + GETC(ch); + if (!(*s++ = Alpha[ch & 0xff])) { + if (ch != EOF) + ch = 115; + errfl(f__elist->cierr, ch, "namelist read"); + } + while(*s = Alphanum[GETC(ch) & 0xff]) + if (s < se) + s++; + if (ch == EOF) + err(f__elist->cierr, EOF, "namelist read"); + if (ch > ' ') + Ungetc(ch,f__cf); + return *s = 0; + } + + static int +#ifdef KR_headers +getnum(chp, val) int *chp; ftnlen *val; +#else +getnum(int *chp, ftnlen *val) +#endif +{ + register int ch, sign; + register ftnlen x; + + while(GETC(ch) <= ' ' && ch >= 0); + if (ch == '-') { + sign = 1; + GETC(ch); + } + else { + sign = 0; + if (ch == '+') + GETC(ch); + } + x = ch - '0'; + if (x < 0 || x > 9) + return 115; + while(GETC(ch) >= '0' && ch <= '9') + x = 10*x + ch - '0'; + while(ch <= ' ' && ch >= 0) + GETC(ch); + if (ch == EOF) + return EOF; + *val = sign ? -x : x; + *chp = ch; + return 0; + } + + static int +#ifdef KR_headers +getdimen(chp, d, delta, extent, x1) + int *chp; dimen *d; ftnlen delta, extent, *x1; +#else +getdimen(int *chp, dimen *d, ftnlen delta, ftnlen extent, ftnlen *x1) +#endif +{ + register int k; + ftnlen x2, x3; + + if (k = getnum(chp, x1)) + return k; + x3 = 1; + if (*chp == ':') { + if (k = getnum(chp, &x2)) + return k; + x2 -= *x1; + if (*chp == ':') { + if (k = getnum(chp, &x3)) + return k; + if (!x3) + return 123; + x2 /= x3; + colonseen = 1; + } + if (x2 < 0 || x2 >= extent) + return 123; + d->extent = x2 + 1; + } + else + d->extent = 1; + d->curval = 0; + d->delta = delta; + d->stride = x3; + return 0; + } + +#ifndef No_Namelist_Questions + static Void +#ifdef KR_headers +print_ne(a) cilist *a; +#else +print_ne(cilist *a) +#endif +{ + flag intext = f__external; + int rpsave = f__recpos; + FILE *cfsave = f__cf; + unit *usave = f__curunit; + cilist t; + t = *a; + t.ciunit = 6; + s_wsne(&t); + fflush(f__cf); + f__external = intext; + f__reading = 1; + f__recpos = rpsave; + f__cf = cfsave; + f__curunit = usave; + f__elist = a; + } +#endif + + static char where0[] = "namelist read start "; + + int +#ifdef KR_headers +x_rsne(a) cilist *a; +#else +x_rsne(cilist *a) +#endif +{ + int ch, got1, k, n, nd, quote, readall; + Namelist *nl; + static char where[] = "namelist read"; + char buf[64]; + hashtab *ht; + Vardesc *v; + dimen *dn, *dn0, *dn1; + ftnlen *dims, *dims1; + ftnlen b, b0, b1, ex, no, nomax, size, span; + ftnint no1, no2, type; + char *vaddr; + long iva, ivae; + dimen dimens[MAXDIM], substr; + + if (!Alpha['a']) + nl_init(); + f__reading=1; + f__formatted=1; + got1 = 0; + top: + for(;;) switch(GETC(ch)) { + case EOF: + eof: + err(a->ciend,(EOF),where0); + case '&': + case '$': + goto have_amp; +#ifndef No_Namelist_Questions + case '?': + print_ne(a); + continue; +#endif + default: + if (ch <= ' ' && ch >= 0) + continue; +#ifndef No_Namelist_Comments + while(GETC(ch) != '\n') + if (ch == EOF) + goto eof; +#else + errfl(a->cierr, 115, where0); +#endif + } + have_amp: + if (ch = getname(buf,sizeof(buf))) + return ch; + nl = (Namelist *)a->cifmt; + if (strcmp(buf, nl->name)) +#ifdef No_Bad_Namelist_Skip + errfl(a->cierr, 118, where0); +#else + { + fprintf(stderr, + "Skipping namelist \"%s\": seeking namelist \"%s\".\n", + buf, nl->name); + fflush(stderr); + for(;;) switch(GETC(ch)) { + case EOF: + err(a->ciend, EOF, where0); + case '/': + case '&': + case '$': + if (f__external) + e_rsle(); + else + z_rnew(); + goto top; + case '"': + case '\'': + quote = ch; + more_quoted: + while(GETC(ch) != quote) + if (ch == EOF) + err(a->ciend, EOF, where0); + if (GETC(ch) == quote) + goto more_quoted; + Ungetc(ch,f__cf); + default: + continue; + } + } +#endif + ht = mk_hashtab(nl); + if (!ht) + errfl(f__elist->cierr, 113, where0); + for(;;) { + for(;;) switch(GETC(ch)) { + case EOF: + if (got1) + return 0; + err(a->ciend, EOF, where0); + case '/': + case '$': + case '&': + return 0; + default: + if (ch <= ' ' && ch >= 0 || ch == ',') + continue; + Ungetc(ch,f__cf); + if (ch = getname(buf,sizeof(buf))) + return ch; + goto havename; + } + havename: + v = hash(ht,buf); + if (!v) + errfl(a->cierr, 119, where); + while(GETC(ch) <= ' ' && ch >= 0); + vaddr = v->addr; + type = v->type; + if (type < 0) { + size = -type; + type = TYCHAR; + } + else + size = f__typesize[type]; + ivae = size; + iva = readall = 0; + if (ch == '(' /*)*/ ) { + dn = dimens; + if (!(dims = v->dims)) { + if (type != TYCHAR) + errfl(a->cierr, 122, where); + if (k = getdimen(&ch, dn, (ftnlen)size, + (ftnlen)size, &b)) + errfl(a->cierr, k, where); + if (ch != ')') + errfl(a->cierr, 115, where); + b1 = dn->extent; + if (--b < 0 || b + b1 > size) + return 124; + iva += b; + size = b1; + while(GETC(ch) <= ' ' && ch >= 0); + goto scalar; + } + nd = (int)dims[0]; + nomax = span = dims[1]; + ivae = iva + size*nomax; + colonseen = 0; + if (k = getdimen(&ch, dn, size, nomax, &b)) + errfl(a->cierr, k, where); + no = dn->extent; + b0 = dims[2]; + dims1 = dims += 3; + ex = 1; + for(n = 1; n++ < nd; dims++) { + if (ch != ',') + errfl(a->cierr, 115, where); + dn1 = dn + 1; + span /= *dims; + if (k = getdimen(&ch, dn1, dn->delta**dims, + span, &b1)) + errfl(a->cierr, k, where); + ex *= *dims; + b += b1*ex; + no *= dn1->extent; + dn = dn1; + } + if (ch != ')') + errfl(a->cierr, 115, where); + readall = 1 - colonseen; + b -= b0; + if (b < 0 || b >= nomax) + errfl(a->cierr, 125, where); + iva += size * b; + dims = dims1; + while(GETC(ch) <= ' ' && ch >= 0); + no1 = 1; + dn0 = dimens; + if (type == TYCHAR && ch == '(' /*)*/) { + if (k = getdimen(&ch, &substr, size, size, &b)) + errfl(a->cierr, k, where); + if (ch != ')') + errfl(a->cierr, 115, where); + b1 = substr.extent; + if (--b < 0 || b + b1 > size) + return 124; + iva += b; + b0 = size; + size = b1; + while(GETC(ch) <= ' ' && ch >= 0); + if (b1 < b0) + goto delta_adj; + } + if (readall) + goto delta_adj; + for(; dn0 < dn; dn0++) { + if (dn0->extent != *dims++ || dn0->stride != 1) + break; + no1 *= dn0->extent; + } + if (dn0 == dimens && dimens[0].stride == 1) { + no1 = dimens[0].extent; + dn0++; + } + delta_adj: + ex = 0; + for(dn1 = dn0; dn1 <= dn; dn1++) + ex += (dn1->extent-1) + * (dn1->delta *= dn1->stride); + for(dn1 = dn; dn1 > dn0; dn1--) { + ex -= (dn1->extent - 1) * dn1->delta; + dn1->delta -= ex; + } + } + else if (dims = v->dims) { + no = no1 = dims[1]; + ivae = iva + no*size; + } + else + scalar: + no = no1 = 1; + if (ch != '=') + errfl(a->cierr, 115, where); + got1 = nml_read = 1; + f__lcount = 0; + readloop: + for(;;) { + if (iva >= ivae || iva < 0) { + f__lquit = 1; + goto mustend; + } + else if (iva + no1*size > ivae) + no1 = (ivae - iva)/size; + f__lquit = 0; + if (k = l_read(&no1, vaddr + iva, size, type)) + return k; + if (f__lquit == 1) + return 0; + if (readall) { + iva += dn0->delta; + if (f__lcount > 0) { + no2 = (ivae - iva)/size; + if (no2 > f__lcount) + no2 = f__lcount; + if (k = l_read(&no2, vaddr + iva, + size, type)) + return k; + iva += no2 * dn0->delta; + } + } + mustend: + GETC(ch); + if (readall) + if (iva >= ivae) + readall = 0; + else for(;;) { + switch(ch) { + case ' ': + case '\t': + case '\n': + GETC(ch); + continue; + } + break; + } + if (ch == '/' || ch == '$' || ch == '&') { + f__lquit = 1; + return 0; + } + else if (f__lquit) { + while(ch <= ' ' && ch >= 0) + GETC(ch); + Ungetc(ch,f__cf); + if (!Alpha[ch & 0xff] && ch >= 0) + errfl(a->cierr, 125, where); + break; + } + Ungetc(ch,f__cf); + if (readall && !Alpha[ch & 0xff]) + goto readloop; + if ((no -= no1) <= 0) + break; + for(dn1 = dn0; dn1 <= dn; dn1++) { + if (++dn1->curval < dn1->extent) { + iva += dn1->delta; + goto readloop; + } + dn1->curval = 0; + } + break; + } + } + } + + integer +#ifdef KR_headers +s_rsne(a) cilist *a; +#else +s_rsne(cilist *a) +#endif +{ + extern int l_eof; + int n; + + f__external=1; + l_eof = 0; + if(n = c_le(a)) + return n; + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr,errno,where0); + l_getc = t_getc; + l_ungetc = un_getc; + f__doend = xrd_SL; + n = x_rsne(a); + nml_read = 0; + if (n) + return n; + return e_rsle(); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/rsne.o b/tools/connec/libf2c/rsne.o new file mode 100644 index 0000000000000000000000000000000000000000..90df53dd38114ab7abeb226f5bb55c9b9f9e0804 GIT binary patch literal 14024 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 QeYtR`nAuI{uf6^M0-&r;i~s-t literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/s_cat.c b/tools/connec/libf2c/s_cat.c new file mode 100644 index 0000000..8d92a63 --- /dev/null +++ b/tools/connec/libf2c/s_cat.c @@ -0,0 +1,86 @@ +/* Unless compiled with -DNO_OVERWRITE, this variant of s_cat allows the + * target of a concatenation to appear on its right-hand side (contrary + * to the Fortran 77 Standard, but in accordance with Fortran 90). + */ + +#include "f2c.h" +#ifndef NO_OVERWRITE +#include "stdio.h" +#undef abs +#ifdef KR_headers + extern char *F77_aloc(); + extern void free(); + extern void exit_(); +#else +#undef min +#undef max +#include "stdlib.h" +extern +#ifdef __cplusplus + "C" +#endif + char *F77_aloc(ftnlen, const char*); +#endif +#include "string.h" +#endif /* NO_OVERWRITE */ + +#ifdef __cplusplus +extern "C" { +#endif + + VOID +#ifdef KR_headers +s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnint rnp[], *np; ftnlen ll; +#else +s_cat(char *lp, char *rpp[], ftnint rnp[], ftnint *np, ftnlen ll) +#endif +{ + ftnlen i, nc; + char *rp; + ftnlen n = *np; +#ifndef NO_OVERWRITE + ftnlen L, m; + char *lp0, *lp1; + + lp0 = 0; + lp1 = lp; + L = ll; + i = 0; + while(i < n) { + rp = rpp[i]; + m = rnp[i++]; + if (rp >= lp1 || rp + m <= lp) { + if ((L -= m) <= 0) { + n = i; + break; + } + lp1 += m; + continue; + } + lp0 = lp; + lp = lp1 = F77_aloc(L = ll, "s_cat"); + break; + } + lp1 = lp; +#endif /* NO_OVERWRITE */ + for(i = 0 ; i < n ; ++i) { + nc = ll; + if(rnp[i] < nc) + nc = rnp[i]; + ll -= nc; + rp = rpp[i]; + while(--nc >= 0) + *lp++ = *rp++; + } + while(--ll >= 0) + *lp++ = ' '; +#ifndef NO_OVERWRITE + if (lp0) { + memcpy(lp0, lp1, L); + free(lp1); + } +#endif + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/s_cat.o b/tools/connec/libf2c/s_cat.o new file mode 100644 index 0000000000000000000000000000000000000000..e5ff1e581a8031a71addb5a5acc3522c8e2e55b2 GIT binary patch literal 1960 zcmbtU?MqW(6hDvG(#*CM5t4n_r_i9wR?3=1?9S9@cBhdVK`(2rD?-l2b_X+}pt0z( zvi_1jMpU3CMHGZYg4o+vMX0cYf#Pp69u{+NE~aFa|;x z9EOS|P=L|eiXJl65Nv@)P);aA%HYsI#Q3Qivue>FEqrlLt|KF2eCEbHH`Z0-vGR~Y zjuva*M)I?)x2V4R%7dRWjhsD;1fRIC-9;~Nea;K7+_!I|9xc3aPd-9r3KyuxvhskG z-r(tZ%)8L%?mIFMYU^x&vGKKPO!NE_%k8{R6vch7jfHNsF`l1hk>GT8m9v>h{xORN z7cWn7W5MKlID5hKGwi8S^77z|>>4kWbdPGRE>RBE_-O8@&M2pqGs@Xn&R#}?@7;xi zrBcc4Xr+nYY9}f;K8O%*EJlncQDbdcMH;>|wr!HFq7%iHyO~%bu2URrH=h9P(s5up z4{L6$tG|PTKZN)$%O}%8gk7G=ny{AIqPV>1Lr&OL zuWY8cp3cq=Z_Chdc3jVT19H3U+q*w&TK+5k1G2BJwTxOd{l4#c6?y(-VKdh*+{_gI9uEE%#5>~rnFp}0ZfH}-ZLKAGj z^#kt^$pV2Wgm1wm@b3ho)Zn6N30$&1UgFcV1nxzhg!mT4v_Z~HB=z_(?s~esj|wfV zjm2eM%jqDeQ|IG)oH%~jk0yDv(bz~jp431lAIQU*49JO8GO3MY#CS^AhyFw9yK&Bs gFz35d{4om*kYN*NTU*grE#5pV^o`nLNp;5m0*~hO%K!iX literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/s_cmp.c b/tools/connec/libf2c/s_cmp.c new file mode 100644 index 0000000..3a2ea67 --- /dev/null +++ b/tools/connec/libf2c/s_cmp.c @@ -0,0 +1,50 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* compare two strings */ + +#ifdef KR_headers +integer s_cmp(a0, b0, la, lb) char *a0, *b0; ftnlen la, lb; +#else +integer s_cmp(char *a0, char *b0, ftnlen la, ftnlen lb) +#endif +{ +register unsigned char *a, *aend, *b, *bend; +a = (unsigned char *)a0; +b = (unsigned char *)b0; +aend = a + la; +bend = b + lb; + +if(la <= lb) + { + while(a < aend) + if(*a != *b) + return( *a - *b ); + else + { ++a; ++b; } + + while(b < bend) + if(*b != ' ') + return( ' ' - *b ); + else ++b; + } + +else + { + while(b < bend) + if(*a == *b) + { ++a; ++b; } + else + return( *a - *b ); + while(a < aend) + if(*a != ' ') + return(*a - ' '); + else ++a; + } +return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/s_cmp.o b/tools/connec/libf2c/s_cmp.o new file mode 100644 index 0000000000000000000000000000000000000000..a5052f7fcc15feafc9dda92e53bc3c1b42e262ee GIT binary patch literal 1392 zcmbtT&ui3B5T4i6Zq?GPQmt4I@glCY&n^B+RAixQQwSc!g13@gqXo@YHZNuMU=Is| zhk{4{3{RoQg@U_!(8YhitKPJydUIYfZ}S@3OC8A0%=hM-Z{CmHxaZv;VGNWpxC42n zP=Jpkd0b1w8XSjX;BAghdz%xJuJdK%ndkJP%VttClS!BD*!_6g?ev)2`NUjjN1V!5 z?7sMACS5c6TLhZ!Ip)~l>ruSN#$+N`ARaU z?LmCjWq)&-ZzO{&B=bFGE;+mFvp7H|(L;${QBHFy(e3=ShV3(v>=&k_A{u-B5Lmm+ zW+qDG@9}`jh@DGU0Dh2%#f62N*2U#|+!V2OgJ0v-xhrv+&A*wqdG%@~Lsk6&-q`mB z01VJBLE{=Qs%3d-z>z%BA_K;>EDsGRr<+ImIws>Hd>t{_^RWC|)Kku(o6^6egBUA)= b + la) +#endif + while(a < aend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else + for(b += la; a < aend; ) + *--aend = *--b; +#endif + + else { + bend = b + lb; +#ifndef NO_OVERWRITE + if (a <= b || a >= bend) +#endif + while(b < bend) + *a++ = *b++; +#ifndef NO_OVERWRITE + else { + a += lb; + while(b < bend) + *--a = *--bend; + a += lb; + } +#endif + while(a < aend) + *a++ = ' '; + } + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/s_copy.o b/tools/connec/libf2c/s_copy.o new file mode 100644 index 0000000000000000000000000000000000000000..c189dabd0be1b3579276a02a624154d4df3af328 GIT binary patch literal 1376 zcmbtSO=}ZT6uqxgZA{ff2`aQg+(;vKNbz&DNTf;gMn)H6>#`(qN>`_F z5%4GYE4mIAT6CqG1oQ_ewTLtewVQZv`d;UCh#P(Ia_>Dk=YG9e%UJUxjDb81?tmXj z6yVK>@23WC3dSJ}yfu238}HXL-1zz8JU6zSGrYdZczugS)))JY$9-=6@^*R~y$#NG zxv^LKOr#jEZzJg|lERG;H#**TqFAliNla9mw~VfH*J@2hETiMZ?>9eK%}*xMNtTJM zhtiEOH@e=AmFSqPXSQa?u}tj*mEFwt<5aVU=}`QIv)^X(2XF3~^)~9?lAia|jeFSH zM{nCq>{_h*tu4lj3CmtS1hx`o6UWCwuW=z!#3#jn?}UZy+}y4B)I#1XyI%Z;eoaqK zU-1Uf%&VE3dh%*wAC>&SSZ(OW0W?sSu4pwFRU+Tj;D{e6o(4yi$aggu^8?}0+n-kY zIhfU1Dpa1YLR|2uvqRsB?yQ#FTpo1Ct?t{R^jv$z1-)uN%jtG;X}Ov!*`PnkxjE4D zjstq3QYzVHq?9YJt!E!BOgnC_@KjX#KQkfv3~nGL(jLqw;zKhbb`dXO!Iy{%;$@+e zCL|qUFQBE@N{LvSq)2#90Hh;G>Ls2;j7n*E)iW#Vs~Gt~_&Q>g^I!G1MNaBNJ+l5K z6+~awmo}|nDs@>BRB#BFXu;i+q$u=l3h*4mOJ8$ve}o5TM+l}wQpqQbPOz<0hz-+o Mp?@?``9DGZAC-KR5C8xG literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/s_paus.c b/tools/connec/libf2c/s_paus.c new file mode 100644 index 0000000..51d80eb --- /dev/null +++ b/tools/connec/libf2c/s_paus.c @@ -0,0 +1,96 @@ +#include "stdio.h" +#include "f2c.h" +#define PAUSESIG 15 + +#include "signal1.h" +#ifdef KR_headers +#define Void /* void */ +#define Int /* int */ +#else +#define Void void +#define Int int +#undef abs +#undef min +#undef max +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +extern "C" { +#endif +extern int getpid(void), isatty(int), pause(void); +#endif + +extern VOID f_exit(Void); + +#ifndef MSDOS + static VOID +waitpause(Sigarg) +{ Use_Sigarg; + return; + } +#endif + + static VOID +#ifdef KR_headers +s_1paus(fin) FILE *fin; +#else +s_1paus(FILE *fin) +#endif +{ + fprintf(stderr, + "To resume execution, type go. Other input will terminate the job.\n"); + fflush(stderr); + if( getc(fin)!='g' || getc(fin)!='o' || getc(fin)!='\n' ) { + fprintf(stderr, "STOP\n"); +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(0); + } + } + + int +#ifdef KR_headers +s_paus(s, n) char *s; ftnlen n; +#else +s_paus(char *s, ftnlen n) +#endif +{ + fprintf(stderr, "PAUSE "); + if(n > 0) + fprintf(stderr, " %.*s", (int)n, s); + fprintf(stderr, " statement executed\n"); + if( isatty(fileno(stdin)) ) + s_1paus(stdin); + else { +#ifdef MSDOS + FILE *fin; + fin = fopen("con", "r"); + if (!fin) { + fprintf(stderr, "s_paus: can't open con!\n"); + fflush(stderr); + exit(1); + } + s_1paus(fin); + fclose(fin); +#else + fprintf(stderr, + "To resume execution, execute a kill -%d %d command\n", + PAUSESIG, getpid() ); + signal1(PAUSESIG, waitpause); + fflush(stderr); + pause(); +#endif + } + fprintf(stderr, "Execution resumes after PAUSE.\n"); + fflush(stderr); + return 0; /* NOT REACHED */ +#ifdef __cplusplus + } +#endif +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/s_paus.o b/tools/connec/libf2c/s_paus.o new file mode 100644 index 0000000000000000000000000000000000000000..c610da3989347d3b8cc5e070711b7346c2ac0e1a GIT binary patch literal 3664 zcmbW3TWB0r7{|ZORvXiH6YHhXdN~$rV=!aVCblSQwrP?LL{rQLs-o*;Gn-7ZmpF5l zBvMoe5tk4x7EydE_#(de;)7K%g$lm(p+2dI2tKvoTM_c0#P2_IPWCXnQ=wn7=khz> z?aaB%yfZvL(vnD!mIOUV^`53gSKI3C!Js)vDcVOjE>BHnR{v_v)c(!XZe-T?VeH%6 zx%eJ#G8@kVTtksr`>p-Mi)bjVySd${wO+TV{TLXoU20$Zf^~yVx_0SeJDhCX!=zb@>uO!?bn+IzAiXyX8l2A zqNh3Ze<3opKZ2ZAw`S!LZFO5St4;U~^WU+lRIk(>v{g5+Kf)=TPESn^3lfK|Zl8oN zZRwPpvJ}p;ldno=ri~`E6Q_AivlZbvezoMNA-7U~LdcaxN6c0%AtvOU;|aICSe0VQ zEf$4zypmgHcY;U6d}Z1SH%3!GDw?o`5DT#GIXolyUx<9ARIvE3i6Khz zUo%P4u4b6EvFMGGq}`2>Ns?M)_#H9aIK)aLJnM~l;shf?a7vUeDt>Y-yC@UX^#bbw z{%%m$i{Oy5pXdzk4^$eT1I{Dj9t!Gu@hCUL7ncj^Q7~@bfX8tnr~<6h~1Epm+*JABtlr`f1Uw`VP%Ha?zck zT&}R_xn)_%<>wa2^=&Cvs8A?Y{WG9me$jIbyHkVDG93Re+v+PPLxJ9R2;d~)?hE?#~@8kAAe5pb7zQB55mur4R z>0?J>Z)tv9ap;?V^!^3MsnGgZZ%EV+)*Ax-d-K5l)@-{3X`{4V}!UIJtR z#~d|33&;ZhIAfZ>56BYD|DzBGe)e-)>wj+W0|x(6@u;7#41L_S+RxVp$GOw|JH?}Z zt{8l;q5qTO(dYS#p>M9s?}oma&)0Vczg#<|7S`_odc9Yj87eErtuW zh2Xg;nHx z(ebtY7!RVovyMvnf&ynuV{U7EjZbl-+5Ee3$+GD0Gt3`fJKA2)f07yEN54q6q6x7M zMCTp$h;Sdn=dIemu6*h|wO<{-TLV?=_`04|_7OEY6ip~%ul3=l*;Kof{Z%!HI~MnH k^!eeP*eukR`n3Fv$4$|BYle4HGy5}Y{g$+%s-yP*0UTLrTmS$7 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/s_rnge.c b/tools/connec/libf2c/s_rnge.c new file mode 100644 index 0000000..3dbc513 --- /dev/null +++ b/tools/connec/libf2c/s_rnge.c @@ -0,0 +1,32 @@ +#include "stdio.h" +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* called when a subscript is out of range */ + +#ifdef KR_headers +extern VOID sig_die(); +integer s_rnge(varn, offset, procn, line) char *varn, *procn; ftnint offset, line; +#else +extern VOID sig_die(const char*,int); +integer s_rnge(char *varn, ftnint offset, char *procn, ftnint line) +#endif +{ +register int i; + +fprintf(stderr, "Subscript out of range on file line %ld, procedure ", + (long)line); +while((i = *procn) && i != '_' && i != ' ') + putc(*procn++, stderr); +fprintf(stderr, ".\nAttempt to access the %ld-th element of variable ", + (long)offset+1); +while((i = *varn) && i != ' ') + putc(*varn++, stderr); +sig_die(".", 1); +return 0; /* not reached */ +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/s_rnge.o b/tools/connec/libf2c/s_rnge.o new file mode 100644 index 0000000000000000000000000000000000000000..62eed4a45217a9fa35581b659522c7f6bf660be9 GIT binary patch literal 2328 zcmbtV-AhzK6hG_LG}G0hKr&(;DlGD{Yf2InUQJzNNl1N&J}!56XWhm9;@-JsJ=B8` zhzZhDe}XSTP(%>;BK--ymQUdy&_hsQ=iED^!&ERMFXVPu9N?fs$HsjK1{;q zH!;w&^>by<7A&>$IhI-*ITXhjQra-?@64>H&&B>Sq7e#Cr&hKjV}%j_dpMW%U@pNl zf(hMwVBO!Q%rNI?ysTTS30C#7OUcD|Im%xZ2m%X7ZVS)emJ zEg^Urb)w3gY?gZ-6NP{~C<=_1c$rs%0UtST(aGRgV50J5pazINy#ul3-dKNEd&dUu z*8t*YWb6~Qdk4^kYNvejx zw(~W&SP^+UTUY|GxM=5!96Z~_TMC}Yan}WVIz2mXrR~|NskzB{d)^vPPugJ5%-S_y zWHFJJs|9`9<==ausXIq_kA~Aa$!N#AuqeJoAX=0^6~Y1kIQoj8kvQ?`6ct|4a6Rv` z#G`rFoA6(0d_C``#;3DadEaRKZVhJ=r+J2VO9H0%q%52an4WOMwxB$hmmE{@WdWvJ z%{js$PSPAb+{J?oh`eCuU8l^!Br2F0&jT}CEz>&zW~C~)IemL!&=XE}N#_2KhM|_$ z5q=K`1C2>n-CGqov}OeRvCtWeVbN_@esW9-Xm80?Uv!@&)BPcQNcQ&|sVnURp`-LN z4D`RyNMDi!Iw#$fPPH=_BtOclNy1HCjK0dRV2U?de}{bP)H-SX1S!43=MbY*(HH8y znjpq>i^6v?NMru1{vm2<%mfzQRQ^jkh`!3N+C>f1sb3XA2ODsS7TtT2>`47v+0xrW iCAxp~Mn%_-5Nt@0_E)#)wCF8pq-XN{9_wQCqxwIi!6vc* literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/s_stop.c b/tools/connec/libf2c/s_stop.c new file mode 100644 index 0000000..68233ae --- /dev/null +++ b/tools/connec/libf2c/s_stop.c @@ -0,0 +1,48 @@ +#include "stdio.h" +#include "f2c.h" + +#ifdef KR_headers +extern void f_exit(); +int s_stop(s, n) char *s; ftnlen n; +#else +#undef abs +#undef min +#undef max +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +extern "C" { +#endif +void f_exit(void); + +int s_stop(char *s, ftnlen n) +#endif +{ +int i; + +if(n > 0) + { + fprintf(stderr, "STOP "); + for(i = 0; inP17kYnx^bdFn(Z# zq7bT}H~$pzPzC>q9t&Oyo)r&;`rht5Gj0-uzOXZIe)GQe%}zFF3bQ?y1uPcag4T*D zz{B2_o(tCDwUkL8gFyB0In?K#{L0Wu1hQkg;bl=@15SkR4-`%Zm z*3i!LLw9@pFK+JUNB7*1?)Ci_d+dJ(cia4bd{`(I?>gWFs;p#Ht}912WTmd;az8}_ zAU6{0**<DQje)FYzABIERcLk_HV^$<*7PTypr0ol81fy)ZXDJ?UInT&l0Dx^qp8 zi}cv#dbrBG%uI;%mC=Zj?|;PZ*hv5zf1ShzqsfMW4abdDOSPe|wJIK%kbT z@59Oye@#j7<_g8BT)`{O&MwT9yi#teFyn!2tSRv3i{3_ERWLHZP&h((0!h>l4kO`j zr3V?kJM%GZPn^2V{F3H$k^=_MYaWj?Z`e}}9Opq7`>Mg|G}+$QJf7Dv?EksfB6wO= zFh_JsD7$Degm?|Ncj7UR*^01G>_mzJ;~x@Nciunit]; + if(a->ciunit >= MXUNIT || a->ciunit<0) + err(a->cierr,101,"startio"); + if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe") + if(!p->ufmt) err(a->cierr,102,"sfe") + return(0); +} +integer e_wsfe(Void) +{ + int n = en_fio(); + f__fmtbuf = NULL; +#ifdef ALWAYS_FLUSH + if (!n && fflush(f__cf)) + err(f__elist->cierr, errno, "write end"); +#endif + return n; +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/sfe.o b/tools/connec/libf2c/sfe.o new file mode 100644 index 0000000000000000000000000000000000000000..7503e1307c76d5fc7655dd9e66d1d647030e4d67 GIT binary patch literal 2640 zcmbuA&ubGw6vtnhYGaKt{wNmo5Ijf~ToN@}q-taOW7S~6S`kIYG~H0KNo2F}7ydW| z#UcSuB6#%TO)p|kDkun^JbCcuMHKx51TFP_XJ_oN&4TC)v-9Tj-n@A`J8yDxxG>TY ziIA2E?We_&rbNlEMSW1JgS3j`WH-OZzF=&>T_!Qq2X^yK?DfPrjP~rjeOJWnR_8;z zwLWjRq#F<4+q1sf{8_q~wVMaX+aM#oC5MB|;ej}(&%CxUM zvObOH=P<`^^~kPy?Oh)=p4iRnM4nLVl-V?g$G7|T?8g^K=Vg>1(tPWc_sn z@%TEmu&|($0`QZPrbC7ap?wpyuNF+<`&IXfu6M3R^)kQbdY%A@Ts=mS%gM;bcvtKm ze;Dvh(n7Qm{ZJx#A`zoLR(C1hgAbTXByV@*61~mnP$Jcl>rV7C$t7aBl`_UzE z(R_Yys&8VlQS}FWRw{BCRH=Mk)Gj#O z3xP1mhzKFGF?*Os{*L~#UCH%SK!F4|vd>!jL{%3=mdCn`2b#dyof0sIP!905v z5BhHo@y{CE-2VY1j=BFSBOm1=Nq>OrI+zM@T~}n)uT;F^B=?@{_tRQ)otdKLIhQ@M z+}aeMH27q!3=d&(rbXE;RvfZmBWto=C#zJeRGcc$sMb8k8a+C(ov+^#s^R}6#nbVg z!JBK48RUq$2|NxA<^6(hG|0`Ar+_R^)r4-=q3RnC_YGtVH}D-87;;z5({-Xv3jfJt zFB`yc9!zrKdUyxR*uLYetN#ne~1~D3f|1|U_$Hz(fRu$qQk5p z=D*HI{Uc_Yn<;wzZ6;)0udn-)1~XlE|7HG&)6TVD!5?ZN{2yTtgZqb?557AiN~`m8 Y4Ff}T-Ws8%+s%KhzTdQVRDE#%Z|I?IZ~y=R literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/sig_die.c b/tools/connec/libf2c/sig_die.c new file mode 100644 index 0000000..63a73d9 --- /dev/null +++ b/tools/connec/libf2c/sig_die.c @@ -0,0 +1,51 @@ +#include "stdio.h" +#include "signal.h" + +#ifndef SIGIOT +#ifdef SIGABRT +#define SIGIOT SIGABRT +#endif +#endif + +#ifdef KR_headers +void sig_die(s, kill) char *s; int kill; +#else +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +extern "C" { +#endif + extern void f_exit(void); + +void sig_die(const char *s, int kill) +#endif +{ + /* print error message, then clear buffers */ + fprintf(stderr, "%s\n", s); + + if(kill) + { + fflush(stderr); + f_exit(); + fflush(stderr); + /* now get a core */ +#ifdef SIGIOT + signal(SIGIOT, SIG_DFL); +#endif + abort(); + } + else { +#ifdef NO_ONEXIT + f_exit(); +#endif + exit(1); + } + } +#ifdef __cplusplus +} +#endif +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/sig_die.o b/tools/connec/libf2c/sig_die.o new file mode 100644 index 0000000000000000000000000000000000000000..b1089c2ec55ff4fba2cdd9c28f259b63bbebdec6 GIT binary patch literal 2008 zcmbW1&ubG=5XUEp*r>5aQ7BX}Ac_ioCfZV|Skl)1K!O3=LQgK6WMe|}Lv~-FdeDP- zC?a_D?8&3Yp4xvy@E`E*Nf30tyKl^Mv+>Xgc{A_xX5P&EwXatzYw1*qL{hX!!=6y0 zk0*w9IW)_3mU6VYvHx@b$Hx0hV26m@c=rJI0h;e<-hR_11H*pU*x(ReM<=-%jvryF zuzM{y&E`e^LsBoFP--uqn$AsRKd=w@<#2?k2E8~{sZ8RI5M}t6BpI?c%W}vN);KB|niz#lGL#*|PmS>C%tq@$ z#{7sk@!2KwY33KK^@e-O?CKc*TVr@}44)sv7sqhyKvMmrDl0{5I^JGeljAg>`|X}? zI`!5r1?^`}qwP_%*%<^aa%+8G1NPhw1-jw+J~``^>he;>sjjVUu5LM7OUsp2hcgk$ z&f*Fo_pjfPg!h~K;O8uUg>48<9QRcGu`iIg|Lq8e{yDbAf7artLHK>cr(k-!kuj4B1?P*eezu{^ZJ|$J+ zE=IhT)AZf0M+#%4YC%A%-tTt39!K>0+EeR~w`T(F)^|;^H-CBK5cZ zXN^qp4sfPr{@ao_Pb_N!aON=OrA`^=>xSPkeNmr`5&uF+e$fji9{X?0XVby^vPJR> zn`0xX{wb4K>O}oO5- + +#ifndef Sigret_t +#define Sigret_t void +#endif +#ifndef Sigarg_t +#ifdef KR_headers +#define Sigarg_t +#else +#define Sigarg_t int +#endif +#endif /*Sigarg_t*/ + +#ifdef USE_SIG_PF /* compile with -DUSE_SIG_PF under IRIX */ +#define sig_pf SIG_PF +#else +typedef Sigret_t (*sig_pf)(Sigarg_t); +#endif + +#define signal1(a,b) signal(a,(sig_pf)b) + +#ifdef __cplusplus +#define Sigarg ... +#define Use_Sigarg +#else +#define Sigarg Int n +#define Use_Sigarg n = n /* shut up compiler warning */ +#endif diff --git a/tools/connec/libf2c/signal1.h0 b/tools/connec/libf2c/signal1.h0 new file mode 100644 index 0000000..a383774 --- /dev/null +++ b/tools/connec/libf2c/signal1.h0 @@ -0,0 +1,35 @@ +/* You may need to adjust the definition of signal1 to supply a */ +/* cast to the correct argument type. This detail is system- and */ +/* compiler-dependent. The #define below assumes signal.h declares */ +/* type SIG_PF for the signal function's second argument. */ + +/* For some C++ compilers, "#define Sigarg_t ..." may be appropriate. */ + +#include + +#ifndef Sigret_t +#define Sigret_t void +#endif +#ifndef Sigarg_t +#ifdef KR_headers +#define Sigarg_t +#else +#define Sigarg_t int +#endif +#endif /*Sigarg_t*/ + +#ifdef USE_SIG_PF /* compile with -DUSE_SIG_PF under IRIX */ +#define sig_pf SIG_PF +#else +typedef Sigret_t (*sig_pf)(Sigarg_t); +#endif + +#define signal1(a,b) signal(a,(sig_pf)b) + +#ifdef __cplusplus +#define Sigarg ... +#define Use_Sigarg +#else +#define Sigarg Int n +#define Use_Sigarg n = n /* shut up compiler warning */ +#endif diff --git a/tools/connec/libf2c/signal_.c b/tools/connec/libf2c/signal_.c new file mode 100644 index 0000000..3b0e6cf --- /dev/null +++ b/tools/connec/libf2c/signal_.c @@ -0,0 +1,21 @@ +#include "f2c.h" +#include "signal1.h" +#ifdef __cplusplus +extern "C" { +#endif + + ftnint +#ifdef KR_headers +signal_(sigp, proc) integer *sigp; sig_pf proc; +#else +signal_(integer *sigp, sig_pf proc) +#endif +{ + int sig; + sig = (int)*sigp; + + return (ftnint)signal(sig, proc); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/signal_.o b/tools/connec/libf2c/signal_.o new file mode 100644 index 0000000000000000000000000000000000000000..7aba39aef2ae521f15782d4a693338044d740d15 GIT binary patch literal 1376 zcmb_bJ4*vW5S}w?;sc3dA!w0GeBcsMQ55uy<{=yge1KNxC7usVBIGWh7FwhcZ2TG4 zR`&V>{23M&{s2K|E<0vjP786u-pqVE-_Fj=<|=JvS_}hN3|NGw$0)#FOVc(3(}Zs5 zf?WMImb+PcAt+aWiaiE<0R2)M7aL%l#f`!4XzUgbCVWWl^^#ugiCaA}fb7c3d}3s~ zP^D0)Pnq!XyH1VK7Fw|A0q-z_AWZsF!`p zeS(@1>%bM)V#y^e3<2XRp^OkAow%O(s+kmf-U_mA;$i7U@P zVC)26fTYx{n9u$&8e#cgLh{q=WIpGgL5xE6mwSy^n8;(lwieK$GylprkxOUlb#neO z+*5_~vtGkZw$-?M)lqCcmVCYU6#gJNZ&G)nrhld0KbosvJ5larBASmXdVYFeVSK*S Ku1ZE*=YIl^+*9!Y literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/signbit.c b/tools/connec/libf2c/signbit.c new file mode 100644 index 0000000..de95a3b --- /dev/null +++ b/tools/connec/libf2c/signbit.c @@ -0,0 +1,24 @@ +#include "arith.h" + +#ifndef Long +#define Long long +#endif + + int +#ifdef KR_headers +signbit_f2c(x) double *x; +#else +signbit_f2c(double *x) +#endif +{ +#ifdef IEEE_MC68k + if (*(Long*)x & 0x80000000) + return 1; +#else +#ifdef IEEE_8087 + if (((Long*)x)[1] & 0x80000000) + return 1; +#endif /*IEEE_8087*/ +#endif /*IEEE_MC68k*/ + return 0; + } diff --git a/tools/connec/libf2c/sue.c b/tools/connec/libf2c/sue.c new file mode 100644 index 0000000..191e326 --- /dev/null +++ b/tools/connec/libf2c/sue.c @@ -0,0 +1,90 @@ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif +extern uiolen f__reclen; +OFF_T f__recloc; + + int +#ifdef KR_headers +c_sue(a) cilist *a; +#else +c_sue(cilist *a) +#endif +{ + f__external=f__sequential=1; + f__formatted=0; + f__curunit = &f__units[a->ciunit]; + if(a->ciunit >= MXUNIT || a->ciunit < 0) + err(a->cierr,101,"startio"); + f__elist=a; + if(f__curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit)) + err(a->cierr,114,"sue"); + f__cf=f__curunit->ufd; + if(f__curunit->ufmt) err(a->cierr,103,"sue") + if(!f__curunit->useek) err(a->cierr,103,"sue") + return(0); +} +#ifdef KR_headers +integer s_rsue(a) cilist *a; +#else +integer s_rsue(cilist *a) +#endif +{ + int n; + if(!f__init) f_init(); + f__reading=1; + if(n=c_sue(a)) return(n); + f__recpos=0; + if(f__curunit->uwrt && f__nowreading(f__curunit)) + err(a->cierr, errno, "read start"); + if(fread((char *)&f__reclen,sizeof(uiolen),1,f__cf) + != 1) + { if(feof(f__cf)) + { f__curunit->uend = 1; + err(a->ciend, EOF, "start"); + } + clearerr(f__cf); + err(a->cierr, errno, "start"); + } + return(0); +} +#ifdef KR_headers +integer s_wsue(a) cilist *a; +#else +integer s_wsue(cilist *a) +#endif +{ + int n; + if(!f__init) f_init(); + if(n=c_sue(a)) return(n); + f__reading=0; + f__reclen=0; + if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr, errno, "write start"); + f__recloc=FTELL(f__cf); + FSEEK(f__cf,(OFF_T)sizeof(uiolen),SEEK_CUR); + return(0); +} +integer e_wsue(Void) +{ OFF_T loc; + fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf); +#ifdef ALWAYS_FLUSH + if (fflush(f__cf)) + err(f__elist->cierr, errno, "write end"); +#endif + loc=FTELL(f__cf); + FSEEK(f__cf,f__recloc,SEEK_SET); + fwrite((char *)&f__reclen,sizeof(uiolen),1,f__cf); + FSEEK(f__cf,loc,SEEK_SET); + return(0); +} +integer e_rsue(Void) +{ + FSEEK(f__cf,(OFF_T)(f__reclen-f__recpos+sizeof(uiolen)),SEEK_CUR); + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/sue.o b/tools/connec/libf2c/sue.o new file mode 100644 index 0000000000000000000000000000000000000000..9c08a065d811199a6a3c03834dd7a40d3c1cfc6f GIT binary patch literal 5688 zcmbW5U2GIp6vywj2n)8QR6r3VwE+bpn-*HEfU>1P2h#u%h>d8L?RFM6-R{=eSz7@C zvtVpCjl>uQ!;A7@Vhn)?5+LCtmazEZ*MkW$L3|DBsx4G5Vgj;XrXUWQZ*=Qeo772Hsm0Km;9lDcUBsq)I$gzu)>2j%@PO|RsW%q)V z&eBo`Qk;gni^ZY|2|$G;tG2KzxK&js4L4EMStpijmXS(H%pws7IJ@ zRuw;4`AT>@k14(wq?0u${VMUm*LrOC0`5gi^(bp7k8M_7O>!X|mJ1}ew_3O}WpzQ& zSc_KSGA<*BOj>cL9IKk)T?DvW8GWUa#Kf>Qs#ixSm zzdA6tVoLA`ErfZ*aKL)8Fj}grb7f_bX;s0NN9h)ItLcC}=TrZ>suo}1s@m@~?VljD zPuIUQR=>9@sA4**>l$%gS5=)xMO$m@%GyQSJF_V_Tl;*dDOA67c~;&v>~Cle)i*9y zRJZlJl$YE=g(#=LQdTY|mBOUPwlvYo#gvJVNV%Xfl(2F!bpl07(ZXx0$BCXWC(u`T z8dPikxQEOAm-J70_>*)$L;P7Zk(%oQ;>y?f21|YTG9SLmhi@ca!{$Yxv`+fL(KKvse{;3Z?K^)^fUPc8n`Hax@OFFZezT!h+N>v3wp zX&Fw-acUItNW`&Y$#hJ_T|1dfuOMWn^#&icML>l6KUw9YdvvmBe+!WVP83z6s9fofKB*V^&y~pq_Kr-mDHyNG+B!j+=4#Ukm270U;!}C;z zf%ABdNjfneJg+e5v3D9jX8_5(asHsNv?>aalC8HdKhFJYsUEbgz;LY|D18Y9!_eG zaV=tgE-=o=RbYHR)Bngg*I(Bh`JBe|H<_O2VVLRpdbr2Fb#P6HL$7+eyaxx;n==Ux!y1$Gn*J`5ogtpFeAk{Lf+W{LVNZ?;XbZdMh%{^^^7c z9o6_|GxJiZIr^<*d^Xebd6~=fRZL&U^!ROP{4Zym`)Ou=mN0#rkG_L(zRurZex7E2 zx|p8#n_zk#e?Qan_zy77{TyO`c>H-E{c*;5{GTyDJpNNm&-*>Y^t|5!)7P>*e9JiR z_gBWb|64x(;S+}Sqqi1$AC~7aZoUh5dbs)SJm}%(yYsk*o9}E9%Dmm1I_kRH zlpH%54Y_u|D?(1Xi@s8zX$aAmm#ndON8(Pj#}*;fiBM-IBSNusPY-=ziBKx-+M%{h z+n3VM)L6If{oyaQ)D(H~{z3~AgWb`2Rd?fa2!=fl&tRAiZU^ylAUirmU2%(k%{yk|D74lyZRN*lbx4|z{0X`qLJ%0DWXFVOLuhYfPZ(b~Ju{E5Ef%wLhZgZ?_TpwEq`KYN3Mw literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/sysdep1.h b/tools/connec/libf2c/sysdep1.h new file mode 100644 index 0000000..29546db --- /dev/null +++ b/tools/connec/libf2c/sysdep1.h @@ -0,0 +1,70 @@ +#ifndef SYSDEP_H_INCLUDED +#define SYSDEP_H_INCLUDED +#undef USE_LARGEFILE +#ifndef NO_LONG_LONG + +#ifdef __sun__ +#define USE_LARGEFILE +#define OFF_T off64_t +#endif + +#ifdef __linux__ +#define USE_LARGEFILE +#ifdef __GLIBC__ +#define OFF_T __off64_t +#else +#define OFF_T off_t +#endif +#endif + +#ifdef _AIX43 +#define _LARGE_FILES +#define _LARGE_FILE_API +#define USE_LARGEFILE +#endif /*_AIX43*/ + +#ifdef __hpux +#define _FILE64 +#define _LARGEFILE64_SOURCE +#define USE_LARGEFILE +#endif /*__hpux*/ + +#ifdef __sgi +#define USE_LARGEFILE +#endif /*__sgi*/ + +#ifdef __FreeBSD__ +#define OFF_T off_t +#define FSEEK fseeko +#define FTELL ftello +#endif + +#ifdef USE_LARGEFILE +#ifndef OFF_T +#define OFF_T off64_t +#endif +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include +#include +#define FOPEN fopen64 +#define FREOPEN freopen64 +#define FSEEK fseeko64 +#define FSTAT fstat64 +#define FTELL ftello64 +#define FTRUNCATE ftruncate64 +#define STAT stat64 +#define STAT_ST stat64 +#endif /*USE_LARGEFILE*/ +#endif /*NO_LONG_LONG*/ + +#ifndef NON_UNIX_STDIO +#ifndef USE_LARGEFILE +#define _INCLUDE_POSIX_SOURCE /* for HP-UX */ +#define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ +#include "sys/types.h" +#include "sys/stat.h" +#endif +#endif + +#endif /*SYSDEP_H_INCLUDED*/ diff --git a/tools/connec/libf2c/sysdep1.h0 b/tools/connec/libf2c/sysdep1.h0 new file mode 100644 index 0000000..29546db --- /dev/null +++ b/tools/connec/libf2c/sysdep1.h0 @@ -0,0 +1,70 @@ +#ifndef SYSDEP_H_INCLUDED +#define SYSDEP_H_INCLUDED +#undef USE_LARGEFILE +#ifndef NO_LONG_LONG + +#ifdef __sun__ +#define USE_LARGEFILE +#define OFF_T off64_t +#endif + +#ifdef __linux__ +#define USE_LARGEFILE +#ifdef __GLIBC__ +#define OFF_T __off64_t +#else +#define OFF_T off_t +#endif +#endif + +#ifdef _AIX43 +#define _LARGE_FILES +#define _LARGE_FILE_API +#define USE_LARGEFILE +#endif /*_AIX43*/ + +#ifdef __hpux +#define _FILE64 +#define _LARGEFILE64_SOURCE +#define USE_LARGEFILE +#endif /*__hpux*/ + +#ifdef __sgi +#define USE_LARGEFILE +#endif /*__sgi*/ + +#ifdef __FreeBSD__ +#define OFF_T off_t +#define FSEEK fseeko +#define FTELL ftello +#endif + +#ifdef USE_LARGEFILE +#ifndef OFF_T +#define OFF_T off64_t +#endif +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#include +#include +#define FOPEN fopen64 +#define FREOPEN freopen64 +#define FSEEK fseeko64 +#define FSTAT fstat64 +#define FTELL ftello64 +#define FTRUNCATE ftruncate64 +#define STAT stat64 +#define STAT_ST stat64 +#endif /*USE_LARGEFILE*/ +#endif /*NO_LONG_LONG*/ + +#ifndef NON_UNIX_STDIO +#ifndef USE_LARGEFILE +#define _INCLUDE_POSIX_SOURCE /* for HP-UX */ +#define _INCLUDE_XOPEN_SOURCE /* for HP-UX */ +#include "sys/types.h" +#include "sys/stat.h" +#endif +#endif + +#endif /*SYSDEP_H_INCLUDED*/ diff --git a/tools/connec/libf2c/system_.c b/tools/connec/libf2c/system_.c new file mode 100644 index 0000000..b18e8a6 --- /dev/null +++ b/tools/connec/libf2c/system_.c @@ -0,0 +1,42 @@ +/* f77 interface to system routine */ + +#include "f2c.h" + +#ifdef KR_headers +extern char *F77_aloc(); + + integer +system_(s, n) register char *s; ftnlen n; +#else +#undef abs +#undef min +#undef max +#include "stdlib.h" +#ifdef __cplusplus +extern "C" { +#endif +extern char *F77_aloc(ftnlen, const char*); + + integer +system_(register char *s, ftnlen n) +#endif +{ + char buff0[256], *buff; + register char *bp, *blast; + integer rv; + + buff = bp = n < sizeof(buff0) + ? buff0 : F77_aloc(n+1, "system_"); + blast = bp + n; + + while(bp < blast && *s) + *bp++ = *s++; + *bp = 0; + rv = system(buff); + if (buff != buff0) + free(buff); + return rv; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/system_.o b/tools/connec/libf2c/system_.o new file mode 100644 index 0000000000000000000000000000000000000000..480c21bea4f441ebf814a60abafda2a5753051f1 GIT binary patch literal 1960 zcmbW1&r1|h9Khe~EV-$T+Ydsr!yc@*z+pEPQz&-UcJ~=WMk)vu!?=!Y=(?~oOIl#a ziZrNTe?SqPA_zKl78FmNI)rrU5Mi(RhE8%l-h@kFLX9RF^gD(Er z2k^k5?q|BzlNfTp(EjbV?Y4s`L<1n?tb0H zmNdTu6^8n^oX7!kcj(Hh*JqM;w|b2$DZ03Y1Kqi&-QA>X3ld%H#eA>Gkh=vl#GysG zy7vJ@#IEf%d%ZSVaR9K~DLKNDprlX)Y>tv^GW7p+^GvS?2qMI;})k zLz>dQENe=v8qO(iL!qb5N(_*uMAJ${YazM8!GTzOY@#yjRAPN9Lh_25 z=(*@qR=1Io>)sS0GW^vOnFyCC1jyuwaH^RyX{sFrOC}NFR5N9Aw02+?tO(@)d9Y*D z^Zom;tpPvXfM009uL3_I?8mzsV3`K-MAZiqB-__#m@}n3@h_hkhV7X7X(L~lHm1z` zGsMX0!)Z-7hO^m`%&0M{rS*)#q75=twk)WRQt*|x@n*1p@B8vd;EKRsF&+Yq+vV|Z z7{{B#?Q;HJ;9~uc0&fxGV~k^c|4tZC?fIf(P7u|0%Dyget8C4fs$bF9nTAZvDb6@yfqJNTrgfT8gF z^-qEC2(SY_xWg2DL>Xs~<~oD8OYFm+@OH+}Gk%$!xjMs^$>TZaJLYUTEiL(G* zgkT5j;SX57`FGj;d`_Gn<9I&j*MVWH;G5|10l_Cq5Z?eN);w(fFyvxQ{Jj)~_rD}U zuz7#3#|0*aKIZ`#cR6{IjFEx(NJTxRo0dx%BJQVu))x zRhLWHcD3u$`l?`<-K$ZWKZfIeFwm3dID34JiBvX8bQl@bFLQiArQ@+Cbr zJ2L+TgFt!yiRoL-7e3^Vg^oP1&3R#?Zz(WG4sFY;zNQ%)J{dO++GmXaWS8~2LAkqa Yz4Jla>;uU28>Uf}|6pSmK}MPX0oAiIApigX literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/uio.c b/tools/connec/libf2c/uio.c new file mode 100644 index 0000000..44f768d --- /dev/null +++ b/tools/connec/libf2c/uio.c @@ -0,0 +1,75 @@ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif +uiolen f__reclen; + + int +#ifdef KR_headers +do_us(number,ptr,len) ftnint *number; char *ptr; ftnlen len; +#else +do_us(ftnint *number, char *ptr, ftnlen len) +#endif +{ + if(f__reading) + { + f__recpos += (int)(*number * len); + if(f__recpos>f__reclen) + err(f__elist->cierr, 110, "do_us"); + if (fread(ptr,(int)len,(int)(*number),f__cf) != *number) + err(f__elist->ciend, EOF, "do_us"); + return(0); + } + else + { + f__reclen += *number * len; + (void) fwrite(ptr,(int)len,(int)(*number),f__cf); + return(0); + } +} +#ifdef KR_headers +integer do_ud(number,ptr,len) ftnint *number; char *ptr; ftnlen len; +#else +integer do_ud(ftnint *number, char *ptr, ftnlen len) +#endif +{ + f__recpos += (int)(*number * len); + if(f__recpos > f__curunit->url && f__curunit->url!=1) + err(f__elist->cierr,110,"do_ud"); + if(f__reading) + { +#ifdef Pad_UDread +#ifdef KR_headers + int i; +#else + size_t i; +#endif + if (!(i = fread(ptr,(int)len,(int)(*number),f__cf)) + && !(f__recpos - *number*len)) + err(f__elist->cierr,EOF,"do_ud") + if (i < *number) + memset(ptr + i*len, 0, (*number - i)*len); + return 0; +#else + if(fread(ptr,(int)len,(int)(*number),f__cf) != *number) + err(f__elist->cierr,EOF,"do_ud") + else return(0); +#endif + } + (void) fwrite(ptr,(int)len,(int)(*number),f__cf); + return(0); +} +#ifdef KR_headers +integer do_uio(number,ptr,len) ftnint *number; char *ptr; ftnlen len; +#else +integer do_uio(ftnint *number, char *ptr, ftnlen len) +#endif +{ + if(f__sequential) + return(do_us(number,ptr,len)); + else return(do_ud(number,ptr,len)); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/uio.o b/tools/connec/libf2c/uio.o new file mode 100644 index 0000000000000000000000000000000000000000..3a7b8f11965560a87ee498752af376457e5809b5 GIT binary patch literal 3376 zcmbW3UuauZ9LIlYri-;pv(}-o4XZG5!Y++lU02;m+qFGxVP)$Il}_%`^u~sz$(G!> zDr0+yps@%O_E5p6Ju41;DZVJH&=+CF2SM>+dl_o>AR8#SN&WrKJ-_6~&AlS~m7G7H z^S!_GJHKunoFkO4T2#`d_O4qpBU&y!-tx zu&!@(e;JKFL8PurwW40vjmtx7*(0?UH00I$lbE+haU$qODTVILvOT=egBe2wbgyt3%u^1-!Cm z&SuwmWxj;nW!_vdJN&*qAic`QSE_a|#<5pBy(HJZi>-OBmB#(~l3lF;mGc14(6Z4Y z@126kQX;amYisN(zCh0*+oeYU?omA)Pt-a(evijIK4`}7w#Gi~jK_wb#y&keW5!>g z`e-~c#e);0qeFc!PtR40Znf{AHDLAc+h5hamHT&OxlH=il!1ClQh%vQ_QV&2uHqCt+zvXhz57vF{)H9U|#U*eOM zyI9V<4&hwJMR)c@dU9kqZBLGmPmP_nPY;iz$85l<%jIIpE|jtvH(x3mHwA|-0y2G5 zV%>p1+MkDX6QDhhZ8G9L_Is{M_=e=5#(;e^BsF!AA_I6Z5R#ZyHYiDVOXg zYdGoYDrJ7raME`Re#vmsZx{Tk;iQ-Gd}g>mo*P0hs=Rmng5@Jp6*OO7k32j6>&BMj|<+1Z8F*~BhmdgblKv3 zZ=LaRzIVZ@yu0XT=CF3lUcJDrvQx-duCwHVRW8lrZ9tl&mBcQMI16^JoLO|hqA{@M zDiyG@rNu?Oh`=hAT*sO?F}<(iX0qqZ?2ljd;iI%p{}(TXjO>9-0``4f*olnZy%heW z-PZql0h~3TI(i4`S-x-StdYHhKjN=aN7#Pa0JJWzYL+}d*YusDwvjh=DFe>~#eSXsT>}Q9j=J{Xo zah{*+8S}hP20#DL_{mR@^tORBrlvDVIrQg`((GS5A{aF9&vohu +#include +#include "arith.h" + +#define TYSHORT 2 +#define TYLONG 3 +#define TYREAL 4 +#define TYDREAL 5 +#define TYCOMPLEX 6 +#define TYDCOMPLEX 7 +#define TYINT1 11 +#define TYQUAD 14 +#ifndef Long +#define Long long +#endif + +#ifdef __mips +#define RNAN 0xffc00000 +#define DNAN0 0xfff80000 +#define DNAN1 0 +#endif + +#ifdef _PA_RISC1_1 +#define RNAN 0xffc00000 +#define DNAN0 0xfff80000 +#define DNAN1 0 +#endif + +#ifndef RNAN +#define RNAN 0xff800001 +#ifdef IEEE_MC68k +#define DNAN0 0xfff00000 +#define DNAN1 1 +#else +#define DNAN0 1 +#define DNAN1 0xfff00000 +#endif +#endif /*RNAN*/ + +#ifdef KR_headers +#define Void /*void*/ +#define FA7UL (unsigned Long) 0xfa7a7a7aL +#else +#define Void void +#define FA7UL 0xfa7a7a7aUL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +static void ieee0(Void); + +static unsigned Long rnan = RNAN, + dnan0 = DNAN0, + dnan1 = DNAN1; + +double _0 = 0.; + + void +#ifdef KR_headers +_uninit_f2c(x, type, len) void *x; int type; long len; +#else +_uninit_f2c(void *x, int type, long len) +#endif +{ + static int first = 1; + + unsigned Long *lx, *lxe; + + if (first) { + first = 0; + ieee0(); + } + if (len == 1) + switch(type) { + case TYINT1: + *(char*)x = 'Z'; + return; + case TYSHORT: + *(short*)x = 0xfa7a; + break; + case TYLONG: + *(unsigned Long*)x = FA7UL; + return; + case TYQUAD: + case TYCOMPLEX: + case TYDCOMPLEX: + break; + case TYREAL: + *(unsigned Long*)x = rnan; + return; + case TYDREAL: + lx = (unsigned Long*)x; + lx[0] = dnan0; + lx[1] = dnan1; + return; + default: + printf("Surprise type %d in _uninit_f2c\n", type); + } + switch(type) { + case TYINT1: + memset(x, 'Z', len); + break; + case TYSHORT: + *(short*)x = 0xfa7a; + break; + case TYQUAD: + len *= 2; + /* no break */ + case TYLONG: + lx = (unsigned Long*)x; + lxe = lx + len; + while(lx < lxe) + *lx++ = FA7UL; + break; + case TYCOMPLEX: + len *= 2; + /* no break */ + case TYREAL: + lx = (unsigned Long*)x; + lxe = lx + len; + while(lx < lxe) + *lx++ = rnan; + break; + case TYDCOMPLEX: + len *= 2; + /* no break */ + case TYDREAL: + lx = (unsigned Long*)x; + for(lxe = lx + 2*len; lx < lxe; lx += 2) { + lx[0] = dnan0; + lx[1] = dnan1; + } + } + } +#ifdef __cplusplus +} +#endif + +#ifndef MSpc +#ifdef MSDOS +#define MSpc +#else +#ifdef _WIN32 +#define MSpc +#endif +#endif +#endif + +#ifdef MSpc +#define IEEE0_done +#include "float.h" +#include "signal.h" + + static void +ieee0(Void) +{ +#ifndef __alpha +#ifndef EM_DENORMAL +#define EM_DENORMAL _EM_DENORMAL +#endif +#ifndef EM_UNDERFLOW +#define EM_UNDERFLOW _EM_UNDERFLOW +#endif +#ifndef EM_INEXACT +#define EM_INEXACT _EM_INEXACT +#endif +#ifndef MCW_EM +#define MCW_EM _MCW_EM +#endif + _control87(EM_DENORMAL | EM_UNDERFLOW | EM_INEXACT, MCW_EM); +#endif + /* With MS VC++, compiling and linking with -Zi will permit */ + /* clicking to invoke the MS C++ debugger, which will show */ + /* the point of error -- provided SIGFPE is SIG_DFL. */ + signal(SIGFPE, SIG_DFL); + } +#endif /* MSpc */ + +#ifdef __mips /* must link with -lfpe */ +#define IEEE0_done +/* code from Eric Grosse */ +#include +#include +#include "/usr/include/sigfpe.h" /* full pathname for lcc -N */ +#include "/usr/include/sys/fpu.h" + + static void +#ifdef KR_headers +ieeeuserhand(exception, val) unsigned exception[5]; int val[2]; +#else +ieeeuserhand(unsigned exception[5], int val[2]) +#endif +{ + fflush(stdout); + fprintf(stderr,"ieee0() aborting because of "); + if(exception[0]==_OVERFL) fprintf(stderr,"overflow\n"); + else if(exception[0]==_UNDERFL) fprintf(stderr,"underflow\n"); + else if(exception[0]==_DIVZERO) fprintf(stderr,"divide by 0\n"); + else if(exception[0]==_INVALID) fprintf(stderr,"invalid operation\n"); + else fprintf(stderr,"\tunknown reason\n"); + fflush(stderr); + abort(); +} + + static void +#ifdef KR_headers +ieeeuserhand2(j) unsigned int **j; +#else +ieeeuserhand2(unsigned int **j) +#endif +{ + fprintf(stderr,"ieee0() aborting because of confusion\n"); + abort(); +} + + static void +ieee0(Void) +{ + int i; + for(i=1; i<=4; i++){ + sigfpe_[i].count = 1000; + sigfpe_[i].trace = 1; + sigfpe_[i].repls = _USER_DETERMINED; + } + sigfpe_[1].repls = _ZERO; /* underflow */ + handle_sigfpes( _ON, + _EN_UNDERFL|_EN_OVERFL|_EN_DIVZERO|_EN_INVALID, + ieeeuserhand,_ABORT_ON_ERROR,ieeeuserhand2); + } +#endif /* mips */ + +#ifdef __linux__ +#define IEEE0_done +#include "fpu_control.h" + +#ifdef __alpha__ +#ifndef USE_setfpucw +#define __setfpucw(x) __fpu_control = (x) +#endif +#endif + +#ifndef _FPU_SETCW +#undef Can_use__setfpucw +#define Can_use__setfpucw +#endif + + static void +ieee0(Void) +{ +#if (defined(__mc68000__) || defined(__mc68020__) || defined(mc68020) || defined (__mc68k__)) +/* Reported 20010705 by Alan Bain */ +/* Note that IEEE 754 IOP (illegal operation) */ +/* = Signaling NAN (SNAN) + operation error (OPERR). */ +#ifdef Can_use__setfpucw + __setfpucw(_FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL); +#else + __fpu_control = _FPU_IEEE + _FPU_DOUBLE + _FPU_MASK_OPERR + _FPU_MASK_DZ + _FPU_MASK_SNAN+_FPU_MASK_OVFL; + _FPU_SETCW(__fpu_control); +#endif + +#elif (defined(__powerpc__)||defined(_ARCH_PPC)||defined(_ARCH_PWR)) /* !__mc68k__ */ +/* Reported 20011109 by Alan Bain */ + +#ifdef Can_use__setfpucw + +/* The following is NOT a mistake -- the author of the fpu_control.h +for the PPC has erroneously defined IEEE mode to turn on exceptions +other than Inexact! Start from default then and turn on only the ones +which we want*/ + + __setfpucw(_FPU_DEFAULT + _FPU_MASK_IM+_FPU_MASK_OM+_FPU_MASK_UM); + +#else /* PPC && !Can_use__setfpucw */ + + __fpu_control = _FPU_DEFAULT +_FPU_MASK_OM+_FPU_MASK_IM+_FPU_MASK_UM; + _FPU_SETCW(__fpu_control); + +#endif /*Can_use__setfpucw*/ + +#else /* !(mc68000||powerpc) */ + +#ifdef _FPU_IEEE +#ifndef _FPU_EXTENDED /* e.g., ARM processor under Linux */ +#define _FPU_EXTENDED 0 +#endif +#ifndef _FPU_DOUBLE +#define _FPU_DOUBLE 0 +#endif +#ifdef Can_use__setfpucw /* pre-1997 (?) Linux */ + __setfpucw(_FPU_IEEE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM); +#else +#ifdef UNINIT_F2C_PRECISION_53 /* 20051004 */ + /* unmask invalid, etc., and change rounding precision to double */ + __fpu_control = _FPU_IEEE - _FPU_EXTENDED + _FPU_DOUBLE - _FPU_MASK_IM - _FPU_MASK_ZM - _FPU_MASK_OM; + _FPU_SETCW(__fpu_control); +#else + /* unmask invalid, etc., and keep current rounding precision */ + fpu_control_t cw; + _FPU_GETCW(cw); + cw &= ~(_FPU_MASK_IM | _FPU_MASK_ZM | _FPU_MASK_OM); + _FPU_SETCW(cw); +#endif +#endif + +#else /* !_FPU_IEEE */ + + fprintf(stderr, "\n%s\n%s\n%s\n%s\n", + "WARNING: _uninit_f2c in libf2c does not know how", + "to enable trapping on this system, so f2c's -trapuv", + "option will not detect uninitialized variables unless", + "you can enable trapping manually."); + fflush(stderr); + +#endif /* _FPU_IEEE */ +#endif /* __mc68k__ */ + } +#endif /* __linux__ */ + +#ifdef __alpha +#ifndef IEEE0_done +#define IEEE0_done +#include + static void +ieee0(Void) +{ + ieee_set_fp_control(IEEE_TRAP_ENABLE_INV); + } +#endif /*IEEE0_done*/ +#endif /*__alpha*/ + +#ifdef __hpux +#define IEEE0_done +#define _INCLUDE_HPUX_SOURCE +#include + +#ifndef FP_X_INV +#include +#define fpsetmask fesettrapenable +#define FP_X_INV FE_INVALID +#endif + + static void +ieee0(Void) +{ + fpsetmask(FP_X_INV); + } +#endif /*__hpux*/ + +#ifdef _AIX +#define IEEE0_done +#include + + static void +ieee0(Void) +{ + fp_enable(TRP_INVALID); + fp_trap(FP_TRAP_SYNC); + } +#endif /*_AIX*/ + +#ifdef __sun +#define IEEE0_done +#include + + static void +ieee0(Void) +{ + fpsetmask(FP_X_INV); + } +#endif /*__sparc*/ + +#ifndef IEEE0_done + static void +ieee0(Void) {} +#endif diff --git a/tools/connec/libf2c/uninit.o b/tools/connec/libf2c/uninit.o new file mode 100644 index 0000000000000000000000000000000000000000..82da188ea309f8d148c0ca40bb43921455de30be GIT binary patch literal 3176 zcmc(hO>7%g5XWb;CYUyL9Ym!-i?k^TgpaPArh&BLBTmv}OI=EvM4(c%IPscTjh$ex z)igp-$p~t-kwD_WjYEq-9N|(9&`JSZPE-ORDh^c8L#aV3NR?2V%FOJ}IO`{u3kN3g zzWM)l=FRhaZ{Pa$or%#FO#?9vo`h8;6yT%qsz2ztgRmYV5TBSFw@SZ9t@4fXwO!@! zQ`YfNcMk?w<&my%@7dB5UU0E)-keQTY#RX#?G|rb8cF+WFeW%57dG zUM{@a)tWA)x?2CbFx%By{R)!~KU%(GEv@5(cP#B(?c&$^f$A$2eQ|N|dNotgH8@(U zCaDFe42J-&)~fp{tDmyY5I#-bWxD)UsMTtT@-JT;Kw*`C_F(nCGFK4= zNo)IZA!?PDLzUqbs$y;b@$gmaIDW5`)#rc9;%=+-W%Pv?;|G@mNk4HC4arNYe&gT$ zmAd@AVT>3WrkE?$54=Ip=>A6=FXrd-nSx`uN9G-)J7r{YhF#2Mav9f7Z=GHvL%WL| zZE-(n3sG%j+wI}EagJliH}SoFH0MK+=!uqiq~lFJ9x+Oxkw~oN=9-9sBp!(lMZ)p5 z{(c)99^PT}OimSZZqazm>^Eau`ih?FeXV!EjBR_+r`-3yHG0z>44~s*Gt;5I^%`#L z(AuCy=nxjSq1EAz1}#E|`m_o1S{>FlXc9DK&}2L`lJ-FVG6Jd?r4+^PLEVf$a0_lC zzcVmz-r6DCaf^5`6T>mE@!u}E$>~G(^voeUoy^Q4zzvjh(?lTaWDAZ9fgJ?)SYq!` zJYnx09Ub2}VNb+|5<6|!jCIIb@I$L{1D{Va|M>7Z-COZ-ErC9n#Q)7a=VOo4y#dyz z0-WYd`uUVOo)^#-;O7FIjva~L<1Y|UJguH^4)^L($e#=-j*P}a{2B=~SwG=F_}Ci* zxxz0om$ejrFONf>L*Y*`@8CS)o0-eADSU*vp~SZ{?^5^%<~<6(oB1OOzs#D>1v07I z$?@BKT<6`)W!)rx9rMSP`1e^4D*Pnt5rxY2H0>*p1| zoAp73pJDxy!k1a66kcIHqwo(|&no;|*7FMgjO1eoDUP}qR<^bPwX6$r6nRUSQW2OoPFsJ9TStp0-xjEM{$DWzo z;+-w^+W)~ZFqhU-J<$h|k;!@ID>;Wn0c=D!grC7xA!x z+Rs6Immu1L-_)<%ZC&4wUbFfZzq-zI$88u#Z#lJoA2KSn6+c0Xa$aW;qA&S8JfM9| zzB>K^2J+lUHm^Chm7j0Z}2y`zB*s3evbQ8^N(@9)Wa~( zR87w<)t7V3j{=bVhXimd^Cqo>T>N0@CtN?s$X8=YHw!(@@F*wHyNZ5o$oOUc=$)s2 dcSJD26D8*xF*3D&JF;f^F)mc}vQ{r@{y*q@MRx!I literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/util.c b/tools/connec/libf2c/util.c new file mode 100644 index 0000000..ad4bec5 --- /dev/null +++ b/tools/connec/libf2c/util.c @@ -0,0 +1,57 @@ +#include "sysdep1.h" /* here to get stat64 on some badly designed Linux systems */ +#include "f2c.h" +#include "fio.h" +#ifdef __cplusplus +extern "C" { +#endif + + VOID +#ifdef KR_headers +#define Const /*nothing*/ +g_char(a,alen,b) char *a,*b; ftnlen alen; +#else +#define Const const +g_char(const char *a, ftnlen alen, char *b) +#endif +{ + Const char *x = a + alen; + char *y = b + alen; + + for(;; y--) { + if (x <= a) { + *b = 0; + return; + } + if (*--x != ' ') + break; + } + *y-- = 0; + do *y-- = *x; + while(x-- > a); + } + + VOID +#ifdef KR_headers +b_char(a,b,blen) char *a,*b; ftnlen blen; +#else +b_char(const char *a, char *b, ftnlen blen) +#endif +{ int i; + for(i=0;iY|I1OiAa#3u1^uZ(0lC;yL7)3}S zp}{6BT^W9W3s*!}medq?5Eq2Rg^6*2qHMY~*6*9%8z$qh(L*NRx#xb5drxP076=C| zfLm`+L}%E79b+YxAVhkEv({H&DT;sKApR!ZY^<;NDb z$yZ`@qwY$(##h^3K&t$LPv+){U6M@?mY&I(r3 zUziXp{F%W@>dj=xZa71?ouS+R($V}D-Fdi2n2A0a(E@^*ei?M^!|S=P*O~s3HPXBV z-V2XeA2KaRXOt9?qru>K zU_zeo4TS?T8%I7cf}aoG=@-5>0RG9Leom*0z!4UB&>N0EM!3%JNew!`Cy~;N2~~+e zR8zG$!&xdmuSjYq)0kVr07B-5l=!&azTwtp?i~EnhpFs z{~JYUfcG=LL0-@h_4>=h+OQ<8prLnOc=UM0USa-yp|@Cz-Xkv70_lW^I{K*xWrJdR z5jd~s@>L*a^EcUi{=49Olz2U#-wzs&V(GwYc*W-PHIGJl5H_&qzt(%97JG7^fNJ3L z@w?H3&*yOjHaXYl9hiwGxtM139{U`!dN+%Wpy7WLqkr62tkJ{848im1VLaA(*fe^F O`G-t=pf3h)tp5WuOwlv| literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/wref.c b/tools/connec/libf2c/wref.c new file mode 100644 index 0000000..f2074b7 --- /dev/null +++ b/tools/connec/libf2c/wref.c @@ -0,0 +1,294 @@ +#include "f2c.h" +#include "fio.h" + +#ifndef KR_headers +#undef abs +#undef min +#undef max +#include "stdlib.h" +#include "string.h" +#endif + +#include "fmt.h" +#include "fp.h" +#ifndef VAX +#include "ctype.h" +#ifdef __cplusplus +extern "C" { +#endif +#endif + + int +#ifdef KR_headers +wrt_E(p,w,d,e,len) ufloat *p; ftnlen len; +#else +wrt_E(ufloat *p, int w, int d, int e, ftnlen len) +#endif +{ + char buf[FMAX+EXPMAXDIGS+4], *s, *se; + int d1, delta, e1, i, sign, signspace; + double dd; +#ifdef WANT_LEAD_0 + int insert0 = 0; +#endif +#ifndef VAX + int e0 = e; +#endif + + if(e <= 0) + e = 2; + if(f__scale) { + if(f__scale >= d + 2 || f__scale <= -d) + goto nogood; + } + if(f__scale <= 0) + --d; + if (len == sizeof(real)) + dd = p->pf; + else + dd = p->pd; + if (dd < 0.) { + signspace = sign = 1; + dd = -dd; + } + else { + sign = 0; + signspace = (int)f__cplus; +#ifndef VAX + if (!dd) { +#ifdef SIGNED_ZEROS + if (signbit_f2c(&dd)) + signspace = sign = 1; +#endif + dd = 0.; /* avoid -0 */ + } +#endif + } + delta = w - (2 /* for the . and the d adjustment above */ + + 2 /* for the E+ */ + signspace + d + e); +#ifdef WANT_LEAD_0 + if (f__scale <= 0 && delta > 0) { + delta--; + insert0 = 1; + } + else +#endif + if (delta < 0) { +nogood: + while(--w >= 0) + PUT('*'); + return(0); + } + if (f__scale < 0) + d += f__scale; + if (d > FMAX) { + d1 = d - FMAX; + d = FMAX; + } + else + d1 = 0; + sprintf(buf,"%#.*E", d, dd); +#ifndef VAX + /* check for NaN, Infinity */ + if (!isdigit(buf[0])) { + switch(buf[0]) { + case 'n': + case 'N': + signspace = 0; /* no sign for NaNs */ + } + delta = w - strlen(buf) - signspace; + if (delta < 0) + goto nogood; + while(--delta >= 0) + PUT(' '); + if (signspace) + PUT(sign ? '-' : '+'); + for(s = buf; *s; s++) + PUT(*s); + return 0; + } +#endif + se = buf + d + 3; +#ifdef GOOD_SPRINTF_EXPONENT /* When possible, exponent has 2 digits. */ + if (f__scale != 1 && dd) + sprintf(se, "%+.2d", atoi(se) + 1 - f__scale); +#else + if (dd) + sprintf(se, "%+.2d", atoi(se) + 1 - f__scale); + else + strcpy(se, "+00"); +#endif + s = ++se; + if (e < 2) { + if (*s != '0') + goto nogood; + } +#ifndef VAX + /* accommodate 3 significant digits in exponent */ + if (s[2]) { +#ifdef Pedantic + if (!e0 && !s[3]) + for(s -= 2, e1 = 2; s[0] = s[1]; s++); + + /* Pedantic gives the behavior that Fortran 77 specifies, */ + /* i.e., requires that E be specified for exponent fields */ + /* of more than 3 digits. With Pedantic undefined, we get */ + /* the behavior that Cray displays -- you get a bigger */ + /* exponent field if it fits. */ +#else + if (!e0) { + for(s -= 2, e1 = 2; s[0] = s[1]; s++) +#ifdef CRAY + delta--; + if ((delta += 4) < 0) + goto nogood +#endif + ; + } +#endif + else if (e0 >= 0) + goto shift; + else + e1 = e; + } + else + shift: +#endif + for(s += 2, e1 = 2; *s; ++e1, ++s) + if (e1 >= e) + goto nogood; + while(--delta >= 0) + PUT(' '); + if (signspace) + PUT(sign ? '-' : '+'); + s = buf; + i = f__scale; + if (f__scale <= 0) { +#ifdef WANT_LEAD_0 + if (insert0) + PUT('0'); +#endif + PUT('.'); + for(; i < 0; ++i) + PUT('0'); + PUT(*s); + s += 2; + } + else if (f__scale > 1) { + PUT(*s); + s += 2; + while(--i > 0) + PUT(*s++); + PUT('.'); + } + if (d1) { + se -= 2; + while(s < se) PUT(*s++); + se += 2; + do PUT('0'); while(--d1 > 0); + } + while(s < se) + PUT(*s++); + if (e < 2) + PUT(s[1]); + else { + while(++e1 <= e) + PUT('0'); + while(*s) + PUT(*s++); + } + return 0; + } + + int +#ifdef KR_headers +wrt_F(p,w,d,len) ufloat *p; ftnlen len; +#else +wrt_F(ufloat *p, int w, int d, ftnlen len) +#endif +{ + int d1, sign, n; + double x; + char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s; + + x= (len==sizeof(real)?p->pf:p->pd); + if (d < MAXFRACDIGS) + d1 = 0; + else { + d1 = d - MAXFRACDIGS; + d = MAXFRACDIGS; + } + if (x < 0.) + { x = -x; sign = 1; } + else { + sign = 0; +#ifndef VAX + if (!x) { +#ifdef SIGNED_ZEROS + if (signbit_f2c(&x)) + sign = 2; +#endif + x = 0.; + } +#endif + } + + if (n = f__scale) + if (n > 0) + do x *= 10.; while(--n > 0); + else + do x *= 0.1; while(++n < 0); + +#ifdef USE_STRLEN + sprintf(b = buf, "%#.*f", d, x); + n = strlen(b) + d1; +#else + n = sprintf(b = buf, "%#.*f", d, x) + d1; +#endif + +#ifndef WANT_LEAD_0 + if (buf[0] == '0' && d) + { ++b; --n; } +#endif + if (sign == 1) { + /* check for all zeros */ + for(s = b;;) { + while(*s == '0') s++; + switch(*s) { + case '.': + s++; continue; + case 0: + sign = 0; + } + break; + } + } + if (sign || f__cplus) + ++n; + if (n > w) { +#ifdef WANT_LEAD_0 + if (buf[0] == '0' && --n == w) + ++b; + else +#endif + { + while(--w >= 0) + PUT('*'); + return 0; + } + } + for(w -= n; --w >= 0; ) + PUT(' '); + if (sign) + PUT('-'); + else if (f__cplus) + PUT('+'); + while(n = *b++) + PUT(n); + while(--d1 >= 0) + PUT('0'); + return 0; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/wref.o b/tools/connec/libf2c/wref.o new file mode 100644 index 0000000000000000000000000000000000000000..8e30cc682816d7dfc230290e98fcdc63e240338b GIT binary patch literal 5184 zcmbtYYfK#16~4nR58Gr18)qSXGyk4*)ket*Go}P1O zE?h5+8ntIN_wn6x&OPVcbI*)+AQY*~5(L6XAlu2}jG=@i3KqxJbXZM9;v@22d5_#A zH#RjW`t-i!T=D}s`NuY8*jrKxTuL%1DP@z!CHb8!m|9X=74tFrUh*yxfX2sPHN$ujz$#&82m5$T|hqs|BSSkY8Pd5=?d=k7B zjUPe_tQN>rNmD^74>{A{1?bkC`1E4{mrLn0AS!|A-V$5SYDtpEF<2;oy=*r6y+Pq0 z$*b%CoK&TJap*giWtolH;IF7$mnTq8pD*oS5j6Wg9HS93k4Xif*DJ}%Yl?Xva*UQk zLlvJzt=A9}M;fI9ar|9ya z_9kyqFN0>a5Zp*J#PLy?dKaCb(NK~%sWX&S*1r_`1mSxbkYe zC{s=4oHot*E$cT0aC2ZfwHBl>{-Mh0V@3CHP^@oS7Du+z6uorEvQX_}hB`}HD)k#! zvlGa!TF0l~fRsqi$;l76vNb5Z0%+N!qW{~gh9PrvWegpWkI(Ogr0TyfWd7<6$ZdIS zA55W4T!O@Y@5p*+Y4(aQ&H}e+Ohbz$XbgqZU&A5Plic+0po&n&F}&dmHSuBCiIxDU z7bizyh0SNhADx3st9`B{KMgGwiql|ZMxh7_e@j$J0c{0jvuF&0j&Smmu(?Cf=LK=l zfH}2A(Z2^nLR1fAbLEHP$rCX7FD3Y88WgC)MNSp|2xOGw7chW!AwExar#8V!QHv+R z;#3%BV0*;ukc3nZ9=(1JuH=(e;&wot!+ZKHfQj3F^3_cozV%3`@Hq>(hcbR0Ue^NtkH?u7jneQ;$${oKT#Z*tnoK z{cD;eCExOI2$7PF{w-|;$L+wd3`y0m{v7G8?>mbL##H1Cgy)_j!qEcZ!Tj93(^!@O zf5=%Ig_jwr@fDoPs`0Ho>8bG*o8B5<=}XzNFK{A9_EqS)LEmX1>t`!{6#&V;QeXjA z5UKIy$*ZbB{Gg+&1kM6=nW*a}kL)Wx;ROLbyWV#>+an7reWifOi^3>ZUt9ZlacR>5 ztxMI4AM2tim5CUvHz%9&Vjy*)In|Jn&nNJOmwIN*+S5#*zgO$ytIS z;30V~_zD*sUp!06Lsl&T@p_VF?6fUeYNxGXslWE;(^3!UR|x3mKCkGG-*EQL^lTl) zJtUv@i;V=sOdYto$py!hUyi@d1>XVq8t!~)&H~op!r$!hGd`M^fE{q*KjeZRcfpB2 zQX9ag44W<3Y{h09Hs#nnO4_5*!vZFWJs`eg^k+|BU zc6X2?J!&+B?5&48v^bsC;WXab(h(!k`pB*tITGDfSJx0~j5f+Okx&$s9`1RjOKnHB zglq*nk?{Jhg$LfNl=dJ9g!pQB82%=LK!`s855wO^5D0P1Qik6`5D0P1F^2E96O`hZ z6AW*2aJ*rdOAJ5C@fULV1rF!!{HF^ppdmom@%-f+&fEV32SaidU(GccCH*Q^Y+Ltcs+;n`|jazUQf&g*Ie+|T<}pB{9_k9$0?DSeywxCcevpD zUGM=H{1-0xh=XIdhC7!+rxc={{JB?gIG?xm9L~qTfx~^A{#FhbIlPy{v7WI!F&!N3 zx5-N zTeUO#YsLZ}8)SJ99*ku*JUl6wtUw7|1j5>ivh00~Ig9jdco5%$6OPv9+7rAZJhA;* zkAF$vIFql!k!Slb9c+Kr*SN^m>C$kfVl-T|o7~u45 zf7ZtVXJek#{}t^=+059Zo`54icierr, 110, "left off"); + } + else if(cursor > 0) { + if(f__recpos + cursor >= f__svic->icirlen) + err(f__elist->cierr, 110, "recend"); + if(f__hiwater <= f__recpos) + for(; cursor > 0; cursor--) + (*f__putn)(' '); + else if(f__hiwater <= f__recpos + cursor) { + cursor -= f__hiwater - f__recpos; + f__icptr += f__hiwater - f__recpos; + f__recpos = f__hiwater; + for(; cursor > 0; cursor--) + (*f__putn)(' '); + } + else { + f__icptr += cursor; + f__recpos += cursor; + } + } + return(0); + } + if (cursor > 0) { + if(f__hiwater <= f__recpos) + for(;cursor>0;cursor--) (*f__putn)(' '); + else if(f__hiwater <= f__recpos + cursor) { + cursor -= f__hiwater - f__recpos; + f__recpos = f__hiwater; + for(; cursor > 0; cursor--) + (*f__putn)(' '); + } + else { + f__recpos += cursor; + } + } + else if (cursor < 0) + { + if(cursor + f__recpos < 0) + err(f__elist->cierr,110,"left off"); + if(f__hiwater < f__recpos) + f__hiwater = f__recpos; + f__recpos += cursor; + } + return(0); +} + + static int +#ifdef KR_headers +wrt_Z(n,w,minlen,len) Uint *n; int w, minlen; ftnlen len; +#else +wrt_Z(Uint *n, int w, int minlen, ftnlen len) +#endif +{ + register char *s, *se; + register int i, w1; + static int one = 1; + static char hex[] = "0123456789ABCDEF"; + s = (char *)n; + --len; + if (*(char *)&one) { + /* little endian */ + se = s; + s += len; + i = -1; + } + else { + se = s + len; + i = 1; + } + for(;; s += i) + if (s == se || *s) + break; + w1 = (i*(se-s) << 1) + 1; + if (*s & 0xf0) + w1++; + if (w1 > w) + for(i = 0; i < w; i++) + (*f__putn)('*'); + else { + if ((minlen -= w1) > 0) + w1 += minlen; + while(--w >= w1) + (*f__putn)(' '); + while(--minlen >= 0) + (*f__putn)('0'); + if (!(*s & 0xf0)) { + (*f__putn)(hex[*s & 0xf]); + if (s == se) + return 0; + s += i; + } + for(;; s += i) { + (*f__putn)(hex[*s >> 4 & 0xf]); + (*f__putn)(hex[*s & 0xf]); + if (s == se) + break; + } + } + return 0; + } + + static int +#ifdef KR_headers +wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base; +#else +wrt_I(Uint *n, int w, ftnlen len, register int base) +#endif +{ int ndigit,sign,spare,i; + longint x; + char *ans; + if(len==sizeof(integer)) x=n->il; + else if(len == sizeof(char)) x = n->ic; +#ifdef Allow_TYQUAD + else if (len == sizeof(longint)) x = n->ili; +#endif + else x=n->is; + ans=f__icvt(x,&ndigit,&sign, base); + spare=w-ndigit; + if(sign || f__cplus) spare--; + if(spare<0) + for(i=0;iil; + else if(len == sizeof(char)) x = n->ic; +#ifdef Allow_TYQUAD + else if (len == sizeof(longint)) x = n->ili; +#endif + else x=n->is; + ans=f__icvt(x,&ndigit,&sign, base); + if(sign || f__cplus) xsign=1; + else xsign=0; + if(ndigit+xsign>w || m+xsign>w) + { for(i=0;i=m) + spare=w-ndigit-xsign; + else + spare=w-m-xsign; + for(i=0;iil; + else if(sz == sizeof(char)) x = n->ic; + else x=n->is; + for(i=0;i 0) (*f__putn)(*p++); + return(0); +} + static int +#ifdef KR_headers +wrt_AW(p,w,len) char * p; ftnlen len; +#else +wrt_AW(char * p, int w, ftnlen len) +#endif +{ + while(w>len) + { w--; + (*f__putn)(' '); + } + while(w-- > 0) + (*f__putn)(*p++); + return(0); +} + + static int +#ifdef KR_headers +wrt_G(p,w,d,e,len) ufloat *p; ftnlen len; +#else +wrt_G(ufloat *p, int w, int d, int e, ftnlen len) +#endif +{ double up = 1,x; + int i=0,oldscale,n,j; + x = len==sizeof(real)?p->pf:p->pd; + if(x < 0 ) x = -x; + if(x<.1) { + if (x != 0.) + return(wrt_E(p,w,d,e,len)); + i = 1; + goto have_i; + } + for(;i<=d;i++,up*=10) + { if(x>=up) continue; + have_i: + oldscale = f__scale; + f__scale = 0; + if(e==0) n=4; + else n=e+2; + i=wrt_F(p,w-n,d-i,len); + for(j=0;jop) + { + default: + fprintf(stderr,"w_ed, unexpected code: %d\n", p->op); + sig_die(f__fmtbuf, 1); + case I: return(wrt_I((Uint *)ptr,p->p1,len, 10)); + case IM: + return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,10)); + + /* O and OM don't work right for character, double, complex, */ + /* or doublecomplex, and they differ from Fortran 90 in */ + /* showing a minus sign for negative values. */ + + case O: return(wrt_I((Uint *)ptr, p->p1, len, 8)); + case OM: + return(wrt_IM((Uint *)ptr,p->p1,p->p2.i[0],len,8)); + case L: return(wrt_L((Uint *)ptr,p->p1, len)); + case A: return(wrt_A(ptr,len)); + case AW: + return(wrt_AW(ptr,p->p1,len)); + case D: + case E: + case EE: + return(wrt_E((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); + case G: + case GE: + return(wrt_G((ufloat *)ptr,p->p1,p->p2.i[0],p->p2.i[1],len)); + case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2.i[0],len)); + + /* Z and ZM assume 8-bit bytes. */ + + case Z: return(wrt_Z((Uint *)ptr,p->p1,0,len)); + case ZM: + return(wrt_Z((Uint *)ptr,p->p1,p->p2.i[0],len)); + } +} + + int +#ifdef KR_headers +w_ned(p) struct syl *p; +#else +w_ned(struct syl *p) +#endif +{ + switch(p->op) + { + default: fprintf(stderr,"w_ned, unexpected code: %d\n", p->op); + sig_die(f__fmtbuf, 1); + case SLASH: + return((*f__donewrec)()); + case T: f__cursor = p->p1-f__recpos - 1; + return(1); + case TL: f__cursor -= p->p1; + if(f__cursor < -f__recpos) /* TL1000, 1X */ + f__cursor = -f__recpos; + return(1); + case TR: + case X: + f__cursor += p->p1; + return(1); + case APOS: + return(wrt_AP(p->p2.s)); + case H: + return(wrt_H(p->p1,p->p2.s)); + } +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/wrtfmt.o b/tools/connec/libf2c/wrtfmt.o new file mode 100644 index 0000000000000000000000000000000000000000..15b2aae8c178dd16480cd86f7536563272a496cc GIT binary patch literal 10280 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 literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/wsfe.c b/tools/connec/libf2c/wsfe.c new file mode 100644 index 0000000..8709f3b --- /dev/null +++ b/tools/connec/libf2c/wsfe.c @@ -0,0 +1,78 @@ +/*write sequential formatted external*/ +#include "f2c.h" +#include "fio.h" +#include "fmt.h" +#ifdef __cplusplus +extern "C" { +#endif + + int +x_wSL(Void) +{ + int n = f__putbuf('\n'); + f__hiwater = f__recpos = f__cursor = 0; + return(n == 0); +} + + static int +xw_end(Void) +{ + int n; + + if(f__nonl) { + f__putbuf(n = 0); + fflush(f__cf); + } + else + n = f__putbuf('\n'); + f__hiwater = f__recpos = f__cursor = 0; + return n; +} + + static int +xw_rev(Void) +{ + int n = 0; + if(f__workdone) { + n = f__putbuf('\n'); + f__workdone = 0; + } + f__hiwater = f__recpos = f__cursor = 0; + return n; +} + +#ifdef KR_headers +integer s_wsfe(a) cilist *a; /*start*/ +#else +integer s_wsfe(cilist *a) /*start*/ +#endif +{ int n; + if(!f__init) f_init(); + f__reading=0; + f__sequential=1; + f__formatted=1; + f__external=1; + if(n=c_sfe(a)) return(n); + f__elist=a; + f__hiwater = f__cursor=f__recpos=0; + f__nonl = 0; + f__scale=0; + f__fmtbuf=a->cifmt; + f__cf=f__curunit->ufd; + if(pars_f(f__fmtbuf)<0) err(a->cierr,100,"startio"); + f__putn= x_putc; + f__doed= w_ed; + f__doned= w_ned; + f__doend=xw_end; + f__dorevert=xw_rev; + f__donewrec=x_wSL; + fmt_bg(); + f__cplus=0; + f__cblank=f__curunit->ublnk; + if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr,errno,"write start"); + return(0); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/wsfe.o b/tools/connec/libf2c/wsfe.o new file mode 100644 index 0000000000000000000000000000000000000000..1919a962bcc926c5531d7d4df707ebe1dfe4de2f GIT binary patch literal 4864 zcmbW4Uu+ab9LMKck@BytD2RZ1pdhF$t$;S5qy(}>z)P#%`+c8{Li?bf|Lu0SGa zA>q7~XySu0!SLdPzW5+9#6)O>z>}C5L!ycD!ULrGVxl3zSbyKy8Txa(LyW)6?#%Bq zzxmB?{@l#$;qKn;4VjG4k`bH5l%}Z=<1JJ9PMPf#^Tb?XkN(I_~t4oyx@+G88g_BjA)5Et!1k@6QiyQ4NX zW9)CLpe)B`wEas%13V-?WbyFY^_~u8p_ag5JJWLXCvqc$s(mBzvF}@sUW9A(XPzvv zU2)?JZKgU??~p|kzm%g~7!?9h4GWQ%l^S9pxi3yc=HM$LGt!z_GIwUvdo*$2OI6t> zq}!TX_cu3*MU-8y_zuO(vzwc`<_KB#k}7*$m5rz}_$sQh&#*AMnp;O38f;Z8M9j!=j>2M|Th3k~_9yG65C`Y2|c!SW&-kTNAj|w@m%oi)=A;5eo8mQ#S#*dB20d&I7 zz+N!|hc4{gN?7p=5we4UvUSOh8X2J&d^mNSY7p*2G4i388!Y&Hb&YE1x#X|f*9%g( z?JI899j1U#;0IM47q=^VzKq=+DCYcqFetmZBK&I){assnyB$FxhoK)h#lX$c@#Mp6J_t*>D57A7b79$$9iuLngHV*6 zDuz=Eu2vB2+&HWLqH`K@4^7Aqv zNz(uB7*F$`XPo;#pm;L=Bg`J{>UgmKK+rDE0v*rCfFwyjpTu}toS!q!$Kfl+d7R%W zp7j3%vwwi{di;N6_LvLJCz$=il-Ke9!8q;+y1#lWM1Qg0Xg-Jjj}UO2S(-0od@*K7(tIi7_&Cvgnc^7F1&ps^ z_REOt`CZ32pRdh~Kg#^{G5^aMFEP&N>!5+ZtvC|gLUsJdnLVG!EZIO%tcF(V9r8WJ zHz~b8!QWLn?qd+`=US}Nrd&QyigE*#Mq!)|>0Ia)b5=yBn6ScNkj@R*v|H_@qQo0= z@?oyz2@7Sy8Yq{Auwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr, errno, "list output start"); + return(0); + } + +integer e_wsle(Void) +{ + int n = f__putbuf('\n'); + f__recpos=0; +#ifdef ALWAYS_FLUSH + if (!n && fflush(f__cf)) + err(f__elist->cierr, errno, "write end"); +#endif + return(n); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/wsle.o b/tools/connec/libf2c/wsle.o new file mode 100644 index 0000000000000000000000000000000000000000..23fb3624de626a8aec2776f4ed8ac66650f14bce GIT binary patch literal 2776 zcmbuA-)kII6vxl*s@=wP8)N-h!KDwS7CP)|i=qBtlQhXtmZmi=_zT9#WY%oEI}>K^ zvQeRZSOSJ1=vy8H!3XulCtvy^ic$2%m*T7Mh582w74&@X+>@P7XAtze+_~p|?m74O zy?bM!y;v@lNK~R%XD|TK%t2gnnM>p(}I;MNw{z0RyTWZ=Ky+o>}sqN97vc3D(UQ+t# z48nG1bm`9T_UMo5cN0u>IW^o}d-P*}o z$(g!;Jm_(n$FJ9pZM{aEAL2B{DXYgA#1svBZZykOr;J-4*K8j>N$!gCx$ajWu&!>*#@U03=zB=g8CV&Uf z>xLUqs7-GW4T7$sw$t;qv%jhQC~$l5i+p#j8@vm1Ee!l&N%&Pj7I=-5 z@DBi4SRdS3;W&p7_*0yOe+J0P@-Gss+sA7o{$Cpo|0h!X+Z4z9EB9W#fto%YbidgWJTc`pEme3ttJ;y zUrfLRSHhHkf+vkL-d*tLO0k2KnTwrv z{X7rm_`)r__GsrT6MxfG;*R0pKD&Nk*|{^Kcd*#3-;!+qn;jP3&b;`B*}wJu$i&FT F{{zkhYheHY literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/wsne.c b/tools/connec/libf2c/wsne.c new file mode 100644 index 0000000..e204a51 --- /dev/null +++ b/tools/connec/libf2c/wsne.c @@ -0,0 +1,32 @@ +#include "f2c.h" +#include "fio.h" +#include "lio.h" +#ifdef __cplusplus +extern "C" { +#endif + + integer +#ifdef KR_headers +s_wsne(a) cilist *a; +#else +s_wsne(cilist *a) +#endif +{ + int n; + + if(n=c_le(a)) + return(n); + f__reading=0; + f__external=1; + f__formatted=1; + f__putn = x_putc; + L_len = LINE; + f__donewrec = x_wSL; + if(f__curunit->uwrt != 1 && f__nowwriting(f__curunit)) + err(a->cierr, errno, "namelist output start"); + x_wsne(a); + return e_wsle(); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/wsne.o b/tools/connec/libf2c/wsne.o new file mode 100644 index 0000000000000000000000000000000000000000..684278030c6875584b93eb8eb6caf7a0c496b928 GIT binary patch literal 2536 zcmbW2QA-q26vxl*R+^caMHKe15QGU1yQU;YwQA~MOI9ig5yR~6Y%cB2$jn{VdeB0G zL?WNUUV0Mh1M~rc9{LIqL@zxAeu1E%&VOcZUe_4{|I3|w&hMUc@0~mM-d!2bPb3ow zl1k83+VLbMdUt5Y&iQ7Jj#4|#=xe`zz<>6k?&zNm`c3=@O?0K2>wbW~7F0p_EyV0@ zSigdP^wkwTA^OAa#RYx!GKmh~)r+*9)Hm;a47?YEh+iM_z3s31+Be?{+%L9Sv#J$O zq@B80tc$cKOjjU*buy?Z@%RoUmO2yN?JcbvJnOT}QJ^h6MmjoIlgZ__j@FSQ@F&N{ zhSNQBg}N>3=}X$6mg&1#_r2_Lc1X(%TnH#)|D#moiW8;y7o`*(h{7DLd?Y0zMJ7 zlsBrD4PY$^%eBoaY}YbN75f3ql4Dy9*D9jJnLHIa9N2am4Ywi?!pEYJjM)Tta@c^!CJ4V$hnxf+PLzW%4W(r}I_)Uo91%e%Zg3Iqef#lvu zGK2jyB@yEGHJ`czO$JvlPcx&=cG|q2_?IC^{3(UM zRya<(jDMr>Hif4{j`;_7K?pSOQB9Zy(mde?^@6lqt7>Y3w-jlvQ{rubn5>p%7cJI; zQFi%iCJk+*6+Dl$qEo9`HfPw5u(ZjWbA5bU7axX$?Y~NMD(2mML*|%4TS4{jx$7O7 zVxM6Rb6iwy0J1j21gsfMd9&i%LD-Mr{cse04{dxKRdRe;4|5}Itp6^B0doJ!HaWiZ z@dp_-|DJF`cifmt; + PUT('&'); + for(s = nl->name; *s; s++) + PUT(*s); + PUT(' '); + f__Aquote = 1; + vd = nl->vars; + vde = vd + nl->nvars; + while(vd < vde) { + v = *vd++; + s = v->name; +#ifdef No_Extra_Namelist_Newlines + if (f__recpos+strlen(s)+2 >= L_len) +#endif + nl_donewrec(); + while(*s) + PUT(*s++); + PUT(' '); + PUT('='); + number = (dims = v->dims) ? dims[1] : 1; + type = v->type; + if (type < 0) { + size = -type; + type = TYCHAR; + } + else + size = f__typesize[type]; + l_write(&number, v->addr, size, type); + if (vd < vde) { + if (f__recpos+2 >= L_len) + nl_donewrec(); + PUT(','); + PUT(' '); + } + else if (f__recpos+1 >= L_len) + nl_donewrec(); + } + f__Aquote = 0; + PUT('/'); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/xwsne.o b/tools/connec/libf2c/xwsne.o new file mode 100644 index 0000000000000000000000000000000000000000..55d8c96ad955f3079449681407bcb97d2eee45cd GIT binary patch literal 2600 zcmbuA&2JM&6u@U=lWa-4b`eEZ>A|W}Fjuyq7WepIZfI#K?zCpwDlxYlcbOI5?X(%x^E(A#^L6vw0>XRHqIGmjhr!) zn+BWMJaxkFCcuI=#`@L4E$WnG%|mSuXO=|1A4z`Z+6R)6pIi}VTk&Y^u@wI2J>bWx z%sQ4z3+d?O#*zDzr=CXYk72=R;s!E}zn&bT&wi(kU+=vJ^GCPg);t2YUFBw=+>BG~ z-=R=N>#*y(q7+)+R@&usD5d$~i-6S0MYD|^dh0hkOr4ZU8{vLhn2ga|zeH|VAt>Eo zbyH{mL+aGjY~xuAoXO;=Kd-#wu%-G|7u}>IOpn}|0-x4b|G4g>G-$#?d13MCkk<$d z(mVz?-ZTdqJWr2%?XDewhY`ClYg{yDjZ22P-TDY3K6$`WgU^2S22rkkLX`EWaE$Xhs$Y0;df5(?@N=U-!=Q(E+ku9OzL8%k;Mjc`g!+}UGj1D|&r+Hk#R zO#3)=L)ohh12VJ(n1Cs`q%_s&B@?5gAH);6xmwAt#ZT%d^ns(tYiu@nV{lj>7<$j6 zJYUcd>Ud%a3Bj+Egb3^KuB8y^-o+4vh;;ZRix5$znWth)_CY=Y*xz^4QFQUE9G=32F6kp zu2q&GEEn;lx?uh~T+iVZL3x9(BgdW#J{rK!2k_MZensN=S=sT@y5C7$&bt-BTLJv< z0N#xU3&g)KUE;m4F7|tx^Dr=c{(@&DdrjgwiT6o-S>m$&n#5)Mn-Z7%b64VWf9`RP zb?%k&#z9BH{c;mFA7=M97w;L-t5;X-{2YvS#TyreRtPl7MT6m^2iMC3m#03StuF=l`ZT{ivZ73)XePNv^- sxXFX#JAnT-{{D%+%DGWb^5=iqx8Sc8zl;9fq02-5{KR)qgz@|T3rjJlk^lez literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/z_abs.c b/tools/connec/libf2c/z_abs.c new file mode 100644 index 0000000..4d8a015 --- /dev/null +++ b/tools/connec/libf2c/z_abs.c @@ -0,0 +1,18 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +double f__cabs(); +double z_abs(z) doublecomplex *z; +#else +double f__cabs(double, double); +double z_abs(doublecomplex *z) +#endif +{ +return( f__cabs( z->r, z->i ) ); +} +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_abs.o b/tools/connec/libf2c/z_abs.o new file mode 100644 index 0000000000000000000000000000000000000000..31111f02681d542fac801681ac50dca30b38b4f6 GIT binary patch literal 1376 zcmb_bJ4*vW5S}w?;)57PP|)HU#Ro1C4T^$XjClybfDh2>yu=HFUIMubsD&13Ed3eQ zR`&V>{23`M#9Gjq%dT0Mi-kDhc4oerZ)SIPbCb?zx-<=hXs`ioPoMzDU2WU&O#=pD z0CJ7j$oo*NKufqufn4J`@&u!P4uE#G3))3Yn-~m7?yxZ7lRP#?dMg^+jYa^nsnnW2 zb5N{Tyt=-^5-h&3RQJ8b>%~v~W;S2gOy3CKVnCsPA`czmo``lulec=J~P5aa=*DS{dc4B!Ju%hb%D^(rG zu3$=~>e(#2bFkogR_V-d_798B_p9E7!E1|oa`)%i5S+k|W?|qb%L^aEI0ySs6C`d> z;PV`pp1;pH^jCm5*Fp)t@TbuT>fa3LPp?z(MgIh1l&ZemTf~Bdm;DZ{qeV6U$~TZp zHPv&9{&N_UMf4YX8-v1@^B!bJvejJj)!9?}Bj>zv-H)37Q|kQaUe&V`<(@a1B1aOn R|1ida_+nE>5|>Ps{{<+kRO$c# literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/z_cos.c b/tools/connec/libf2c/z_cos.c new file mode 100644 index 0000000..4abe8bf --- /dev/null +++ b/tools/connec/libf2c/z_cos.c @@ -0,0 +1,21 @@ +#include "f2c.h" + +#ifdef KR_headers +double sin(), cos(), sinh(), cosh(); +VOID z_cos(r, z) doublecomplex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +void z_cos(doublecomplex *r, doublecomplex *z) +#endif +{ + double zi = z->i, zr = z->r; + r->r = cos(zr) * cosh(zi); + r->i = - sin(zr) * sinh(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_cos.o b/tools/connec/libf2c/z_cos.o new file mode 100644 index 0000000000000000000000000000000000000000..f8d192f498f44a802356486c3ca6a33dad3c850c GIT binary patch literal 1768 zcmbu8UuzRV5Wwe>Vxy+Xr4$UbLLN?uLYIWre|?Zk(Q@RKZXxJNS_s*$?e+pa_56ixXjFNXLjc1c3+pO<%pty5Cv|+i6g1;CTFiJ? z*U|`PG`_UAp;2OqqBu0hOB#A{t(DxJ^ETK!!kF7JWArI||G~#e6XNfUFc!F>4DW)n zuPTf2+1MezkcNDTuMJ5T66)JXA(0+MHxhc}c_NLVkcdI0SX|3wYmGtI9b~StD=fFX zGMISzSNZEKw|dE=e6PQ$Xy7CPqWBAvD9i+5j6M~@XG3@_grA<`-nX9ahbpR5(Ew*d z_^W_4o^(-@YQxYZ)2vjt)(cg0t6bhL?U*}-^=iq) zjZiLlYBIqyXn+6di7s(^d%jcHZWQO)^HqP&0eQtcQK*cb8S}HtSvjP)qKi} z|A(Ufsc-*D(vgvf@8Wr0tguNh;zOrX$48bU8WhUI$v*(ip6ZAbnCAQ<=X6eF`M@3j zSrfj{H!zO&<>h!5z-Mmhzlmpv`U0<_5!8Q{AAQj$^-pmkU+^L_s_(xkD!~Bp<69U* zd;V+wCg#$fIecUh^)Jg1ZBbw7U5Uw|Ya&2~0kIV3pFO4MJpT^YbeHI!`R7N>|L%z3 ZkZ-y|jwJrJQn(hBuXFfV$|cjE{|oJUmpA|b literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/z_div.c b/tools/connec/libf2c/z_div.c new file mode 100644 index 0000000..e45f360 --- /dev/null +++ b/tools/connec/libf2c/z_div.c @@ -0,0 +1,50 @@ +#include "f2c.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef KR_headers +extern VOID sig_die(); +VOID z_div(c, a, b) doublecomplex *a, *b, *c; +#else +extern void sig_die(const char*, int); +void z_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) +#endif +{ + double ratio, den; + double abr, abi, cr; + + if( (abr = b->r) < 0.) + abr = - abr; + if( (abi = b->i) < 0.) + abi = - abi; + if( abr <= abi ) + { + if(abi == 0) { +#ifdef IEEE_COMPLEX_DIVIDE + if (a->i != 0 || a->r != 0) + abi = 1.; + c->i = c->r = abi / abr; + return; +#else + sig_die("complex division by zero", 1); +#endif + } + ratio = b->r / b->i ; + den = b->i * (1 + ratio*ratio); + cr = (a->r*ratio + a->i) / den; + c->i = (a->i*ratio - a->r) / den; + } + + else + { + ratio = b->i / b->r ; + den = b->r * (1 + ratio*ratio); + cr = (a->r + a->i*ratio) / den; + c->i = (a->i - a->r*ratio) / den; + } + c->r = cr; + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_div.o b/tools/connec/libf2c/z_div.o new file mode 100644 index 0000000000000000000000000000000000000000..765cb3ce8a8d415c9c35949b9c194174177031a9 GIT binary patch literal 2312 zcmbtUPfrs;6rXlcE8uP+nqbhRF~n3OlNLnLMD4aI)TD|L2oQ@+3tOqumUI^aHBlo* zg3*Md7ZWcg9Q6wr1P>@4Ot>JQKu(%Q6Av1EZ+FH{x5b0Lrt{wW&HFcR-t66Qw9Dym z5Kazqo|H6>5)#=}k^`m~APSL*+SlJ3ng4Zh{##^zy{NbwQ_7d6l;Yh?DRfzxdjzI{ zhFk!@187y5djJp^tb(?t+<#_jbRUK+IE~w;F)Vdp@~Nm?-vADAhu}YW0F6NYSX32v zOAD^i7KrS93*ZVEya9)0kk^Vz>;uT}i%P>K7c60NZCH)1q?Ccf7-K8Fy}fPKFkoih z$^q~i&mDPk4lO?8VxnkXX zG85z4v}ZIumDba_tS33+DQNi|=BuQy7Z`Sr@9k%Tqi~ftrrnO_`aP}%DEtKAhuEGE z4-%B!kDaRA^iWb|&uoqJMXlVV%I=`-QtQyJI}|$W@%AStv&N+7H0_|i*7iwL^WX7z zQs2pA7RqA&jY(A}h7bvU)kq>W)nKp|hD@-K$ZkO^i4t*@6hV^6UO_8~5~(dIf+P{M zBLYI$i7M-~DygZ+Y(=Q7-)%;%>;ulSwO5vw;CxoY+W~JB`fT1Yy3%OKhf6yyeq7p! zp1u(uO=~3H9qkFK(Rfc+S8up4-lqnm;W#P4-W0kbMJz^~z_B|&VMdWM0*+_n_$vXg z7x3jB@O1&lr^e%KFdRE93;1`2V?APCkARnbpQt{QF%n5abt7-_F)rn`@dP!rX@k&w zZZu&e(8f=pNlYEljZRVVp8^e?w6S<9pU7y0q8p(}T_+TtZbr*Oux!rIX!qs*R^3R9 z++v0OC&TmMx$Ki301WBReOsz92^P={40{={)Y8gEc#$D^XPAe-oF;}JWq2FYIh$b3 zKF9&a`5kcH0XWKyHoFC8V4rE8pYz}j{?B*t=kYl2XZ|=hBE4k(5fKEL=jHGf5UTZW zk@b)F3Hyh4#QixQ2Mkl$U-}Q0AGXTK4r{QBG5^*7Cir4ZAN)n)`Hzbr$UHyix`2tM zN9+w{o7|7vqF&9^%fP410lxwG-tGOvFSh;c0FfmIoi; + + expx = exp(z->r); + r->r = expx * cos(zi); + r->i = expx * sin(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_exp.o b/tools/connec/libf2c/z_exp.o new file mode 100644 index 0000000000000000000000000000000000000000..6b13b29ee370f15d64a628254f521316fd2847f5 GIT binary patch literal 1512 zcmbtTPiqrV5T8xdu5DO1(!)YMu_dC7T`2< zrdyF}K@R4ix$TU<6`iA>&e0F&_>E~e$Dyfzzou8zQwl?^L3V!LM0M9RP~A0E3IG|9 zL)Xq%bj%@ck~3dco$;6A)4k90Q7-`H@G&SOU0KM@s2_1a6ZsqLYZ2O-{yt-C#yGpF zS(zuAfrPE8P%D>L3dLr7*b9e+`(jy?7Vi!tYw7LM15vtnYr=A^zd<&2GXPoqrAZbp zr_mUFWePttg;y`|bVm9G7JwqJ$L4Ht%q(JByf%f0;6<;~58%-CM+e~6>RTIj-QB8I zw<`^|VQv z#VFz2w;{QJf7*qG|F~HEu1ZYOt|(WYxWW7#=3~z=@_b^y#VA4MOZz4&Y5fnlpzK5a z={C!J$uA>Eb0u&3336$Y{Qgx8qMHAjZ(%OglzT!ok`u<;j1pvji4V~sbs0lAn?|O@ wQdn~Ll&^EX%1G~w-a&GIa<7yV7lVtMaT4|9Sb5} s0" that +was used below being carried out incorrectly. The fix below cannot be +spoiled by overzealous optimization, since the compiler cannot know +whether gcc_bug_bypass_diff_F2C will be nonzero. (We expect it always +to be zero. The weird name is unlikely to collide with anything.) + +An example (provided by Ulrich Jakobus) where the bug fix matters is + + double complex a, b + a = (.1099557428756427618354862829619, .9857360542953131909982289471372) + b = log(a) + +An alternative to the fix below would be to use 53-bit rounding precision, +but the means of specifying this 80x87 feature are highly unportable. +#endif /*Comment*/ +#define BYPASS_GCC_COMPARE_BUG +double (*gcc_bug_bypass_diff_F2C) ANSI((double*,double*)); + static double +#ifdef KR_headers +diff1(a,b) double *a, *b; +#else +diff1(double *a, double *b) +#endif +{ return *a - *b; } +#endif /*Pre20000310*/ +#endif /*GCC_COMPARE_BUG_FIXED*/ +#endif /*NO_DOUBLE_EXTENDED*/ + +#ifdef KR_headers +VOID z_log(r, z) doublecomplex *r, *z; +#else +void z_log(doublecomplex *r, doublecomplex *z) +#endif +{ + double s, s0, t, t2, u, v; + double zi = z->i, zr = z->r; +#ifdef BYPASS_GCC_COMPARE_BUG + double (*diff) ANSI((double*,double*)); +#endif + + r->i = atan2(zi, zr); +#ifdef Pre20000310 + r->r = log( f__cabs( zr, zi ) ); +#else + if (zi < 0) + zi = -zi; + if (zr < 0) + zr = -zr; + if (zr < zi) { + t = zi; + zi = zr; + zr = t; + } + t = zi/zr; + s = zr * sqrt(1 + t*t); + /* now s = f__cabs(zi,zr), and zr = |zr| >= |zi| = zi */ + if ((t = s - 1) < 0) + t = -t; + if (t > .01) + r->r = log(s); + else { + +#ifdef Comment + + log(1+x) = x - x^2/2 + x^3/3 - x^4/4 + - ... + + = x(1 - x/2 + x^2/3 -+...) + + [sqrt(y^2 + z^2) - 1] * [sqrt(y^2 + z^2) + 1] = y^2 + z^2 - 1, so + + sqrt(y^2 + z^2) - 1 = (y^2 + z^2 - 1) / [sqrt(y^2 + z^2) + 1] + +#endif /*Comment*/ + +#ifdef BYPASS_GCC_COMPARE_BUG + if (!(diff = gcc_bug_bypass_diff_F2C)) + diff = diff1; +#endif + t = ((zr*zr - 1.) + zi*zi) / (s + 1); + t2 = t*t; + s = 1. - 0.5*t; + u = v = 1; + do { + s0 = s; + u *= t2; + v += 2; + s += u/v - t*u/(v+1); + } +#ifdef BYPASS_GCC_COMPARE_BUG + while(s - s0 > 1e-18 || (*diff)(&s,&s0) > 0.); +#else + while(s > s0); +#endif + r->r = s*t; + } +#endif + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_log.o b/tools/connec/libf2c/z_log.o new file mode 100644 index 0000000000000000000000000000000000000000..9c486181700c37542b5af7417c8ffc15728fb5f8 GIT binary patch literal 3032 zcmbtV-)~b@96#MHtg@}QMNAe!UE;+Q&2HNLz{N~lS-ahbMsRF0U~uivjnHk--r<-; zjYAtkmKYw0k3Jh?_yc?ZK{CX|FnlmECc`Hejn4W&Ow{@Lo_kJqxNX(MZ*$N2en02? z`~2uz$<$Dj&&MSB*gm!?NtChiz$QPy*#Q=0ZLF$?nydQ6)*EAoti_)!>*Aj|>ym$W z1S;0WgwYqf292`;4Ew5jxZfz~k*~lwMgZKcAIKBLB&1)i6?8LU1oXPe8cG01C6Je!>s-2;z-zaoxVM&Lf53>o%;G^~z<}Rl*2Clhnfr zBZ5ShQ9>ITL3IVHclF8{o`lI!y>c3ob?FIGvEKdGTH4~@*x0c2#5V}uN?~t<;mh!J z2mB~ybYum|e1Y!wSjC4%w1a!mjUD+7)(;8za9*2zNIy58f&h>2+&xd0WLf8@Uq6XJq$oXD?zn+ZWTE7S)~>( zXslfY!Ml1I>+s-@aam)uH!3~Oh1v?9;&^R;jso}QLaIgsd=Kz2t8T~+$vNIYf209E z4tzVhBsF9U^`ZDncCfCJH&=Q)>e;V~{rfljzX1&J)%O4Z literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/z_sin.c b/tools/connec/libf2c/z_sin.c new file mode 100644 index 0000000..01225a9 --- /dev/null +++ b/tools/connec/libf2c/z_sin.c @@ -0,0 +1,21 @@ +#include "f2c.h" + +#ifdef KR_headers +double sin(), cos(), sinh(), cosh(); +VOID z_sin(r, z) doublecomplex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +void z_sin(doublecomplex *r, doublecomplex *z) +#endif +{ + double zi = z->i, zr = z->r; + r->r = sin(zr) * cosh(zi); + r->i = cos(zr) * sinh(zi); + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_sin.o b/tools/connec/libf2c/z_sin.o new file mode 100644 index 0000000000000000000000000000000000000000..9b61ec23daccc95176eeb5702f44e13f04efc152 GIT binary patch literal 1584 zcmb`G&ui3B5XUDQwNdLfDISXTkVBMJ=_92Ui-KgkzaoSd?DkM>3E4HW((bNovQUfY zVNX32{BwHOKfpi3gNM?qg3e^$&}^DT5Wmap%=<9&CU0Kyspi!SiUKSJp2Nk8DS)kB z#7+`AFbg+f%N_l&-Q%C`@!9#DzM-AZ8J?xNCm*bmdlFkFLikSk7&K{VG%X$DU8{ug zuC;)1)zW0jPL+V6W+7G>70n%ewO@Tnn#1j}1Lf!?D2KYTI6I?##s|NPoQyP}zj9F@ z6{pRF0Tpu@q;m?+P_H6ofLqIzdWgM zH4kIlcSYE8dcUiWG~?r{%|bOnu0@$2_kEf+*tG(U_YUlL}}P@2iO3 zcjKT1B8mrN-{EKw9t0u|4`UEX7v|pyybH8YzP<8Xci7yTJLBOD4rwDisr&^3f&*+5gKusPAJi- z^lQ?y<9c4-#~`o&soaqJP=ERgxSshcGU}iGLe7xoY2t1%;Tan3`LFd3*3zCfT3X!y zVH#r0{n@`rv2^MkPDsO?TuRH%o=Qwv&;AB7`VO-5~;Qp(o<0by;1FaQ7m literal 0 HcmV?d00001 diff --git a/tools/connec/libf2c/z_sqrt.c b/tools/connec/libf2c/z_sqrt.c new file mode 100644 index 0000000..35bd44c --- /dev/null +++ b/tools/connec/libf2c/z_sqrt.c @@ -0,0 +1,35 @@ +#include "f2c.h" + +#ifdef KR_headers +double sqrt(), f__cabs(); +VOID z_sqrt(r, z) doublecomplex *r, *z; +#else +#undef abs +#include "math.h" +#ifdef __cplusplus +extern "C" { +#endif +extern double f__cabs(double, double); +void z_sqrt(doublecomplex *r, doublecomplex *z) +#endif +{ + double mag, zi = z->i, zr = z->r; + + if( (mag = f__cabs(zr, zi)) == 0.) + r->r = r->i = 0.; + else if(zr > 0) + { + r->r = sqrt(0.5 * (mag + zr) ); + r->i = zi / r->r / 2; + } + else + { + r->i = sqrt(0.5 * (mag - zr) ); + if(zi < 0) + r->i = - r->i; + r->r = zi / r->i / 2; + } + } +#ifdef __cplusplus +} +#endif diff --git a/tools/connec/libf2c/z_sqrt.o b/tools/connec/libf2c/z_sqrt.o new file mode 100644 index 0000000000000000000000000000000000000000..f0a1b35ad82d3fbc48804c0276512a90fa822cea GIT binary patch literal 2200 zcmbtU%}*0i5TABYDnhp<#597DXk);@rWH}5iFPTJHE93^{0Pd@mNq0<(C#A00ZB-V zob;$Sk9zkHP$2t*?lYJ`x61B*D9d+ikiMV(XF-#ffA6PnN9{cp!psX%ZEc2Hx2q&k<*cx@ z`_|6)SzGJCbfFsT@D^*Cn%JVsf^1(E3{qFP-NY2%(hcw}hJ4NSwSgCS;BAPvFkdZQ zfEo-v^{c_is?-;Z`JdMXBZ#QMfO-^QAep?>+BTM*pEc)OFDl(itg~z0vf|6}9wm0Z z-9}lyYK!D~(*P3wyhMT;FBqeR$00;WP%BuDDnY<81Wke?g5{_Z)Hw#z>^FL_&%>7g zUJ&lDks9c@Cf3K!ns*@h1kg|@t~xWF`D8uor8j|=Q3FXmUQD`$pn2M zJ=CkF^`TU1q<>T&ReRI@I;MhCG@($(4LJ7x*m9OY6h96+EskF%5XFsOvtbLTQ{?dr zRq$5~r@Hk*{F^HAU#j3=8Sc)rC&bg8@P1kayyE+#7>|o)CJTyTmh5$!Yo+}CjAG^& zO;Ad6QyDX(wz~ES?VPahQ#InD0-hHXK)bSNQNL9 zE98FLoX^)TFdM!93MuE zO1Zxf?^u0wRfrqDiC)V2ul#Z3QqC9-QFwj+KjuDOpRZHs;5v_?^@|ti5ldn2vnT#G pX0+&=b|1WE&{+Iv& literal 0 HcmV?d00001 diff --git a/tools/connec/makefile b/tools/connec/makefile deleted file mode 100755 index 14450d8..0000000 --- a/tools/connec/makefile +++ /dev/null @@ -1,9 +0,0 @@ -F90:= gfortran -all: conec2d conec3d -conec2d: CONNEC2D.FOR - $(F90) -O3 -o conec2d CONNEC2D.FOR -conec3d: CONNEC3D.FOR - $(F90) -O3 -o conec3d CONNEC3D.FOR -clean: - -rm -f conec2d conec3d - diff --git a/tools/connec/src/Notice b/tools/connec/src/Notice new file mode 100644 index 0000000..261b719 --- /dev/null +++ b/tools/connec/src/Notice @@ -0,0 +1,23 @@ +/**************************************************************** +Copyright 1990 - 1997 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + diff --git a/tools/connec/src/README b/tools/connec/src/README new file mode 100644 index 0000000..1416f52 --- /dev/null +++ b/tools/connec/src/README @@ -0,0 +1,186 @@ +To compile f2c on Linux or Unix systems, copy makefile.u to makefile, +edit makefile if necessary (see the comments in it and below) and +type "make" (or maybe "nmake", depending on your system). + +To compile f2c.exe on MS Windows systems with Microsoft Visual C++, + + copy makefile.vc makefile + nmake + +With other PC compilers, you may need to compile xsum.c with -DMSDOS +(i.e., with MSDOS #defined). + +If your compiler does not understand ANSI/ISO C syntax (i.e., if +you have a K&R C compiler), compile with -DKR_headers . + +On non-Unix systems where files have separate binary and text modes, +you may need to "make xsumr.out" rather than "make xsum.out". + +If (in accordance with what follows) you need to any of the source +files (excluding the makefile), first issue a "make xsum.out" (or, if +appropriate, "make xsumr.out") to check the validity of the f2c source, +then make your changes, then type "make f2c". + +The file usignal.h is for the benefit of strictly ANSI include files +on a UNIX system -- the ANSI signal.h does not define SIGHUP or SIGQUIT. +You may need to modify usignal.h if you are not running f2c on a UNIX +system. + +Should you get the message "xsum0.out xsum1.out differ", see what lines +are different (`diff xsum0.out xsum1.out`) and ask netlib +(e.g., netlib@netlib.org) to send you the files in question, +plus the current xsum0.out (which may have changed) "from f2c/src". +For example, if exec.c and expr.c have incorrect check sums, you would +send netlib the message + send exec.c expr.c xsum0.out from f2c/src +You can also ftp these files from netlib.bell-labs.com; for more +details, ask netlib@netlib.org to "send readme from f2c". + +On some systems, the malloc and free in malloc.c let f2c run faster +than do the standard malloc and free. Other systems may not tolerate +redefinition of malloc and free (though changes of 8 Nov. 1994 may +render this less of a problem than hitherto). If your system permits +use of a user-supplied malloc, you may wish to change the MALLOC = +line in the makefile to "MALLOC = malloc.o", or to type + make MALLOC=malloc.o +instead of + make +Still other systems have a -lmalloc that provides performance +competitive with that from malloc.c; you may wish to compare the two +on your system. If your system does not permit user-supplied malloc +routines, then f2c may fault with "MALLOC=malloc.o", or may display +other untoward behavior. + +On some BSD systems, you may need to create a file named "string.h" +whose single line is +#include +you may need to add " -Dstrchr=index" to the "CFLAGS =" assignment +in the makefile, and you may need to add " memset.o" to the "OBJECTS =" +assignment in the makefile -- see the comments in memset.c . + +For non-UNIX systems, you may need to change some things in sysdep.c, +such as the choice of intermediate file names. + +On some systems, you may need to modify parts of sysdep.h (which is +included by defs.h). In particular, for Sun 4.1 systems and perhaps +some others, you need to comment out the typedef of size_t. For some +systems (e.g., IRIX 4.0.1 and AIX) it is better to add +#define ANSI_Libraries +to the beginning of sysdep.h (or to supply -DANSI_Libraries in the +makefile). + +Alas, some systems #define __STDC__ but do not provide a true standard +(ANSI or ISO) C environment, e.g. do not provide stdlib.h . If yours +is such a system, then (a) you should complain loudly to your vendor +about __STDC__ being erroneously defined, and (b) you should insert +#undef __STDC__ +at the beginning of sysdep.h . You may need to make other adjustments. + +For some non-ANSI versions of stdio, you must change the values given +to binread and binwrite in sysdep.c from "rb" and "wb" to "r" and "w". +You may need to make this change if you run f2c and get an error +message of the form + Compiler error ... cannot open intermediate file ... + +In the days of yore, two libraries, libF77 and libI77, were used with +f77 (the Fortran compiler on which f2c is based). Separate source for +these libraries is still available from netlib, but it is more +convenient to combine them into a single library, libf2c. Source for +this combined library is also available from netlib in f2c/libf2c.zip, +e.g., + http://netlib.bell-labs.com/netlib/f2c/libf2c.zip +or + http://www.netlib.org/f2c/libf2c.zip + +(and similarly for other netlib mirrors). After unzipping libf2c.zip, +copy the relevant makefile.* to makefile, edit makefile if necessary +(see the comments in it and in libf2c/README) and invoke "make" or +"nmake". The resulting library is called *f2c.lib on MS Windows +systems and libf2c.a or libf2c.so on Linux and Unix systems; +makefile.u just shows how to make libf2c.a. Details on creating the +shared-library variant, libf2c.so, are system-dependent; some that +have worked under Linux appear below. For some other systems, you can +glean the details from the system-dependent makefile variants in +directory http://www.netlib.org/ampl/solvers/funclink or +http://netlib.bell-labs.com/netlib/ampl/solvers/funclink, etc. + +In general, under Linux it is necessary to compile libf2c (or libI77) +with -DNON_UNIX_STDIO . Under at least one variant of Linux, you can +make and install a shared-library version of libf2c by compiling +libI77 with -DNON_UNIX_STDIO, creating libf2c.a as above, and then +executing + + mkdir t + ln lib?77/*.o t + cd t; cc -shared -o ../libf2c.so -Wl,-soname,libf2c.so.1 *.o + cd .. + rm -r t + rm /usr/lib/libf2c* + mv libf2c.a libf2c.so /usr/lib + cd /usr/lib + ln libf2c.so libf2c.so.1 + ln libf2c.so libf2c.so.1.0.0 + +On some other systems, /usr/local/lib is the appropriate installation +directory. + + +Some older C compilers object to + typedef void (*foo)(); +or to + typedef void zap; + zap (*foo)(); +If yours is such a compiler, change the definition of VOID in +f2c.h from void to int. + +For convenience with systems that use control-Z to denote end-of-file, +f2c treats control-Z characters (ASCII 26, '\x1a') that appear at the +beginning of a line as an end-of-file indicator. You can disable this +test by compiling lex.c with NO_EOF_CHAR_CHECK #defined, or can +change control-Z to some other character by #defining EOF_CHAR to +be the desired value. + + +If your machine has IEEE, VAX, or IBM-mainframe arithmetic, but your +printf is inaccurate (e.g., with Symantec C++ version 6.0, +printf("%.17g",12.) prints 12.000000000000001), you can make f2c print +correctly rounded numbers by compiling with -DUSE_DTOA and adding +dtoa.o g_fmt.o to the makefile's OBJECTS = line, so it becomes + + OBJECTS = $(OBJECTSd) malloc.o dtoa.o g_fmt.o + +Also add the rule + + dtoa.o: dtoa.c + $(CC) -c $(CFLAGS) -DMALLOC=ckalloc -DIEEE... dtoa.c + +(without the initial tab) to the makefile, where IEEE... is one of +IEEE_MC68k, IEEE_8087, VAX, or IBM, depending on your machine's +arithmetic. See the comments near the start of dtoa.c. + +The relevant source files, dtoa.c and g_fmt.c, are available +separately from netlib's fp directory. For example, you could +send the E-mail message + + send dtoa.c g_fmt.c from fp + +to netlib@netlib.netlib.org (or use anonymous ftp from +ftp.netlib.org and look in directory /netlib/fp). + +The makefile has a rule for creating tokdefs.h. If you cannot use the +makefile, an alternative is to extract tokdefs.h from the beginning of +gram.c: it's the first 100 lines. + +File mem.c has #ifdef CRAY lines that are appropriate for machines +with the conventional CRAY architecture, but not for "Cray" machines +based on DEC Alpha chips, such as the T3E; on such machines, you may +need to make a suitable adjustment, e.g., add #undef CRAY to sysdep.h. + + +Please send bug reports to dmg at acm.org (with " at " changed to "@"). +The old index file (now called "readme" due to unfortunate changes in +netlib conventions: "send readme from f2c") will report recent +changes in the recent-change log at its end; all changes will be shown +in the "changes" file ("send changes from f2c"). To keep current +source, you will need to request xsum0.out and version.c, in addition +to the changed source files. diff --git a/tools/connec/src/cds.c b/tools/connec/src/cds.c new file mode 100644 index 0000000..05f3d50 --- /dev/null +++ b/tools/connec/src/cds.c @@ -0,0 +1,195 @@ +/**************************************************************** +Copyright 1990, 1993, 1994, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +/* Put strings representing decimal floating-point numbers + * into canonical form: always have a decimal point or + * exponent field; if using an exponent field, have the + * number before it start with a digit and decimal point + * (if the number has more than one digit); only have an + * exponent field if it saves space. + * + * Arrange that the return value, rv, satisfies rv[0] == '-' || rv[-1] == '-' . + */ + +#include "defs.h" + + char * +#ifdef KR_headers +cds(s, z0) + char *s; + char *z0; +#else +cds(char *s, char *z0) +#endif +{ + int ea, esign, et, i, k, nd = 0, sign = 0, tz; + char c, *z; + char ebuf[24]; + long ex = 0; + static char etype[Table_size], *db; + static int dblen = 64; + + if (!db) { + etype['E'] = 1; + etype['e'] = 1; + etype['D'] = 1; + etype['d'] = 1; + etype['+'] = 2; + etype['-'] = 3; + db = Alloc(dblen); + } + + while((c = *s++) == '0'); + if (c == '-') + { sign = 1; c = *s++; } + else if (c == '+') + c = *s++; + k = strlen(s) + 2; + if (k >= dblen) { + do dblen <<= 1; + while(k >= dblen); + free(db); + db = Alloc(dblen); + } + if (etype[(unsigned char)c] >= 2) + while(c == '0') c = *s++; + tz = 0; + while(c >= '0' && c <= '9') { + if (c == '0') + tz++; + else { + if (nd) + for(; tz; --tz) + db[nd++] = '0'; + else + tz = 0; + db[nd++] = c; + } + c = *s++; + } + ea = -tz; + if (c == '.') { + while((c = *s++) >= '0' && c <= '9') { + if (c == '0') + tz++; + else { + if (tz) { + ea += tz; + if (nd) + for(; tz; --tz) + db[nd++] = '0'; + else + tz = 0; + } + db[nd++] = c; + ea++; + } + } + } + if (et = etype[(unsigned char)c]) { + esign = et == 3; + c = *s++; + if (et == 1) { + if(etype[(unsigned char)c] > 1) { + if (c == '-') + esign = 1; + c = *s++; + } + } + while(c >= '0' && c <= '9') { + ex = 10*ex + (c - '0'); + c = *s++; + } + if (esign) + ex = -ex; + } + switch(c) { + case 0: + break; +#ifndef VAX + case 'i': + case 'I': + Fatal("Overflow evaluating constant expression."); + case 'n': + case 'N': + Fatal("Constant expression yields NaN."); +#endif + default: + Fatal("unexpected character in cds."); + } + ex -= ea; + if (!nd) { + if (!z0) + z0 = mem(4,0); + strcpy(z0, "-0."); + /* sign = 0; */ /* 20010820: preserve sign of 0. */ + } + else if (ex > 2 || ex + nd < -2) { + sprintf(ebuf, "%ld", ex + nd - 1); + k = strlen(ebuf) + nd + 3; + if (nd > 1) + k++; + if (!z0) + z0 = mem(k,0); + z = z0; + *z++ = '-'; + *z++ = *db; + if (nd > 1) { + *z++ = '.'; + for(k = 1; k < nd; k++) + *z++ = db[k]; + } + *z++ = 'e'; + strcpy(z, ebuf); + } + else { + k = (int)(ex + nd); + i = nd + 3; + if (k < 0) + i -= k; + else if (ex > 0) + i += (int)ex; + if (!z0) + z0 = mem(i,0); + z = z0; + *z++ = '-'; + if (ex >= 0) { + for(k = 0; k < nd; k++) + *z++ = db[k]; + while(--ex >= 0) + *z++ = '0'; + *z++ = '.'; + } + else { + for(i = 0; i < k;) + *z++ = db[i++]; + *z++ = '.'; + while(++k <= 0) + *z++ = '0'; + while(i < nd) + *z++ = db[i++]; + } + *z = 0; + } + return sign ? z0 : z0+1; + } diff --git a/tools/connec/src/cds.o b/tools/connec/src/cds.o new file mode 100644 index 0000000000000000000000000000000000000000..d58c6132bdaa27f22b6dd9ee1498dc6d034eabb2 GIT binary patch literal 4648 zcmbVQZ*Ut&72lH_+esarTT(E@FoIEv9qL0)oQchZqO&FEl*&#aP8uMIP~>xLD$5?} zl*FajnmLR5Fqf7Ym?`j$flg;i%QsOdq;V7EgaP6KlEQ=`%(Q@olO}DU?!-yOdwaX~ z`7GrFFQeP{e*6CIdwYB9OoSrcEcFC{Z$S$>rlRp5J*`TiuRkKT<5+{F%HnTG&pqCI-j2myixcHag^cIxl zj^9pf4GC|+IR0MHpqOHd7Bv24k1FQRD(3xYnBC*XZgF}vn=trwsC zCa5UWJ5clI_>g~z&xHtP?2^U&A)kO*Vr`2@AT=9a>;+k$5fX|NfgWfa|69bER~G-AyATmW^Vy|d?PKr|pZYJv znY^MkXP3g62F0{>xdIQ%6?50YswelZIQctZ z{Sz_&4qHcd*G@q^^(X3}MGXE1O6YXl@xO$diX^HJWk{0 zQjDu~*IS!-)oXC|?H3i}_sZgB*?gkSCF{2#+n<6BR94#~7phy7Y3fYO3-VOA5H`o% za-rKLy+r*&(Zu{FVd~Kmc3SQ@H*u{{qbjE6t5;x-#w#9!m4ZN5#TQf{4#x{W4jQjR z4nB9#_(xEHkA0Ws z40&wj;WDek$y1SP!3uaY^Cko|-ejKPP05{^Xk5Icn0;Gaig6yb3W1Ve>6pXtk!C2@ zf5cOdLu2&?p&6jBS<6u3mlZcXUBrBwD=^i@0?cM^D8fuJ%r^)xWpNMg4QSV9EDkit zrA*VqQOpx;S@Ek-|Fy-ptDsS_3)HAj5`Z$?jrJZ_Qv->S6JGUrERl(6L&;;__((FX z#gdv=Jvo|E)9Im+q{Mx6t)26Z4XKI#w6{0bE0IhRjMTWM_Iu-lu~ZDWly@lUjrXS| zvL(?^$nLJL&v={mAI&7SjCZHBL-Mz5&rqp#ytQ5Ow>4X+6>$>_EIj@N0=*YD*VWWM z4I3x|cq5y81=ru{sej7V>1jCS?(}%gs!mVSx7NuX|2L{-PrF_d^o+Wnc5U#q10;Kz zKm}C6q|;L?-^1LL9q`qtB5#$-O}fi|NeOYozjEXTPvyu>XamdJtOgJP{a|81 zwbnpH7%9$VKK~JlujFITz`bnEjjYj4)~^OY+Cq`Fd2VI6-(m4-DzDAIjo}}4=%eT+ zxVqKU0pfjpF~HMa!-yZ2diXhM9{}a>FIK>hRKQ`Qmi04O0Y6>=|9SV8cJ#d(fHtFB(0_5qhknavG`*MMF(O-3CQu2@I!LJ z5BJCt3P8NC91l>GkezJg_*azbZ zZ8$KIxIfJO12%jBcqH!Uwk47m*y!{#QvpA3!!ZW;gBKPg#PF=*`CLK}$eGVyEqF~n z|8(NkvP$*rJ$L5+d&fzbnBjEl_){eR!4{~;SbXVa(tVGd~n3P3pEor?Qu zwBh!+%?w}86ODn6RlqM-z=Q1QT;qq~Xl9SASJ3}n1^s6$=)Y{!|1iYh>-7SUg!$la znWXgCuogQ?BseRqagcKJL1-Mhbq9zCFk&eXx^Kq@w@E=T{r882AkE8+a&1OP+g-wjJz{(N$gYz7W{5LiYm zrfGvU-emg;FAErle|K>YA>p}&I8#H&B9;)_796FqmIYuQgdh5J+IyLOEqmX&jh8cQ zY=se3wmEQa|A+(U`E$1cm@j8P%Hn_AVbAUOxR=@U?*&)?HnX?x2^_Uzp~USE+V~YM zLSAO}b_{uL$MIo?t=h|goniKaT#=1@{T#;ma{X^$|1ZM(jQz*k5x3_!=HrYF5NTpp rno%~1XYal6bK0X%XYT$LwLiGr0e literal 0 HcmV?d00001 diff --git a/tools/connec/src/changes b/tools/connec/src/changes new file mode 100644 index 0000000..2d58c81 --- /dev/null +++ b/tools/connec/src/changes @@ -0,0 +1,3523 @@ +31 Aug. 1989: + 1. A(min(i,j)) now is translated correctly (where A is an array). + 2. 7 and 8 character variable names are allowed (but elicit a + complaint under -ext). + 3. LOGICAL*1 is treated as LOGICAL, with just one error message + per LOGICAL*1 statement (rather than one per variable declared + in that statement). [Note that LOGICAL*1 is not in Fortran 77.] + Like f77, f2c now allows the format in a read or write statement + to be an integer array. + +5 Sept. 1989: + Fixed botch in argument passing of substrings of equivalenced +variables. + +15 Sept. 1989: + Warn about incorrect code generated when a character-valued +function is not declared external and is passed as a parameter +(in violation of the Fortran 77 standard) before it is invoked. +Example: + + subroutine foo(a,b) + character*10 a,b + call goo(a,b) + b = a(3) + end + +18 Sept. 1989: + Complain about overlapping initializations. + +20 Sept. 1989: + Warn about names declared EXTERNAL but never referenced; +include such names as externs in the generated C (even +though most C compilers will discard them). + +24 Sept. 1989: + New option -w8 to suppress complaint when COMMON or EQUIVALENCE +forces word alignment of a double. + Under -A (for ANSI C), ensure that floating constants (terminated +by 'f') contain either a decimal point or an exponent field. + Repair bugs sometimes encountered with CHAR and ICHAR intrinsic +functions. + Restore f77's optimizations for copying and comparing character +strings of length 1. + Always assume floating-point valued routines in libF77 return +doubles, even under -R. + Repair occasional omission of arguments in routines having multiple +entry points. + Repair bugs in computing offsets of character strings involved +in EQUIVALENCE. + Don't omit structure qualification when COMMON variables are used +as FORMATs or internal files. + +2 Oct. 1989: + Warn about variables that appear only in data stmts; don't emit them. + Fix bugs in character DATA for noncharacter variables +involved in EQUIVALENCE. + Treat noncharacter variables initialized (at least partly) with +character data as though they were equivalenced -- put out a struct +and #define the variables. This eliminates the hideous and nonportable +numeric values that were used to initialize such variables. + Treat IMPLICIT NONE as IMPLICIT UNDEFINED(A-Z) . + Quit when given invalid options. + +8 Oct. 1989: + Modified naming scheme for generated intermediate variables; +more are recycled, fewer distinct ones used. + New option -W nn specifies nn characters/word for Hollerith +data initializing non-character variables. + Bug fix: x(i:min(i+10,j)) used to elicit "Can't handle opcode 31 yet". + Integer expressions of the form (i+const1) - (i+const2), where +i is a scalar integer variable, are now simplified to (const1-const2); +this leads to simpler translation of some substring expressions. + Initialize uninitialized portions of character string arrays to 0 +rather than to blanks. + +9 Oct. 1989: + New option -c to insert comments showing original Fortran source. + New option -g to insert line numbers of original Fortran source. + +10 Oct. 1989: + ! recognized as in-line comment delimiter (a la Fortran 88). + +24 Oct. 1989: + New options to ease coping with systems that want the structs +that result from COMMON blocks to be defined just once: + -E causes uninitialized COMMON blocks to be declared Extern; +if Extern is undefined, f2c.h #defines it to be extern. + -ec causes a separate .c file to be emitted for each +uninitialized COMMON block: COMMON /ABC/ yields abc_com.c; +thus one can compile *_com.c into a library to ensure +precisely one definition. + -e1c is similar to -ec, except that everything goes into +one file, along with comments that give a sed script for +splitting the file into the pieces that -ec would give. +This is for use with netlib's "execute f2c" service (for which +-ec is coerced into -e1c, and the sed script will put everything +but the COMMON definitions into f2c_out.c ). + +28 Oct. 1989: + Convert "i = i op ..." into "i op= ...;" even when i is a +dummy argument. + +13 Nov. 1989: + Name integer constants (passed as arguments) c__... rather +than c_... so + common /c/stuff + call foo(1) + ... +is translated correctly. + +19 Nov. 1989: + Floating-point constants are now kept as strings unless they +are involved in constant expressions that get simplified. The +floating-point constants kept as strings can have arbitrarily +many significant figures and a very large exponent field (as +large as long int allows on the machine on which f2c runs). +Thus, for example, the body of + + subroutine zot(x) + double precision x(6), pi + parameter (pi=3.1415926535897932384626433832795028841972) + x(1) = pi + x(2) = pi+1 + x(3) = 9287349823749272.7429874923740978492734D-298374 + x(4) = .89 + x(5) = 4.0005 + x(6) = 10D7 + end + +now gets translated into + + x[1] = 3.1415926535897932384626433832795028841972; + x[2] = 4.1415926535897931; + x[3] = 9.2873498237492727429874923740978492734e-298359; + x[4] = (float).89; + x[5] = (float)4.0005; + x[6] = 1e8; + +rather than the former + + x[1] = 3.1415926535897931; + x[2] = 4.1415926535897931; + x[3] = 0.; + x[4] = (float)0.89000000000000003; + x[5] = (float)4.0004999999999997; + x[6] = 100000000.; + + Recognition of f77 machine-constant intrinsics deleted, i.e., +epbase, epprec, epemin, epemax, eptiny, ephuge, epmrsp. + +22 Nov. 1989: + Workarounds for glitches on some Sun systems... + libf77: libF77/makefile modified to point out possible need +to compile libF77/main.c with -Donexit=on_exit . + libi77: libI77/wref.c (and libI77/README) modified so non-ANSI +systems can compile with USE_STRLEN defined, which will cause + sprintf(b = buf, "%#.*f", d, x); + n = strlen(b) + d1; +rather than + n = sprintf(b = buf, "%#.*f", d, x) + d1; +to be compiled. + +26 Nov. 1989: + Longer names are now accepted (up to 50 characters); names may +contain underscores (in which case they will have two underscores +appended, to avoid clashes with library names). + +28 Nov. 1989: + libi77 updated: + 1. Allow 3 (or, on Crays, 4) digit exponents under format Ew.d . + 2. Try to get things right on machines where ints have 16 bits. + +29 Nov. 1989: + Supplied missing semicolon in parameterless subroutines that +have multiple entry points (all of them parameterless). + +30 Nov. 1989: + libf77 and libi77 revised to use types from f2c.h. + f2c now types floating-point valued C library routines as "double" +rather than "doublereal" (for use with nonstandard C compilers for +which "double" is IEEE double extended). + +1 Dec. 1989: + f2c.h updated to eliminate #defines rendered unnecessary (and, +indeed, dangerous) by change of 26 Nov. to long names possibly +containing underscores. + libi77 further revised: yesterday's change omitted two tweaks to fmt.h +(tweaks which only matter if float and real or double and doublereal are +different types). + +2 Dec. 1989: + Better error message (than "bad tag") for NAMELIST, which no longer +inhibits C output. + +4 Dec. 1989: + Allow capital letters in hex constants (f77 extension; e.g., +x'a012BCd', X'A012BCD' and x'a012bcd' are all treated as the integer +167848909). + libi77 further revised: lio.c lio.h lread.c wref.c wrtfmt.c tweaked +again to allow float and real or double and doublereal to be different. + +6 Dec. 1989: + Revised f2c.h -- required for the following... + Simpler looking translations for abs, min, max, using #defines in +revised f2c.h . + libi77: more corrections to types; additions for NAMELIST. + Corrected casts in some I/O calls. + Translation of NAMELIST; libi77 must still be revised. Currently +libi77 gives you a run-time error message if you attempt NAMELIST I/O. + +7 Dec. 1989: + Fixed bug that prevented local integer variables that appear in DATA +stmts from being ASSIGNed statement labels. + Fillers (for DATA statements initializing EQUIVALENCEd variables and +variables in COMMON) typed integer rather than doublereal (for slightly +more portability, e.g. to Crays). + libi77: missing return values supplied in a few places; some tests +reordered for better working on the Cray. + libf77: better accuracy for complex divide, complex square root, +real mod function (casts to double; double temporaries). + +9 Dec. 1989: + Fixed bug that caused needless (albeit harmless) empty lines to be +inserted in the C output when a comment line contained trailing blanks. + Further tweak to type of fillers: allow doublereal fillers if the +struct has doublereal data. + +11 Dec. 1989: + Alteration of rule for producing external (C) names from names that +contain underscores. Now the external name is always obtained by +appending a pair of underscores. + +12 Dec. 1989: + C production inhibited after most errors. + +15 Dec. 1989: + Fixed bug in headers for subroutines having two or more character +strings arguments: the length arguments were reversed. + +19 Dec. 1989: + f2c.h libf77 libi77: adjusted so #undefs in f2c.h should not foil +compilation of libF77 and libI77. + libf77: getenv_ adjusted to work with unsorted environments. + libi77: the iostat= specifier should now work right with internal I/O. + +20 Dec. 1989: + f2c bugs fixed: In the absence of an err= specifier, the iostat= +specifier was generally set wrong. Character strings containing +explicit nulls (\0) were truncated at the first null. + Unlabeled DO loops recognized; must be terminated by ENDDO. +(Don't ask for CYCLE, EXIT, named DO loops, or DO WHILE.) + +29 Dec. 1989: + Nested unlabeled DO loops now handled properly; new warning for +extraneous text at end of FORMAT. + +30 Dec. 1989: + Fixed bug in translating dble(real(...)), dble(sngl(...)), and +dble(float(...)), where ... is either of type double complex or +is an expression requiring assignment to intermediate variables (e.g., +dble(real(foo(x+1))), where foo is a function and x is a variable). +Regard nonblank label fields on continuation lines as an error. + +3 Jan. 1990: + New option -C++ yields output that should be understood +by C++ compilers. + +6 Jan. 1989: + -a now excludes variables that appear in a namelist from those +that it makes automatic. (As before, it also excludes variables +that appear in a common, data, equivalence, or save statement.) + The syntactically correct Fortran + read(*,i) x + end +now yields syntactically correct C (even though both the Fortran +and C are buggy -- no FORMAT has not been ASSIGNed to i). + +7 Jan. 1990: + libi77: routines supporting NAMELIST added. Surrounding quotes +made optional when no ambiguity arises in a list or namelist READ +of a character-string value. + +9 Jan. 1990: + f2c.src made available. + +16 Jan. 1990: + New options -P to produce ANSI C or C++ prototypes for procedures +defined. Change to -A and -C++: f2c tries to infer prototypes for +invoked procedures unless the new -!P option is given. New warning +messages for inconsistent calling sequences among procedures within +a single file. Most of f2c/src is affected. + f2c.h: typedefs for procedure arguments added; netlib's f2c service +will insert appropriate typedefs for use with older versions of f2c.h. + +17 Jan. 1990: + f2c/src: defs.h exec.c format.c proc.c putpcc.c version.c xsum0.out +updated. Castargs and protofile made extern in defs.h; exec.c +modified so superfluous else clauses are diagnosed; unused variables +omitted from declarations in format.c proc.c putpcc.c . + +21 Jan. 1990: + No C emitted for procedures declared external but not referenced. + f2c.h: more new types added for use with -P. + New feature: f2c accepts as arguments files ending in .p or .P; +such files are assumed to be prototype files, such as produced by +the -P option. All prototype files are read before any Fortran files +and apply globally to all Fortran files. Suitable prototypes help f2c +warn about calling-sequence errors and can tell f2c how to type +procedures declared external but not explicitly typed; the latter is +mainly of interest for users of the -A and -C++ options. (Prototype +arguments are not available to netlib's "execute f2c" service.) + New option -it tells f2c to try to infer types of untyped external +arguments from their use as parameters to prototyped or previously +defined procedures. + f2c/src: many minor cleanups; most modules changed. Individual +files in f2c/src are now in "bundle" format. The former f2c.1 is +now f2c.1t; "f2c.1t from f2c" and "f2c.1t from f2c/src" are now the +same, as are "f2c.1 from f2c" and "f2c.1 from f2c/src". People who +do not obtain a new copy of "all from f2c/src" should at least add + fclose(sortfp); +after the call on do_init_data(outfile, sortfp) in format_data.c . + +22 Jan. 1990: + Cleaner man page wording (thanks to Doug McIlroy). + -it now also applies to all untyped EXTERNAL procedures, not just +arguments. + +23 Jan. 01:34:00 EST 1990: + Bug fixes: under -A and -C++, incorrect C was generated for +subroutines having multiple entries but no arguments. + Under -A -P, subroutines of no arguments were given prototype +calling sequence () rather than (void). + Character-valued functions elicited erroneous warning messages +about inconsistent calling sequences when referenced by another +procedure in the same file. + f2c.1t: omit first appearance of libF77.a in FILES section; +load order of libraries is -lF77 -lI77, not vice versa (bug +introduced in yesterday's edits); define .F macro for those whose +-man lacks it. (For a while after yesterday's fixes were posted, +f2c.1t was out of date. Sorry!) + +23 Jan. 9:53:24 EST 1990: + Character substring expressions involving function calls having +character arguments (including the intrinsic len function) yielded +incorrect C. + Procedures defined after invocation (in the same file) with +conflicting argument types also got an erroneous message about +the wrong number of arguments. + +24 Jan. 11:44:00 EST 1990: + Bug fixes: -p omitted #undefs; COMMON block names containing +underscores had their C names incorrectly computed; a COMMON block +having the name of a previously defined procedure wreaked havoc; +if all arguments were .P files, f2c tried reading the second as a +Fortran file. + New feature: -P emits comments showing COMMON block lengths, so one +can get warnings of incompatible COMMON block lengths by having f2c +read .P (or .p) files. Now by running f2c twice, first with -P -!c +(or -P!c), then with *.P among the arguments, you can be warned of +inconsistent COMMON usage, and COMMON blocks having inconsistent +lengths will be given the maximum length. (The latter always did +happen within each input file; now -P lets you extend this behavior +across files.) + +26 Jan. 16:44:00 EST 1990: + Option -it made less aggressive: untyped external procedures that +are invoked are now typed by the rules of Fortran, rather than by +previous use of procedures to which they are passed as arguments +before being invoked. + Option -P now includes information about references, i.e., called +procedures, in the prototype files (in the form of special comments). +This allows iterative invocations of f2c to infer more about untyped +external names, particularly when multiple Fortran files are involved. + As usual, there are some obscure bug fixes: +1. Repair of erroneous warning messages about inconsistent number of +arguments that arose when a character dummy parameter was discovered +to be a function or when multiple entry points involved character +variables appearing in a previous entry point. +2. Repair of memory fault after error msg about "adjustable character +function". +3. Under -U, allow MAIN_ as a subroutine name (in the same file as a +main program). +4. Change for consistency: a known function invoked as a subroutine, +then as a function elicits a warning rather than an error. + +26 Jan. 22:32:00 EST 1990: + Fixed two bugs that resulted in incorrect C for substrings, within +the body of a character-valued function, of the function's name, when +those substrings were arguments to another function (even implicitly, +as in character-string assignment). + +28 Jan. 18:32:00 EST 1990: + libf77, libi77: checksum files added; "make check" looks for +transmission errors. NAMELIST read modified to allow $ rather than & +to precede a namelist name, to allow $ rather than / to terminate +input where the name of another variable would otherwise be expected, +and to regard all nonprinting ASCII characters <= ' ' as spaces. + +29 Jan. 02:11:00 EST 1990: + "fc from f2c" added. + -it option made the default; -!it turns it off. Type information is +now updated in a previously missed case. + -P option tweaked again; message about when rerunning f2c may change +prototypes or declarations made more accurate. + New option -Ps implies -P and returns exit status 4 if rerunning +f2c -P with prototype inputs might change prototypes or declarations. +Now you can execute a crude script like + + cat *.f >zap.F + rm -f zap.P + while :; do + f2c -Ps -!c zap.[FP] + case $? in 4) ;; *) break;; esac + done + +to get a file zap.P of the best prototypes f2c can determine for *.f . + +Jan. 29 07:30:21 EST 1990: + Forgot to check for error status when setting return code 4 under -Ps; +error status (1, 2, 3, or, for caught signal, 126) now takes precedence. + +Jan 29 14:17:00 EST 1990: + Incorrect handling of + open(n,'filename') +repaired -- now treated as + open(n,file='filename') +(and, under -ext, given an error message). + New optional source file memset.c for people whose systems don't +provide memset, memcmp, and memcpy; #include in mem.c +changed to #include "string.h" so BSD people can create a local +string.h that simply says #include . + +Jan 30 10:34:00 EST 1990: + Fix erroneous warning at end of definition of a procedure with +character arguments when the procedure had previously been called with +a numeric argument instead of a character argument. (There were two +warnings, the second one incorrectly complaining of a wrong number of +arguments.) + +Jan 30 16:29:41 EST 1990: + Fix case where -P and -Ps erroneously reported another iteration +necessary. (Only harm is the extra iteration.) + +Feb 3 01:40:00 EST 1990: + Supply semicolon occasionally omitted under -c . + Try to force correct alignment when numeric variables are initialized +with character data (a non-standard and non-portable practice). You +must use the -W option if your code has such data statements and is +meant to run on a machine with other than 4 characters/word; e.g., for +code meant to run on a Cray, you would specify -W8 . + Allow parentheses around expressions in output lists (in write and +print statements). + Rename source files so their names are <= 12 characters long +(so there's room to append .Z and still have <= 14 characters); +renamed files: formatdata.c niceprintf.c niceprintf.h safstrncpy.c . + f2c material made available by anonymous ftp from research.att.com +(look in dist/f2c ). + +Feb 3 03:49:00 EST 1990: + Repair memory fault that arose from use (in an assignment or +call) of a non-argument variable declared CHARACTER*(*). + +Feb 9 01:35:43 EST 1990: + Fix erroneous error msg about bad types in + subroutine foo(a,adim) + dimension a(adim) + integer adim + Fix improper passing of character args (and possible memory fault) +in the expression part of a computed goto. + Fix botched calling sequences in array references involving +functions having character args. + Fix memory fault caused by invocation of character-valued functions +of no arguments. + Fix botched calling sequence of a character*1-valued function +assigned to a character*1 variable. + Fix bug in error msg for inconsistent number of args in prototypes. + Allow generation of C output despite inconsistencies in prototypes, +but give exit code 8. + Simplify include logic (by removing some bogus logic); never +prepend "/usr/include/" to file names. + Minor cleanups (that should produce no visible change in f2c's +behavior) in intr.c parse.h main.c defs.h formatdata.c p1output.c . + +Feb 10 00:19:38 EST 1990: + Insert (integer) casts when floating-point expressions are used +as subscripts. + Make SAVE stmt (with no variable list) override -a . + Minor cleanups: change field to Field in struct Addrblock (for the +benefit of buggy C compilers); omit system("/bin/cp ...") in misc.c . + +Feb 13 00:39:00 EST 1990: + Error msg fix in gram.dcl: change "cannot make %s parameter" +to "cannot make into parameter". + +Feb 14 14:02:00 EST 1990: + Various cleanups (invisible on systems with 4-byte ints), thanks +to Dave Regan: vaxx.c eliminated; %d changed to %ld various places; +external names adjusted for the benefit of stupid systems (that ignore +case and recognize only 6 significant characters in external names); +buffer shortened in xsum.c (e.g. for MS-DOS); fopen modes distinguish +text and binary files; several unused functions eliminated; missing +arg supplied to an unlikely fatalstr invocation. + +Thu Feb 15 19:15:53 EST 1990: + More cleanups (invisible on systems with 4 byte ints); casts inserted +so most complaints from cyntax(1) and lint(1) go away; a few (int) +versus (long) casts corrected. + +Fri Feb 16 19:55:00 EST 1990: + Recognize and translate unnamed Fortran 8x do while statements. + Fix bug that occasionally caused improper breaking of character +strings. + New error message for attempts to provide DATA in a type-declaration +statement. + +Sat Feb 17 11:43:00 EST 1990: + Fix infinite loop clf -> Fatal -> done -> clf after I/O error. + Change "if (addrp->vclass = CLPROC)" to "if (addrp->vclass == CLPROC)" +in p1_addr (in p1output.c); this was probably harmless. + Move a misplaced } in lex.c (which slowed initkey()). + Thanks to Gary Word for pointing these things out. + +Sun Feb 18 18:07:00 EST 1990: + Detect overlapping initializations of arrays and scalar variables +in previously missed cases. + Treat logical*2 as logical (after issuing a warning). + Don't pass string literals to p1_comment(). + Correct a cast (introduced 16 Feb.) in gram.expr; this matters e.g. +on a Cray. + Attempt to isolate UNIX-specific things in sysdep.c (a new source +file). Unless sysdep.c is compiled with SYSTEM_SORT defined, the +intermediate files created for DATA statements are now sorted in-core +without invoking system(). + +Tue Feb 20 16:10:35 EST 1990: + Move definition of binread and binwrite from init.c to sysdep.c . + Recognize Fortran 8x tokens < <= == >= > <> as synonyms for +.LT. .LE. .EQ. .GE. .GT. .NE. + Minor cleanup in putpcc.c: fully remove simoffset(). + More discussion of system dependencies added to libI77/README. + +Tue Feb 20 21:44:07 EST 1990: + Minor cleanups for the benefit of EBCDIC machines -- try to remove +the assumption that 'a' through 'z' are contiguous. (Thanks again to +Gary Word.) Also, change log2 to log_2 (shouldn't be necessary). + +Wed Feb 21 06:24:56 EST 1990: + Fix botch in init.c introduced in previous change; only matters +to non-ASCII machines. + +Thu Feb 22 17:29:12 EST 1990: + Allow several entry points to mention the same array. Protect +parameter adjustments with if's (for the case that an array is not +an argument to all entrypoints). + Under -u, allow + subroutine foo(x,n) + real x(n) + integer n + Compute intermediate variables used to evaluate dimension expressions +at the right time. Example previously mistranslated: + subroutine foo(x,k,m,n) + real x(min(k,m,n)) + ... + write(*,*) x + Detect duplicate arguments. (The error msg points to the first +executable stmt -- not wonderful, but not worth fixing.) + Minor cleanup of min/max computation (sometimes slightly simpler). + +Sun Feb 25 09:39:01 EST 1990: + Minor tweak to multiple entry points: protect parameter adjustments +with if's only for (array) args that do not appear in all entry points. + Minor tweaks to format.c and io.c (invisible unless your compiler +complained at the duplicate #defines of IOSUNIT and IOSFMT or at +comparisons of p1gets(...) with NULL). + +Sun Feb 25 18:40:10 EST 1990: + Fix bug introduced Feb. 22: if a subprogram contained DATA and the +first executable statement was labeled, then the label got lost. +(Just change INEXEC to INDATA in p1output.c; it occurs just once.) + +Mon Feb 26 17:45:10 EST 1990: + Fix bug in handling of " and ' in comments. + +Wed Mar 28 01:43:06 EST 1990: +libI77: + 1. Repair nasty I/O bug: opening two files and closing the first +(after possibly reading or writing it), then writing the second caused +the last buffer of the second to be lost. + 2. Formatted reads of logical values treated all letters other than +t or T as f (false). + libI77 files changed: err.c rdfmt.c Version.c + (Request "libi77 from f2c" -- you can't get these files individually.) + +f2c itself: + Repair nasty bug in translation of + ELSE IF (condition involving complicated abs, min, or max) +-- auxiliary statements were emitted at the wrong place. + Supply semicolon previously omitted from the translation of a label +(of a CONTINUE) immediately preceding an ELSE IF or an ELSE. This +bug made f2c produce invalid C. + Correct a memory fault that occurred (on some machines) when the +error message "adjustable dimension on non-argument" should be given. + Minor tweaks to remove some harmless warnings by overly chatty C +compilers. + Argument arays having constant dimensions but a variable lower bound +(e.g., x(n+1:n+3)) had a * omitted from scalar arguments involved in +the array offset computation. + +Wed Mar 28 18:47:59 EST 1990: +libf77: add exit(0) to end of main [return(0) encounters a Cray bug] + +Sun Apr 1 16:20:58 EDT 1990: + Avoid dereferencing null when processing equivalences after an error. + +Fri Apr 6 08:29:49 EDT 1990: + Calls involving alternate return specifiers omitted processing +needed for things like min, max, abs, and // (concatenation). + INTEGER*2 PARAMETERs were treated as INTEGER*4. + Convert some O(n^2) parsing to O(n). + +Tue Apr 10 20:07:02 EDT 1990: + When inconsistent calling sequences involve differing numbers of +arguments, report the first differing argument rather than the numbers +of arguments. + Fix bug under -a: formatted I/O in which either the unit or the +format was a local character variable sometimes resulted in invalid C +(a static struct initialized with an automatic component). + Improve error message for invalid flag after elided -. + Complain when literal table overflows, rather than infinitely +looping. (The complaint mentions the new and otherwise undocumented +-NL option for specifying a larger literal table.) + New option -h for forcing strings to word (or, with -hd, double-word) +boundaries where possible. + Repair a bug that could cause improper splitting of strings. + Fix bug (cast of c to doublereal) in + subroutine foo(c,r) + double complex c + double precision r + c = cmplx(r,real(c)) + end + New include file "sysdep.h" has some things from defs.h (and +elsewhere) that one may need to modify on some systems. + Some large arrays that were previously statically allocated are now +dynamically allocated when f2c starts running. + f2c/src files changed: + README cds.c defs.h f2c.1 f2c.1t format.c formatdata.c init.c + io.c lex.c main.c makefile mem.c misc.c names.c niceprintf.c + output.c parse_args.c pread.c put.c putpcc.c sysdep.h + version.c xsum0.out + +Wed Apr 11 18:27:12 EDT 1990: + Fix bug in argument consistency checking of character, complex, and +double complex valued functions. If the same source file contained a +definition of such a function with arguments not explicitly typed, +then subsequent references to the function might get erroneous +warnings of inconsistent calling sequences. + Tweaks to sysdep.h for partially ANSI systems. + New options -kr and -krd cause f2c to use temporary variables to +enforce Fortran evaluation-order rules with pernicious, old-style C +compilers that apply the associative law to floating-point operations. + +Sat Apr 14 15:50:15 EDT 1990: + libi77: libI77 adjusted to allow list-directed and namelist I/O +of internal files; bug in namelist I/O of logical and character arrays +fixed; list input of complex numbers adjusted to permit d or D to +denote the start of the exponent field of a component. + f2c itself: fix bug in handling complicated lower-bound +expressions for character substrings; e.g., min and max did not work +right, nor did function invocations involving character arguments. + Switch to octal notation, rather than hexadecimal, for nonprinting +characters in character and string constants. + Fix bug (when neither -A nor -C++ was specified) in typing of +external arguments of type complex, double complex, or character: + subroutine foo(c) + external c + complex c +now results in + /* Complex */ int (*c) (); +(as, indeed, it once did) rather than + complex (*c) (); + +Sat Apr 14 22:50:39 EDT 1990: + libI77/makefile: updated "make check" to omit lio.c + lib[FI]77/makefile: trivial change: define CC = cc, reference $(CC). + (Request, e.g., "libi77 from f2c" -- you can't ask for individual +files from lib[FI]77.) + +Wed Apr 18 00:56:37 EDT 1990: + Move declaration of atof() from defs.h to sysdep.h, where it is +now not declared if stdlib.h is included. (NeXT's stdlib.h has a +#define atof that otherwise wreaks havoc.) + Under -u, provide a more intelligible error message (than "bad tag") +for an attempt to define a function without specifying its type. + +Wed Apr 18 17:26:27 EDT 1990: + Recognize \v (vertical tab) in Hollerith as well as quoted strings; +add recognition of \r (carriage return). + New option -!bs turns off recognition of escapes in character strings +(\0, \\, \b, \f, \n, \r, \t, \v). + Move to sysdep.c initialization of some arrays whose initialization +assumed ASCII; #define Table_size in sysdep.h rather than using +hard-coded 256 in allocating arrays of size 1 << (bits/byte). + +Thu Apr 19 08:13:21 EDT 1990: + Warn when escapes would make Hollerith extend beyond statement end. + Omit max() definition from misc.c (should be invisible except on +systems that erroneously #define max in stdlib.h). + +Mon Apr 23 22:24:51 EDT 1990: + When producing default-style C (no -A or -C++), cast switch +expressions to (int). + Move "-lF77 -lI77 -lm -lc" to link_msg, defined in sysdep.c . + Add #define scrub(x) to sysdep.h, with invocations in format.c and +formatdata.c, so that people who have systems like VMS that would +otherwise create multiple versions of intermediate files can +#define scrub(x) unlink(x) + +Tue Apr 24 18:28:36 EDT 1990: + Pass string lengths once rather than twice to a function of character +arguments involved in comparison of character strings of length 1. + +Fri Apr 27 13:11:52 EDT 1990: + Fix bug that made f2c gag on concatenations involving char(...) on +some systems. + +Sat Apr 28 23:20:16 EDT 1990: + Fix control-stack bug in + if(...) then + else if (complicated condition) + else + endif +(where the complicated condition causes assignment to an auxiliary +variable, e.g., max(a*b,c)). + +Mon Apr 30 13:30:10 EDT 1990: + Change fillers for DATA with holes from substructures to arrays +(in an attempt to make things work right with C compilers that have +funny padding rules for substructures, e.g., Sun C compilers). + Minor cleanup of exec.c (should not affect generated C). + +Mon Apr 30 23:13:51 EDT 1990: + Fix bug in handling return values of functions having multiple +entry points of differing return types. + +Sat May 5 01:45:18 EDT 1990: + Fix type inference bug in + subroutine foo(x) + call goo(x) + end + subroutine goo(i) + i = 3 + end +Instead of warning of inconsistent calling sequences for goo, +f2c was simply making i a real variable; now i is correctly +typed as an integer variable, and f2c issues an error message. + Adjust error messages issued at end of declarations so they +don't blame the first executable statement. + +Sun May 6 01:29:07 EDT 1990: + Fix bug in -P and -Ps: warn when the definition of a subprogram adds +information that would change prototypes or previous declarations. + +Thu May 10 18:09:15 EDT 1990: + Fix further obscure bug with (default) -it: inconsistent calling +sequences and I/O statements could interact to cause a memory fault. +Example: + SUBROUTINE FOO + CALL GOO(' Something') ! Forgot integer first arg + END + SUBROUTINE GOO(IUNIT,MSG) + CHARACTER*(*)MSG + WRITE(IUNIT,'(1X,A)') MSG + END + +Fri May 11 16:49:11 EDT 1990: + Under -!c, do not delete any .c files (when there are errors). + Avoid dereferencing 0 when a fatal error occurs while reading +Fortran on stdin. + +Wed May 16 18:24:42 EDT 1990: + f2c.ps made available. + +Mon Jun 4 12:53:08 EDT 1990: + Diagnose I/O units of invalid type. + Add specific error msg about dummy arguments in common. + +Wed Jun 13 12:43:17 EDT 1990: + Under -A, supply a missing "[1]" for CHARACTER*1 variables that appear +both in a DATA statement and in either COMMON or EQUIVALENCE. + +Mon Jun 18 16:58:31 EDT 1990: + Trivial updates to f2c.ps . ("Fortran 8x" --> "Fortran 90"; omit +"(draft)" from "(draft) ANSI C".) + +Tue Jun 19 07:36:32 EDT 1990: + Fix incorrect code generated for ELSE IF(expression involving +function call passing non-constant substring). + Under -h, preserve the property that strings are null-terminated +where possible. + Remove spaces between # and define in lex.c output.c parse.h . + +Mon Jun 25 07:22:59 EDT 1990: + Minor tweak to makefile to reduce unnecessary recompilations. + +Tue Jun 26 11:49:53 EDT 1990: + Fix unintended truncation of some integer constants on machines +where casting a long to (int) may change the value. E.g., when f2c +ran on machines with 16-bit ints, "i = 99999" was being translated +to "i = -31073;". + +Wed Jun 27 11:05:32 EDT 1990: + Arrange for CHARACTER-valued PARAMETERs to honor their length +specifications. Allow CHAR(nn) in expressions defining such PARAMETERs. + +Fri Jul 20 09:17:30 EDT 1990: + Avoid dereferencing 0 when a FORMAT statement has no label. + +Thu Jul 26 11:09:39 EDT 1990: + Remarks about VOID and binread,binwrite added to README. + Tweaks to parse_args: should be invisible unless your compiler +complained at (short)*store. + +Thu Aug 2 02:07:58 EDT 1990: + f2c.ps: change the first line of page 5 from + include stuff +to + include 'stuff' + +Tue Aug 14 13:21:24 EDT 1990: + libi77: libI77 adjusted to treat tabs as spaces in list input. + +Fri Aug 17 07:24:53 EDT 1990: + libi77: libI77 adjusted so a blank='ZERO' clause (upper case Z) +in an open of a currently open file works right. + +Tue Aug 28 01:56:44 EDT 1990: + Fix bug in warnings of inconsistent calling sequences: if an +argument to a subprogram was never referenced, then a previous +invocation of the subprogram (in the same source file) that +passed something of the wrong type for that argument did not +elicit a warning message. + +Thu Aug 30 09:46:12 EDT 1990: + libi77: prevent embedded blanks in list output of complex values; +omit exponent field in list output of values of magnitude between +10 and 1e8; prevent writing stdin and reading stdout or stderr; +don't close stdin, stdout, or stderr when reopening units 5, 6, 0. + +Tue Sep 4 12:30:57 EDT 1990: + Fix bug in C emitted under -I2 or -i2 for INTEGER*4 FUNCTION. + Warn of missing final END even if there are previous errors. + +Fri Sep 7 13:55:34 EDT 1990: + Remark about "make xsum.out" and "make f2c" added to README. + +Tue Sep 18 23:50:01 EDT 1990: + Fix null dereference (and, on some systems, writing of bogus *_com.c +files) under -ec or -e1c when a prototype file (*.p or *.P) describes +COMMON blocks that do not appear in the Fortran source. + libi77: + Add some #ifdef lines (#ifdef MSDOS, #ifndef MSDOS) to avoid +references to stat and fstat on non-UNIX systems. + On UNIX systems, add component udev to unit; decide that old +and new files are the same iff both the uinode and udev components +of unit agree. + When an open stmt specifies STATUS='OLD', use stat rather than +access (on UNIX systems) to check the existence of the file (in case +directories leading to the file have funny permissions and this is +a setuid or setgid program). + +Thu Sep 27 16:04:09 EDT 1990: + Supply missing entry for Impldoblock in blksize array of cpexpr +(in expr.c). No examples are known where this omission caused trouble. + +Tue Oct 2 22:58:09 EDT 1990: + libf77: test signal(...) == SIG_IGN rather than & 01 in main(). + libi77: adjust rewind.c so two successive rewinds after a write +don't clobber the file. + +Thu Oct 11 18:00:14 EDT 1990: + libi77: minor cleanups: add #include "fcntl.h" to endfile.c, err.c, +open.c; adjust g_char in util.c for segmented memories; in f_inqu +(inquire.c), define x appropriately when MSDOS is defined. + +Mon Oct 15 20:02:11 EDT 1990: + Add #ifdef MSDOS pointer adjustments to mem.c; treat NAME= as a +synonym for FILE= in OPEN statements. + +Wed Oct 17 16:40:37 EDT 1990: + libf77, libi77: minor cleanups: _cleanup() and abort() invocations +replaced by invocations of sig_die in main.c; some error messages +previously lost in buffers will now appear. + +Mon Oct 22 16:11:27 EDT 1990: + libf77: separate sig_die from main (for folks who don't want to use +the main in libF77). + libi77: minor tweak to comments in README. + +Fri Nov 2 13:49:35 EST 1990: + Use two underscores rather than one in generated temporary variable +names to avoid conflict with COMMON names. f2c.ps updated to reflect +this change and the NAME= extension introduced 15 Oct. + Repair a rare memory fault in io.c . + +Mon Nov 5 16:43:55 EST 1990: + libi77: changes to open.c (and err.c): complain if an open stmt +specifies new= and the file already exists (as specified by Fortrans 77 +and 90); allow file= to be omitted in open stmts and allow +status='replace' (Fortran 90 extensions). + +Fri Nov 30 10:10:14 EST 1990: + Adjust malloc.c for unusual systems whose sbrk() can return values +not properly aligned for doubles. + Arrange for slightly more helpful and less repetitive warnings for +non-character variables initialized with character data; these warnings +are (still) suppressed by -w66. + +Fri Nov 30 15:57:59 EST 1990: + Minor tweak to README (about changing VOID in f2c.h). + +Mon Dec 3 07:36:20 EST 1990: + Fix spelling of "character" in f2c.1t. + +Tue Dec 4 09:48:56 EST 1990: + Remark about link_msg and libf2c added to f2c/README. + +Thu Dec 6 08:33:24 EST 1990: + Under -U, render label nnn as L_nnn rather than Lnnn. + +Fri Dec 7 18:05:00 EST 1990: + Add more names from f2c.h (e.g. integer, real) to the c_keywords +list of names to which an underscore is appended to avoid confusion. + +Mon Dec 10 19:11:15 EST 1990: + Minor tweaks to makefile (./xsum) and README (binread/binwrite). + libi77: a few modifications for POSIX systems; meant to be invisible +elsewhere. + +Sun Dec 16 23:03:16 EST 1990: + Fix null dereference caused by unusual erroneous input, e.g. + call foo('abc') + end + subroutine foo(msg) + data n/3/ + character*(*) msg + end +(Subroutine foo is illegal because the character statement comes after a +data statement.) + Use decimal rather than hex constants in xsum.c (to prevent +erroneous warning messages about constant overflow). + +Mon Dec 17 12:26:40 EST 1990: + Fix rare extra underscore in character length parameters passed +for multiple entry points. + +Wed Dec 19 17:19:26 EST 1990: + Allow generation of C despite error messages about bad alignment +forced by equivalence. + Allow variable-length concatenations in I/O statements, such as + open(3, file=bletch(1:n) // '.xyz') + +Fri Dec 28 17:08:30 EST 1990: + Fix bug under -p with formats and internal I/O "units" in COMMON, +as in + COMMON /FIGLEA/F + CHARACTER*20 F + F = '(A)' + WRITE (*,FMT=F) 'Hello, world!' + END + +Tue Jan 15 12:00:24 EST 1991: + Fix bug when two equivalence groups are merged, the second with +nonzero offset, and the result is then merged into a common block. +Example: + INTEGER W(3), X(3), Y(3), Z(3) + COMMON /ZOT/ Z + EQUIVALENCE (W(1),X(1)), (X(2),Y(1)), (Z(3),X(1)) +***** W WAS GIVEN THE WRONG OFFSET + Recognize Fortran 90's optional NML= in NAMELIST READs and WRITEs. +(Currently NML= and FMT= are treated as synonyms -- there's no +error message if, e.g., NML= specifies a format.) + libi77: minor adjustment to allow internal READs from character +string constants in read-only memory. + +Fri Jan 18 22:56:15 EST 1991: + Add comment to README about needing to comment out the typedef of +size_t in sysdep.h on some systems, e.g. Sun 4.1. + Fix misspelling of "statement" in an error message in lex.c + +Wed Jan 23 00:38:48 EST 1991: + Allow hex, octal, and binary constants to have the qualifying letter +(z, x, o, or b) either before or after the quoted string containing the +digits. For now this change will not be reflected in f2c.ps . + +Tue Jan 29 16:23:45 EST 1991: + Arrange for character-valued statement functions to give results of +the right length (that of the statement function's name). + +Wed Jan 30 07:05:32 EST 1991: + More tweaks for character-valued statement functions: an error +check and an adjustment so a right-hand side of nonconstant length +(e.g., a substring) is handled right. + +Wed Jan 30 09:49:36 EST 1991: + Fix p1_head to avoid printing (char *)0 with %s. + +Thu Jan 31 13:53:44 EST 1991: + Add a test after the cleanup call generated for I/O statements with +ERR= or END= clauses to catch the unlikely event that the cleanup +routine encounters an error. + +Mon Feb 4 08:00:58 EST 1991: + Minor cleanup: omit unneeded jumps and labels from code generated for +some NAMELIST READs and WRITEs with IOSTAT=, ERR=, and/or END=. + +Tue Feb 5 01:39:36 EST 1991: + Change Mktemp to mktmp (for the benefit of systems so brain-damaged +that they do not distinguish case in external names -- and that for +some reason want to load mktemp). Try to get xsum0.out right this +time (it somehow didn't get updated on 4 Feb. 1991). + Add note to libi77/README about adjusting the interpretation of +RECL= specifiers in OPENs for direct unformatted I/O. + +Thu Feb 7 17:24:42 EST 1991: + New option -r casts values of REAL functions, including intrinsics, +to REAL. This only matters for unportable code like + real r + r = asin(1.) + if (r .eq. asin(1.)) ... +[The behavior of such code varies with the Fortran compiler used -- +and sometimes is affected by compiler options.] For now, the man page +at the end of f2c.ps is the only part of f2c.ps that reflects this new +option. + +Fri Feb 8 18:12:51 EST 1991: + Cast pointer differences passed as arguments to the appropriate type. +This matters, e.g., with MSDOS compilers that yield a long pointer +difference but have int == short. + Disallow nonpositive dimensions. + +Fri Feb 15 12:24:15 EST 1991: + Change %d to %ld in sprintf call in putpower in putpcc.c. + Free more memory (e.g. allowing translation of larger Fortran +files under MS-DOS). + Recognize READ (character expression) and WRITE (character expression) +as formatted I/O with the format given by the character expression. + Update year in Notice. + +Sat Feb 16 00:42:32 EST 1991: + Recant recognizing WRITE(character expression) as formatted output +-- Fortran 77 is not symmetric in its syntax for READ and WRITE. + +Mon Mar 4 15:19:42 EST 1991: + Fix bug in passing the real part of a complex argument to an intrinsic +function. Omit unneeded parentheses in nested calls to intrinsics. +Example: + subroutine foo(x, y) + complex y + x = exp(sin(real(y))) + exp(imag(y)) + end + +Fri Mar 8 15:05:42 EST 1991: + Fix a comment in expr.c; omit safstrncpy.c (which had bugs in +cases not used by f2c). + +Wed Mar 13 02:27:23 EST 1991: + Initialize firstmemblock->next in mem_init in mem.c . [On most +systems it was fortuituously 0, but with System V, -lmalloc could +trip on this missed initialization.] + +Wed Mar 13 11:47:42 EST 1991: + Fix a reference to freed memory. + +Wed Mar 27 00:42:19 EST 1991: + Fix a memory fault caused by such illegal Fortran as + function foo + x = 3 + logical foo ! declaration among executables + foo=.false. ! used to suffer memory fault + end + +Fri Apr 5 08:30:31 EST 1991: + Fix loss of % in some format expressions, e.g. + write(*,'(1h%)') + Fix botch introduced 27 March 1991 that caused subroutines with +multiple entry points to have extraneous declarations of ret_val. + +Fri Apr 5 12:44:02 EST 1991 + Try again to omit extraneous ret_val declarations -- this morning's +fix was sometimes wrong. + +Mon Apr 8 13:47:06 EDT 1991: + Arrange for s_rnge to have the right prototype under -A -C . + +Wed Apr 17 13:36:03 EDT 1991: + New fatal error message for apparent invocation of a recursive +statement function. + +Thu Apr 25 15:13:37 EDT 1991: + F2c and libi77 adjusted so NAMELIST works with -i2. (I forgot +about -i2 when adding NAMELIST.) This required a change to f2c.h +(that only affects NAMELIST I/O under -i2.) Man-page description of +-i2 adjusted to reflect that -i2 stores array lengths in short ints. + +Fri Apr 26 02:54:41 EDT 1991: + Libi77: fix some bugs in NAMELIST reading of multi-dimensional arrays +(file rsne.c). + +Thu May 9 02:13:51 EDT 1991: + Omit a trailing space in expr.c (could cause a false xsum value if +a mailer drops the trailing blank). + +Thu May 16 13:14:59 EDT 1991: + Libi77: increase LEFBL in lio.h to overcome a NeXT bug. + Tweak for compilers that recognize "nested" comments: inside comments, +turn /* into /+ (as well as */ into +/). + +Sat May 25 11:44:25 EDT 1991: + libf77: s_rnge: declare line long int rather than int. + +Fri May 31 07:51:50 EDT 1991: + libf77: system_: officially return status. + +Mon Jun 17 16:52:53 EDT 1991: + Minor tweaks: omit unnecessary declaration of strcmp (that caused +trouble on a system where strcmp was a macro) from misc.c; add +SHELL = /bin/sh to makefiles. + Fix a dereference of null when a CHARACTER*(*) declaration appears +(illegally) after DATA. Complain only once per subroutine about +declarations appearing after DATA. + +Mon Jul 1 00:28:13 EDT 1991: + Add test and error message for illegal use of subroutine names, e.g. + SUBROUTINE ZAP(A) + ZAP = A + END + +Mon Jul 8 21:49:20 EDT 1991: + Issue a warning about things like + integer i + i = 'abc' +(which is treated as i = ichar('a')). [It might be nice to treat 'abc' +as an integer initialized (in a DATA statement) with 'abc', but +other matters have higher priority.] + Render + i = ichar('A') +as + i = 'A'; +rather than + i = 65; +(which assumes ASCII). + +Fri Jul 12 07:41:30 EDT 1991: + Note added to README about erroneous definitions of __STDC__ . + +Sat Jul 13 13:38:54 EDT 1991: + Fix bugs in double type convesions of complex values, e.g. +sngl(real(...)) or dble(real(...)) (where ... is complex). + +Mon Jul 15 13:21:42 EDT 1991: + Fix bug introduced 8 July 1991 that caused erroneous warnings +"ichar([first char. of] char. string) assumed for conversion to numeric" +when a subroutine had an array of character strings as an argument. + +Wed Aug 28 01:12:17 EDT 1991: + Omit an unused function in format.c, an unused variable in proc.c . + Under -r8, promote complex to double complex (as the man page claims). + +Fri Aug 30 17:19:17 EDT 1991: + f2c.ps updated: slightly expand description of intrinsics and,or,xor, +not; add mention of intrinsics lshift, rshift; add note about f2c +accepting Fortran 90 inline comments (starting with !); update Cobalt +Blue address. + +Tue Sep 17 07:17:33 EDT 1991: + libI77: err.c and open.c modified to use modes "rb" and "wb" +when (f)opening unformatted files; README updated to point out +that it may be necessary to change these modes to "r" and "w" +on some non-ANSI systems. + +Tue Oct 15 10:25:49 EDT 1991: + Minor tweaks that make some PC compilers happier: insert some +casts, add args to signal functions. + Change -g to emit uncommented #line lines -- and to emit more of them; +update fc, f2c.1, f2c.1t, f2c.ps to reflect this. + Change uchar to Uchar in xsum.c . + Bring gram.c up to date. + +Thu Oct 17 09:22:05 EDT 1991: + libi77: README, fio.h, sue.c, uio.c changed so the length field +in unformatted sequential records has type long rather than int +(unless UIOLEN_int is #defined). This is for systems where sizeof(int) +can vary, depending on the compiler or compiler options. + +Thu Oct 17 13:42:59 EDT 1991: + libi77: inquire.c: when MSDOS is defined, don't strcmp units[i].ufnm +when it is NULL. + +Fri Oct 18 15:16:00 EDT 1991: + Correct xsum0.out in "all from f2c/src" (somehow botched on 15 Oct.). + +Tue Oct 22 18:12:56 EDT 1991: + Fix memory fault when a character*(*) argument is used (illegally) +as a dummy variable in the definition of a statement function. (The +memory fault occurred when the statement function was invoked.) + Complain about implicit character*(*). + +Thu Nov 14 08:50:42 EST 1991: + libi77: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c; this change +should be invisible unless you're running a brain-damaged system. + +Mon Nov 25 19:04:40 EST 1991: + libi77: correct botches introduced 17 Oct. 1991 and 14 Nov. 1991 +(change uint to Uint in lwrite.c; other changes that only matter if +sizeof(int) != sizeof(long)). + Add a more meaningful error message when bailing out due to an attempt +to invoke a COMMON variable as a function. + +Sun Dec 1 19:29:24 EST 1991: + libi77: uio.c: add test for read failure (seq. unformatted reads); +adjust an error return from EOF to off end of record. + +Tue Dec 10 17:42:28 EST 1991: + Add tests to prevent memory faults with bad uses of character*(*). + +Thu Dec 12 11:24:41 EST 1991: + libi77: fix bug with internal list input that caused the last +character of each record to be ignored; adjust error message in +internal formatted input from "end-of-file" to "off end of record" +if the format specifies more characters than the record contains. + +Wed Dec 18 17:48:11 EST 1991: + Fix bug in translating nonsensical ichar invocations involving +concatenations. + Fix bug in passing intrinsics lle, llt, lge, lgt as arguments; +hl_le was being passed rather than l_le, etc. + libf77: adjust length parameters from long to ftnlen, for +compiling with f2c_i2 defined. + +Sat Dec 21 15:30:57 EST 1991: + Allow DO nnn ... to end with an END DO statement labelled nnn. + +Tue Dec 31 13:53:47 EST 1991: + Fix bug in handling dimension a(n**3,2) -- pow_ii was called +incorrectly. + Fix bug in translating + subroutine x(abc,n) + character abc(n) + write(abc,'(i10)') 123 + end +(omitted declaration and initialiation of abc_dim1). + Complain about dimension expressions of such invalid types +as complex and logical. + +Fri Jan 17 11:54:20 EST 1992: + Diagnose some illegal uses of main program name (rather than +memory faulting). + libi77: (1) In list and namelist input, treat "r* ," and "r*," +alike (where r is a positive integer constant), and fix a bug in +handling null values following items with repeat counts (e.g., +2*1,,3). (2) For namelist reading of a numeric array, allow a new +name-value subsequence to terminate the current one (as though the +current one ended with the right number of null values). +(3) [lio.h, lwrite.c]: omit insignificant zeros in list and namelist +output. (Compile with -DOld_list_output to get the old behavior.) + +Sat Jan 18 15:58:01 EST 1992: + libi77: make list output consistent with F format by printing .1 +rather than 0.1 (introduced yesterday). + +Wed Jan 22 08:32:43 EST 1992: + libi77: add comment to README pointing out preconnection of +Fortran units 5, 6, 0 to stdin, stdout, stderr (respectively). + +Mon Feb 3 11:57:53 EST 1992: + libi77: fix namelist read bug that caused the character following +a comma to be ignored. + +Fri Feb 28 01:04:26 EST 1992: + libf77: fix buggy z_sqrt.c (double precision square root), which +misbehaved for arguments in the southwest quadrant. + +Thu Mar 19 15:05:18 EST 1992: + Fix bug (introduced 17 Jan 1992) in handling multiple entry points +of differing types (with implicitly typed entries appearing after +the first executable statement). + Fix memory fault in the following illegal Fortran: + double precision foo(i) +* illegal: above should be "double precision function foo(i)" + foo = i * 3.2 + entry moo(i) + end + Note about ANSI_Libraries (relevant, e.g., to IRIX 4.0.1 and AIX) +added to README. + Abort zero divides during constant simplification. + +Sat Mar 21 01:27:09 EST 1992: + Tweak ckalloc (misc.c) for systems where malloc(0) = 0; this matters +for subroutines with multiple entry points but no arguments. + Add "struct memblock;" to init.c (irrelevant to most compilers). + +Wed Mar 25 13:31:05 EST 1992: + Fix bug with IMPLICIT INTEGER*4(...): under -i2 or -I2, the *4 was +ignored. + +Tue May 5 09:53:55 EDT 1992: + Tweaks to README; e.g., ANSI_LIbraries changed to ANSI_Libraries . + +Wed May 6 23:49:07 EDT 1992 + Under -A and -C++, have subroutines return 0 (even if they have +no * arguments). + Adjust libi77 (rsne.c and lread.c) for systems where ungetc is +a macro. Tweak lib[FI]77/makefile to use unique intermediate file +names (for parallel makes). + +Tue May 19 09:03:05 EDT 1992: + Adjust libI77 to make err= work with internal list and formatted I/O. + +Sat May 23 18:17:42 EDT 1992: + Under -A and -C++, supply "return 0;" after the code generated for +a STOP statement -- the C compiler doesn't know that s_stop won't +return. + New (mutually exclusive) options: + -f treats all input lines as free-format lines, + honoring text that appears after column 72 + and not padding lines shorter than 72 characters + with blanks (which matters if a character string + is continued across 2 or more lines). + -72 treats text appearing after column 72 as an error. + +Sun May 24 09:45:37 EDT 1992: + Tweak description of -f in f2c.1 and f2c.1t; update f2c.ps . + +Fri May 29 01:17:15 EDT 1992: + Complain about externals used as variables. Example + subroutine foo(a,b) + external b + a = a*b ! illegal use of b; perhaps should be b() + end + +Mon Jun 15 11:15:27 EDT 1992: + Fix bug in handling namelists with names that have underscores. + +Sat Jun 27 17:30:59 EDT 1992: + Under -A and -C++, end Main program aliases with "return 0;". + Under -A and -C++, use .P files and usage in previous subprograms +in the current file to give prototypes for functions declared EXTERNAL +but not invoked. + Fix memory fault under -d1 -P . + Under -A and -C++, cast arguments to the right types in calling +a function that has been defined in the current file or in a .P file. + Fix bug in handling multi-dimensional arrays with array references +in their leading dimensions. + Fix bug in the intrinsic cmplx function when the first argument +involves an expression for which f2c generates temporary variables, +e.g. cmplx(abs(real(a)),1.) . + +Sat Jul 18 07:36:58 EDT 1992: + Fix buglet with -e1c (invisible on most systems) temporary file +f2c_functions was unlinked before being closed. + libf77: fix bugs in evaluating m**n for integer n < 0 and m an +integer different from 1 or a real or double precision 0. +Catch SIGTRAP (to print "Trace trap" before aborting). Programs +that previously erroneously computed 1 for 0**-1 may now fault. +Relevant routines: main.c pow_di.c pow_hh.c pow_ii.c pow_ri.c . + +Sat Jul 18 08:40:10 EDT 1992: + libi77: allow namelist input to end with & (e.g. &end). + +Thu Jul 23 00:14:43 EDT 1992 + Append two underscores rather than one to C keywords used as +local variables to avoid conflicts with similarly named COMMON blocks. + +Thu Jul 23 11:20:55 EDT 1992: + libf77, libi77 updated to assume ANSI prototypes unless KR_headers +is #defined. + libi77 now recognizes a Z format item as in Fortran 90; +the implementation assumes 8-bit bytes and botches character strings +on little-endian machines (by printing their bytes from right to +left): expect this bug to persist; fixing it would require a +change to the I/O calling sequences. + +Tue Jul 28 15:18:33 EDT 1992: + libi77: insert missed "#ifdef KR_headers" lines around getnum +header in rsne.c. Version not updated. + +NOTE: "index from f2c" now ends with current timestamps of files in +"all from f2c/src", sorted by time. To bring your source up to date, +obtain source files with a timestamp later than the time shown in your +version.c. + +Fri Aug 14 08:07:09 EDT 1992: + libi77: tweak wrt_E in wref.c to avoid signing NaNs. + +Sun Aug 23 19:05:22 EDT 1992: + fc: supply : after O in getopt invocation (for -O1 -O2 -O3). + +Mon Aug 24 18:37:59 EDT 1992: + Recant above tweak to fc: getopt is dumber than I thought; +it's necessary to say -O 1 (etc.). + libF77/README: add comments about ABORT, ERF, DERF, ERFC, DERFC, +GETARG, GETENV, IARGC, SIGNAL, and SYSTEM. + +Tue Oct 27 01:57:42 EST 1992: + libf77, libi77: + 1. Fix botched indirection in signal_.c. + 2. Supply missing l_eof = 0 assignment to s_rsne() in rsne.c (so +end-of-file on other files won't confuse namelist reads of external +files). + 3. Prepend f__ to external names that are only of internal +interest to lib[FI]77. + +Thu Oct 29 12:37:18 EST 1992: + libf77: Fix botch in signal_.c when KR_headers is #defined; +add CFLAGS to makefile. + libi77: trivial change to makefile for consistency with +libF77/makefile. + +Wed Feb 3 02:05:16 EST 1993: + Recognize types INTEGER*1, LOGICAL*1, LOGICAL*2, INTEGER*8. +INTEGER*8 is not well tested and will only work reasonably on +systems where int = 4 bytes, long = 8 bytes; on such systems, +you'll have to modify f2c.h appropriately, changing integer +from long to int and adding typedef long longint. You'll also +have to compile libI77 with Allow_TYQUAD #defined and adjust +libF77/makefile to compile pow_qq.c. In the f2c source, changes +for INTEGER*8 are delimited by #ifdef TYQUAD ... #endif. You +can omit the INTEGER*8 changes by compiling with NO_TYQUAD +#defined. Otherwise, the new command-line option -!i8 +disables recognition of INTEGER*8. + libf77: add pow_qq.c + libi77: add #ifdef Allow_TYQUAD stuff. Changes for INTEGER*1, +LOGICAL*1, and LOGICAL*2 came last 23 July 1992. Fix bug in +backspace (that only bit when the last character of the second +or subsequent buffer read was the previous newline). Guard +against L_tmpnam being too small in endfile.c. For MSDOS, +close and reopen files when copying to truncate. Lengthen +LINTW (buffer size in lwrite.c). + Add \ to the end of #define lines that get broken. + Fix bug in handling NAMELIST of items in EQUIVALENCE. + Under -h (or -hd), convert Hollerith to integer in general expressions +(e.g., assignments), not just when they're passed as arguments, and +blank-pad rather than 0-pad the Hollerith to a multiple of +sizeof(integer) or sizeof(doublereal). + Add command-line option -s, which instructs f2c preserve multi- +dimensional subscripts (by emitting and using appropriate #defines). + Fix glitch (with default type inferences) in examples like + call foo('abc') + end + subroutine foo(goo) + end +This gave two warning messages: + Warning on line 4 of y.f: inconsistent calling sequences for foo: + here 1, previously 2 args and string lengths. + Warning on line 4 of y.f: inconsistent calling sequences for foo: + here 2, previously 1 args and string lengths. +Now the second Warning is suppressed. + Complain about all inconsistent arguments, not just the first. + Switch to automatic creation of "all from f2c/src". For folks +getting f2c source via ftp, this means f2c/src/all.Z is now an +empty file rather than a bundle. + Separate -P and -A: -P no longer implies -A. + +Thu Feb 4 00:32:20 EST 1993: + Fix some glitches (introduced yesterday) with -h . + +Fri Feb 5 01:40:38 EST 1993: + Fix bug in types conveyed for namelists (introduced 3 Feb. 1993). + +Fri Feb 5 21:26:43 EST 1993: + libi77: tweaks to NAMELIST and open (after comments by Harold +Youngren): + 1. Reading a ? instead of &name (the start of a namelist) causes + the namelist being sought to be written to stdout (unit 6); + to omit this feature, compile rsne.c with -DNo_Namelist_Questions. + 2. Reading the wrong namelist name now leads to an error message + and an attempt to skip input until the right namelist name is found; + to omit this feature, compile rsne.c with -DNo_Bad_Namelist_Skip. + 3. Namelist writes now insert newlines before each variable; to omit + this feature, compile xwsne.c with -DNo_Extra_Namelist_Newlines. + 4. For OPEN of sequential files, ACCESS='APPEND' (or + access='anything else starting with "A" or "a"') causes the file to + be positioned at end-of-file, so a write will append to the file. + (This is nonstandard, but does not require modifying data + structures.) + +Mon Feb 8 14:40:37 EST 1993: + Increase number of continuation lines allowed from 19 to 99, +and allow changing this limit with -NC (e.g. -NC200 for 200 lines). + Treat control-Z (at the beginning of a line) as end-of-file: see +the new penultimate paragraph of README. + Fix a rarely seen glitch that could make an error messages to say +"line 0". + +Tue Feb 9 02:05:40 EST 1993 + libi77: change some #ifdef MSDOS lines to #ifdef NON_UNIX_STDIO, +and, in err.c under NON_UNIX_STDIO, avoid close(creat(name,0666)) +when the unit has another file descriptor for name. + +Tue Feb 9 17:12:49 EST 1993 + libi77: more tweaks for NON_UNIX_STDIO: use stdio routines +rather than open, close, creat, seek, fdopen (except for f__isdev). + +Fri Feb 12 15:49:33 EST 1993 + Update src/gram.c (which was forgotten in the recent updates). +Most folks regenerate it anyway (wity yacc or bison). + +Thu Mar 4 17:07:38 EST 1993 + Increase default max labels in computed gotos and alternate returns +to 257, and allow -Nl1234 to specify this number. + Tweak put.c to check p->tag == TADDR in realpart() and imagpart(). + Adjust fc script to allow .r (RATFOR) files and -C (check subscripts). + Avoid declaring strchr in niceprintf.c under -DANSI_Libraries . + gram.c updated again. + libi77: err.c, open.c: take declaration of fdopen from rawio.h. + +Sat Mar 6 07:09:11 EST 1993 + libi77: uio.c: adjust off-end-of-record test for sequential +unformatted reads to respond to err= rather than end= . + +Sat Mar 6 16:12:47 EST 1993 + Treat scalar arguments of the form (v) and v+0, where v is a variable, +as expressions: assign to a temporary variable, and pass the latter. + gram.c updated. + +Mon Mar 8 09:35:38 EST 1993 + "f2c.h from f2c" updated to add types logical1 and integer1 for +LOGICAL*1 and INTEGER*1. ("f2c.h from f2c" is supposed to be the +same as "f2c.h from f2c/src", which was updated 3 Feb. 1993.) + +Mon Mar 8 17:57:55 EST 1993 + Fix rarely seen bug that could cause strange casts in function +invocations (revealed by an example with msdos/f2c.exe). + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only). + +Fri Mar 12 12:37:01 EST 1993 + Fix bug with -s in handling subscripts involving min, max, and +complicated expressions requiring temporaries. + Fix bug in handling COMMONs that need padding by a char array. + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only). + +Fri Mar 12 17:16:16 EST 1993 + libf77, libi77: updated for compiling under C++. + +Mon Mar 15 16:21:37 EST 1993 + libi77: more minor tweaks (for -DKR_headers); Version.c not changed. + +Thu Mar 18 12:37:30 EST 1993 + Flag -r (for discarding carriage-returns on systems that end lines +with carriage-return/newline pairs, e.g. PCs) added to xsum, and +xsum.c converted to ANSI/ISO syntax (with K&R syntax available with +-DKR_headers). [When time permits, the f2c source will undergo a +similar conversion.] + libi77: tweaks to #includes in endfile.c, err.c, open.c, rawio.h; +Version.c not changed. + f2c.ps updated (to pick up revision of 2 Feb. 1993 to f2c.1). + +Fri Mar 19 09:19:26 EST 1993 + libi77: add (char *) casts to malloc and realloc invocations +in err.c, open.c; Version.c not changed. + +Tue Mar 30 07:17:15 EST 1993 + Fix bug introduced 6 March 1993: possible memory corruption when +loops in data statements involve constant subscripts, as in + DATA (GUNIT(1,I),I=0,14)/15*-1/ + +Tue Mar 30 16:17:42 EST 1993 + Fix bug with -s: (floating-point array item)*(complex item) +generates an _subscr() reference for the floating-point array, +but a #define for the _subscr() was omitted. + +Tue Apr 6 12:11:22 EDT 1993 + libi77: adjust error returns for formatted inputs to flush the current +input line when err= is specified. To restore the old behavior (input +left mid-line), either adjust the #definition of errfl in fio.h or omit +the invocation of f__doend in err__fl (in err.c). + +Tue Apr 6 13:30:04 EDT 1993 + Fix bug revealed in + subroutine foo(i) + call goo(int(i)) + end +which now passes a copy of i, rather than i itself. + +Sat Apr 17 11:41:02 EDT 1993 + Adjust appending of underscores to conform with f2c.ps ("A Fortran +to C Converter"): names that conflict with C keywords or f2c type +names now have just one underscore appended (rather than two); add +"integer1", "logical1", "longint" to the keyword list. + Append underscores to names that appear in EQUIVALENCE and are +component names in a structure declared in f2c.h, thus avoiding a +problem caused by the #defines emitted for equivalences. Example: + complex a + equivalence (i,j) + a = 1 ! a.i went awry because of #define i + j = 2 + write(*,*) a, i + end + Adjust line-breaking logic to avoid splitting very long constants +(and names). Example: + ! The next line starts with tab and thus is a free-format line. + a=.012345689012345689012345689012345689012345689012345689012345689012345689 + end + Omit extraneous "return 0;" from entry stubs emitted for multiple +entry points of type character, complex, or double complex. + +Sat Apr 17 14:35:05 EDT 1993 + Fix bug (introduced 4 Feb.) in separating -P from -A that kept f2c +from re-reading a .P file written without -A or -C++ describing a +routine with an external argument. [See the just-added note about +separating -P from -A in the changes above for 3 Feb. 1993.] + Fix bug (type UNKNOWN for V in the example below) revealed by + subroutine a() + external c + call b(c) + end + subroutine b(v) + end + +Sun Apr 18 19:55:26 EDT 1993 + Fix wrong calling sequence for mem() in yesterday's addition to +equiv.c . + +Wed Apr 21 17:39:46 EDT 1993 + Fix bug revealed in + + ASSIGN 10 TO L1 + GO TO 20 + 10 ASSIGN 30 TO L2 + STOP 10 + + 20 ASSIGN 10 TO L2 ! Bug here because 10 had been assigned + ! to another label, then defined. + GO TO L2 + 30 END + +Fri Apr 23 18:38:50 EDT 1993 + Fix bug with -h revealed in + CHARACTER*9 FOO + WRITE(FOO,'(I6)') 1 + WRITE(FOO,'(I6)') 2 ! struct icilist io___3 botched + END + +Tue Apr 27 16:08:28 EDT 1993 + Tweak to makefile: remove "size f2c". + +Tue May 4 23:48:20 EDT 1993 + libf77: tweak signal_ line of f2ch.add . + +Tue Jun 1 13:47:13 EDT 1993 + Fix bug introduced 3 Feb. 1993 in handling multiple entry +points with differing return types -- the postfix array in proc.c +needed a new entry for integer*8 (which resulted in wrong +Multitype suffixes for non-integral types). + For (default) K&R C, generate VOID rather than int functions for +functions of Fortran type character, complex, and double complex. + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only). + +Tue Jun 1 23:11:15 EDT 1993 + f2c.h: add Multitype component g and commented type longint. + proc.c: omit "return 0;" from stubs for complex and double complex +entries (when entries have multiple types); add test to avoid memory +fault with illegal combinations of entry types. + +Mon Jun 7 12:00:47 EDT 1993 + Fix memory fault in + common /c/ m + integer m(1) + data m(1)/1/, m(2)/2/ ! one too many initializers + end + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only). + +Fri Jun 18 13:55:51 EDT 1993 + libi77: change type of signal_ in f2ch.add; change type of il in +union Uint from long to integer (for machines like the DEC Alpha, +where integer should be the same as int). Version.c not changed. + Tweak gram.dcl and gram.head: add semicolons after some rules that +lacked them, and remove an extraneous semicolon. These changes are +completely transparent to our local yacc programs, but apparently +matter on some VMS systems. + +Wed Jun 23 01:02:56 EDT 1993 + Update "fc" shell script, and bring f2c.1 and f2c.1t up to date: +they're meant to be linked with (i.e., the same as) src/f2c.1 and +src/f2c.1t . [In the last update of f2c.1* (2 Feb. 1993), only +src/f2c.1 and src/f2c.1t got changed -- a mistake.] + +Wed Jun 23 09:04:31 EDT 1993 + libi77: fix bug in format reversions for internal writes. +Example: + character*60 lines(2) + write(lines,"('n =',i3,2(' more text',i3))") 3, 4, 5, 6 + write(*,*) 'lines(1) = ', lines(1) + write(*,*) 'lines(2) = ', lines(2) + end +gave an error message that began "iio: off end of record", rather +than giving the correct output: + + lines(1) = n = 3 more text 4 more text 5 + lines(2) = more text 6 more text + +Thu Aug 5 11:31:14 EDT 1993 + libi77: lread.c: fix bug in handling repetition counts for logical +data (during list or namelist input). Change struct f__syl to +struct syl (for buggy compilers). + +Sat Aug 7 16:05:30 EDT 1993 + libi77: lread.c (again): fix bug in namelist reading of incomplete +logical arrays. + Fix minor calling-sequence errors in format.c, output.c, putpcc.c: +should be invisible. + +Mon Aug 9 09:12:38 EDT 1993 + Fix erroneous cast under -A in translating + character*(*) function getc() + getc(2:3)=' ' !wrong cast in first arg to s_copy + end + libi77: lread.c: fix bug in namelist reading of an incomplete array +of numeric data followed by another namelist item whose name starts +with 'd', 'D', 'e', or 'E'. + +Fri Aug 20 13:22:10 EDT 1993 + Fix bug in do while revealed by + subroutine skdig (line, i) + character line*(*), ch*1 + integer i + logical isdigit + isdigit(ch) = ch.ge.'0' .and. ch.le.'9' + do while (isdigit(line(i:i))) ! ch__1[0] was set before + ! "while(...) {...}" + i = i + 1 + enddo + end + +Fri Aug 27 08:22:54 EDT 1993 + Add #ifdefs to avoid declaring atol when it is a macro; version.c +not updated. + +Wed Sep 8 12:24:26 EDT 1993 + libi77: open.c: protect #include "sys/..." with +#ifndef NON_UNIX_STDIO; Version date not changed. + +Thu Sep 9 08:51:21 EDT 1993 + Adjust "include" to interpret file names relative to the directory +of the file that contains the "include". + +Fri Sep 24 00:56:12 EDT 1993 + Fix offset error resulting from repeating the same equivalence +statement twice. Example: + real a(2), b(2) + equivalence (a(2), b(2)) + equivalence (a(2), b(2)) + end + Increase MAXTOKENLEN (to roughly the largest allowed by ANSI C). + +Mon Sep 27 08:55:09 EDT 1993 + libi77: endfile.c: protect #include "sys/types.h" with +#ifndef NON_UNIX_STDIO; Version.c not changed. + +Fri Oct 15 15:37:26 EDT 1993 + Fix rarely seen parsing bug illustrated by + subroutine foo(xabcdefghij) + character*(*) xabcdefghij + IF (xabcdefghij.NE.'##') GOTO 40 + 40 end +in which the spacing in the IF line is crucial. + +Thu Oct 21 13:55:11 EDT 1993 + Give more meaningful error message (then "unexpected character in +cds") when constant simplification leads to Infinity or NaN. + +Wed Nov 10 15:01:05 EST 1993 + libi77: backspace.c: adjust, under -DMSDOS, to cope with MSDOS +text files, as handled by some popular PC C compilers. Beware: +the (defective) libraries associated with these compilers assume lines +end with \r\n (conventional MS-DOS text files) -- and ftell (and +hence the current implementation of backspace) screws up if lines with +just \n. + +Thu Nov 18 09:37:47 EST 1993 + Give a better error (than "control stack empty") for an extraneous +ENDDO. Example: + enddo + end + Update comments about ftp in "readme from f2c". + +Sun Nov 28 17:26:50 EST 1993 + Change format of time stamp in version.c to yyyymmdd. + Sort parameter adjustments (or complain of impossible dependencies) +so that dummy arguments are referenced only after being adjusted. +Example: + subroutine foo(a,b) + integer a(2) ! a must be adjusted before b + double precision b(a(1),a(2)) + call goo(b(3,4)) + end + Adjust structs for initialized common blocks and equivalence classes +to omit the trailing struct component added to force alignment when +padding already forces the desired alignment. Example: + PROGRAM TEST + COMMON /Z/ A, CC + CHARACTER*4 CC + DATA cc /'a'/ + END +now gives + struct { + integer fill_1[1]; + char e_2[4]; + } z_ = { {0}, {'a', ' ', ' ', ' '} }; +rather than +struct { + integer fill_1[1]; + char e_2[4]; + real e_3; + } z_ = { {0}, {'a', ' ', ' ', ' '}, (float)0. }; + +Wed Dec 8 16:24:43 EST 1993 + Adjust lex.c to recognize # nnn "filename" lines emitted by cpp; +this affects the file names and line numbers in error messages and +the #line lines emitted under -g. + Under -g, arrange for a file that starts with an executable +statement to have the first #line line indicate line 1, rather +than the line number of the END statement ending the main program. + Adjust fc script to run files ending in .F through /lib/cpp. + Fix bug ("Impossible tag 2") in + if (t .eq. (0,2)) write(*,*) 'Bug!' + end + libi77: iio.c: adjust internal formatted reads to treat short records +as though padded with blanks (rather than causing an "off end of record" +error). + +Wed Dec 15 15:19:15 EST 1993 + fc: adjusted for .F files to pass -D and -I options to cpp. + +Fri Dec 17 20:03:38 EST 1993 + Fix botch introduced 28 Nov. 1993 in vax.c; change "version of" +to "version". + +Tue Jan 4 15:39:52 EST 1994 + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only). + +Wed Jan 19 08:55:19 EST 1994 + Arrange to accept + integer Nx, Ny, Nz + parameter (Nx = 10, Ny = 20) + parameter (Nz = max(Nx, Ny)) + integer c(Nz) + call foo(c) + end +rather than complaining "Declaration error for c: adjustable dimension +on non-argument". The necessary changes cause some hitherto unfolded +constant expressions to be folded. + Accept BYTE as a synonym for INTEGER*1. + +Thu Jan 27 08:57:40 EST 1994 + Fix botch in changes of 19 Jan. 1994 that broke entry points with +multi-dimensional array arguments that did not appear in the subprogram +argument list and whose leading dimensions depend on arguments. + +Mon Feb 7 09:24:30 EST 1994 + Remove artifact in "fc" script that caused -O to be ignored: + 87c87 + < # lcc ignores -O... + --- + > CFLAGS="$CFLAGS $O" + +Sun Feb 20 17:04:58 EST 1994 + Fix bugs reading .P files for routines with arguments of type +INTEGER*1, INTEGER*8, LOGICAL*2. + Fix glitch in reporting inconsistent arguments for routines involving +character arguments: "arg n" had n too large by the number of +character arguments. + +Tue Feb 22 20:50:08 EST 1994 + Trivial changes to data.c format.c main.c niceprintf.c output.h and +sysdep.h (consistency improvements). + libI77: lread.c: check for NULL return from realloc. + +Fri Feb 25 23:56:08 EST 1994 + output.c, sysdep.h: arrange for -DUSE_DTOA to use dtoa.c and g_fmt.c +for correctly rounded decimal values on IEEE-arithmetic machines +(plus machines with VAX and IBM-mainframe arithmetic). These +routines are available from netlib's fp directory. + msdos/f2cx.exe.Z and msdos/f2c.exe.Z updated (ftp access only); the +former uses -DUSE_DTOA to keep 12 from printing as 12.000000000000001. + vax.c: fix wrong arguments to badtag and frchain introduced +28 Nov. 1993. + Source for f2c converted to ANSI/ISO format, with the K&R format +available by compilation with -DKR_headers . + Arrange for (double precision expression) relop (single precision +constant) to retain the single-precision nature of the constant. +Example: + double precision t + if (t .eq. 0.3) ... + +Mon Feb 28 11:40:24 EST 1994 + README updated to reflect a modification just made to netlib's +"dtoa.c from fp": +96a97,105 +> Also add the rule +> +> dtoa.o: dtoa.c +> $(CC) -c $(CFLAGS) -DMALLOC=ckalloc -DIEEE... dtoa.c +> +> (without the initial tab) to the makefile, where IEEE... is one of +> IEEE_MC68k, IEEE_8087, VAX, or IBM, depending on your machine's +> arithmetic. See the comments near the start of dtoa.c. +> + +Sat Mar 5 09:41:52 EST 1994 + Complain about functions with the name of a previously declared +common block (which is illegal). + New option -d specifies the directory for output .c and .P files; +f2c.1 and f2c.1t updated. The former undocumented debug option -dnnn +is now -Dnnn. + +Thu Mar 10 10:21:44 EST 1994 + libf77: add #undef min and #undef max lines to s_paus.c s_stop.c +and system_.c; Version.c not changed. + libi77: add -DPad_UDread lines to uio.c and explanation to README: + Some buggy Fortran programs use unformatted direct I/O to write + an incomplete record and later read more from that record than + they have written. For records other than the last, the unwritten + portion of the record reads as binary zeros. The last record is + a special case: attempting to read more from it than was written + gives end-of-file -- which may help one find a bug. Some other + Fortran I/O libraries treat the last record no differently than + others and thus give no help in finding the bug of reading more + than was written. If you wish to have this behavior, compile + uio.c with -DPad_UDread . +Version.c not changed. + +Tue Mar 29 17:27:54 EST 1994 + Adjust make_param so dimensions involving min, max, and other +complicated constant expressions do not provoke error messages +about adjustable dimensions on non-arguments. + Fix botch introduced 19 Jan 1994: "adjustable dimension on non- +argument" messages could cause some things to be freed twice. + +Tue May 10 07:55:12 EDT 1994 + Trivial changes to exec.c, p1output.c, parse_args.c, proc.c, +and putpcc.c: change arguments from + type foo[] +to + type *foo +for consistency with defs.h. For most compilers, this makes no +difference. + +Thu Jun 2 12:18:18 EDT 1994 + Fix bug in handling FORMAT statements that have adjacent character +(or Hollerith) strings: an extraneous \002 appeared between the +strings. + libf77: under -DNO_ONEXIT, arrange for f_exit to be called just +once; previously, upon abnormal termination (including stop statements), +it was called twice. + +Mon Jun 6 15:52:57 EDT 1994 + libf77: Avoid references to SIGABRT and SIGIOT if neither is defined; +Version.c not changed. + libi77: Add cast to definition of errfl() in fio.h; this only matters +on systems with sizeof(int) < sizeof(long). Under -DNON_UNIX_STDIO, +use binary mode for direct formatted files (to avoid any confusion +connected with \n characters). + +Fri Jun 10 16:47:31 EDT 1994 + Fix bug under -A in handling unreferenced (and undeclared) +external arguments in subroutines with multiple entry points. Example: + subroutine m(fcn,futil) + external fcn,futil + call fcn + entry mintio(i1) ! (D_fp)0 rather than (U_fp)0 for futil + end + +Wed Jun 15 10:38:14 EDT 1994 + Allow char(constant expression) function in parameter declarations. +(This was probably broken in the changes of 29 March 1994.) + +Fri Jul 1 23:54:00 EDT 1994 + Minor adjustments to makefile (rule for f2c.1 commented out) and +sysdep.h (#undef KR_headers if __STDC__ is #defined, and base test +for ANSI_Libraries and ANSI_Prototypes on KR_headers rather than +__STDC__); version.c touched but not changed. + libi77: adjust fp.h so local.h is only needed under -DV10; +Version.c not changed. + +Tue Jul 5 03:05:46 EDT 1994 + Fix segmentation fault in + subroutine foo(a,b,k) + data i/1/ + double precision a(k,1) ! sequence error: must precede data + b = a(i,1) + end + libi77: Fix bug (introduced 6 June 1994?) in reopening files under +NON_UNIX_STDIO. + Fix some error messages caused by illegal Fortran. Examples: +* 1. + x(i) = 0 !Missing declaration for array x + call f(x) !Said Impossible storage class 8 in routine mkaddr + end !Now says invalid use of statement function x +* 2. + f = g !No declaration for g; by default it's a real variable + call g !Said invalid class code 2 for function g + end !Now says g cannot be called +* 3. + intrinsic foo !Invalid intrinsic name + a = foo(b) !Said intrcall: bad intrgroup 0 + end !Now just complains about line 1 + +Tue Jul 5 11:14:26 EDT 1994 + Fix glitch in handling erroneous statement function declarations. +Example: + a(j(i) - i) = a(j(i) - i) + 1 ! bad statement function + call foo(a(3)) ! Said Impossible type 0 in routine mktmpn + end ! Now warns that i and j are not used + +Wed Jul 6 17:31:25 EDT 1994 + Tweak test for statement functions that (illegally) call themselves; +f2c will now proceed to check for other errors, rather than bailing +out at the first recursive statement function reference. + Warn about but retain divisions by 0 (instead of calling them +"compiler errors" and quiting). On IEEE machines, this permits + double precision nan, ninf, pinf + nan = 0.d0/0.d0 + pinf = 1.d0/0.d0 + ninf = -1.d0/0.d0 + write(*,*) 'nan, pinf, ninf = ', nan, pinf, ninf + end +to print + nan, pinf, ninf = NaN Infinity -Infinity + libi77: wref.c: protect with #ifdef GOOD_SPRINTF_EXPONENT an +optimization that requires exponents to have 2 digits when 2 digits +suffice. lwrite.c wsfe.c (list and formatted external output): +omit ' ' carriage-control when compiled with -DOMIT_BLANK_CC . +Off-by-one bug fixed in character count for list output of character +strings. Omit '.' in list-directed printing of Nan, Infinity. + +Mon Jul 11 13:05:33 EDT 1994 + src/gram.c updated. + +Tue Jul 12 10:24:42 EDT 1994 + libi77: wrtfmt.c: under G11.4, write 0. as " .0000 " rather +than " .0000E+00". + +Thu Jul 14 17:55:46 EDT 1994 + Fix glitch in changes of 6 July 1994 that could cause erroneous +"division by zero" warnings (or worse). Example: + subroutine foo(a,b) + y = b + a = a / y ! erroneous warning of division by zero + end + +Mon Aug 1 16:45:17 EDT 1994 + libi77: lread.c rsne.c: for benefit of systems with a buggy stdio.h, +declare ungetc when neither KR_headers nor ungetc is #defined. +Version.c not changed. + +Wed Aug 3 01:53:00 EDT 1994 + libi77: lwrite.c (list output): do not insert a newline when +appending an oversize item to an empty line. + +Mon Aug 8 00:51:01 EDT 1994 + Fix bug (introduced 3 Feb. 1993) that, under -i2, kept LOGICAL*2 +variables from appearing in INQUIRE statements. Under -I2, allow +LOGICAL*4 variables to appear in INQUIRE. Fix intrinsic function +LEN so it returns a short value under -i2, a long value otherwise. + exec.c: fix obscure memory fault possible with bizarre (and highly +erroneous) DO-loop syntax. + +Fri Aug 12 10:45:57 EDT 1994 + libi77: fix glitch that kept ERR= (in list- or format-directed input) +from working after a NAMELIST READ. + +Thu Aug 25 13:58:26 EDT 1994 + Suppress -s when -C is specified. + Give full pathname (netlib@research.att.com) for netlib in readme and +src/README. + +Wed Sep 7 22:13:20 EDT 1994 + libi77: typesize.c: adjust to allow types LOGICAL*1, LOGICAL*2, +INTEGER*1, and (under -DAllow_TYQUAD) INTEGER*8 in NAMELISTs. + +Fri Sep 16 17:50:18 EDT 1994 + Change name adjustment for reserved words: instead of just appending +"_" (a single underscore), append "_a_" to local variable names to avoid +trouble when a common block is named a reserved word and the same +reserved word is also a local variable name. Example: + common /const/ a,b,c + real const(3) + equivalence (const(1),a) + a = 1.234 + end + Arrange for ichar() to treat characters as unsigned. + libf77: s_cmp.c: treat characters as unsigned in comparisons. +These changes for unsignedness only matter for strings that contain +non-ASCII characters. Now ichar() should always be >= 0. + +Sat Sep 17 11:19:32 EDT 1994 + fc: set rc=$? before exit (to get exit code right in trap code). + +Mon Sep 19 17:49:43 EDT 1994 + libf77: s_paus.c: flush stderr after PAUSE; add #ifdef MSDOS stuff. + libi77: README: point out general need for -DMSDOS under MS-DOS. + +Tue Sep 20 11:42:30 EDT 1994 + Fix bug in comparing identically named common blocks, in which +all components have the same names and types, but at least one is +dimensioned (1) and the other is not dimensioned. Example: + subroutine foo + common /ab/ a + a=1. !!! translated correctly to ab_1.a = (float)1.; + end + subroutine goo + common /ab/ a(1) + a(1)=2. !!! translated erroneously to ab_1.a[0] = (float)2. + end + +Tue Sep 27 23:47:34 EDT 1994 + Fix bug introduced 16 Sept. 1994: don't add _a_ to C keywords +used as external names. In fact, return to earlier behavior of +appending __ to C keywords unless they are used as external names, +in which case they get just one underscore appended. + Adjust constant handling so integer and logical PARAMETERs retain +type information, particularly under -I2. Example: + SUBROUTINE FOO + INTEGER I + INTEGER*1 I1 + INTEGER*2 I2 + INTEGER*4 I4 + LOGICAL L + LOGICAL*1 L1 + LOGICAL*2 L2 + LOGICAL*4 L4 + PARAMETER (L=.FALSE., L1=.FALSE., L2=.FALSE., L4=.FALSE.) + PARAMETER (I=0,I1=0,I2=0,I4=0) + CALL DUMMY(I, I1, I2, I4, L, L1, L2, L4) + END + f2c.1t: Change f\^2c to f2c (omit half-narrow space) in line following +".SH NAME" for benefit of systems that cannot cope with troff commands +in this context. + +Wed Sep 28 12:45:19 EDT 1994 + libf77: s_cmp.c fix glitch in -DKR_headers version introduced +12 days ago. + +Thu Oct 6 09:46:53 EDT 1994 + libi77: util.c: omit f__mvgbt (which is never used). + f2c.h: change "long" to "long int" to facilitate the adjustments +by means of sed described above. Comment out unused typedef of Long. + +Fri Oct 21 18:02:24 EDT 1994 + libf77: add s_catow.c and adjust README to point out that changing +"s_cat.o" to "s_catow.o" in the makefile will permit the target of a +concatenation to appear on its right-hand side (contrary to the +Fortran 77 Standard and at the cost of some run-time efficiency). + +Wed Nov 2 00:03:58 EST 1994 + Adjust -g output to contain only one #line line per statement, +inserting \ before the \n ending lines broken because of their +length [this insertion was recanted 10 Dec. 1994]. This change +accommodates an idiocy in the ANSI/ISO C standard, which leaves +undefined the behavior of #line lines that occur within the arguments +to a macro call. + +Wed Nov 2 14:44:27 EST 1994 + libi77: under compilation with -DALWAYS_FLUSH, flush buffers at +the end of each write statement, and test (via the return from +fflush) for write failures, which can be caught with an ERR= +specifier in the write statement. This extra flushing slows +execution, but can abort execution or alter the flow of control +when a disk fills up. + f2c/src/io.c: Add ERR= test to e_wsle invocation (end of +list-directed external output) to catch write failures when libI77 +is compiled with -DALWAYS_FLUSH. + +Thu Nov 3 10:59:13 EST 1994 + Fix bug in handling dimensions involving certain intrinsic +functions of constant expressions: the expressions, rather than +pointers to them, were passed. Example: + subroutine subtest(n,x) + real x(2**n,n) ! pow_ii(2,n) was called; now it's pow_ii(&c__2,n) + x(2,2)=3. + end + +Tue Nov 8 23:56:30 EST 1994 + malloc.c: remove assumption that only malloc calls sbrk. This +appears to make malloc.c useful on RS6000 systems. + +Sun Nov 13 13:09:38 EST 1994 + Turn off constant folding of integers used in floating-point +expressions, so the assignment in + subroutine foo(x) + double precision x + x = x*1000000*500000 + end +is rendered as + *x = *x * 1000000 * 500000; +rather than as + *x *= 1783793664; + +Sat Dec 10 16:31:40 EST 1994 + Supply a better error message (than "Impossible type 14") for + subroutine foo + foo = 3 + end + Under -g, convey name of included files to #line lines. + Recant insertion of \ introduced (under -g) 2 Nov. 1994. + +Thu Dec 15 14:33:55 EST 1994 + New command-line option -Idir specifies directories in which to +look for non-absolute include files (after looking in the directory +of the current input file). There can be several -Idir options, each +specifying one directory. All -Idir options are considered, from +left to right, until a suitably named file is found. The -I2 and -I4 +command-line options have precedence, so directories named 2 or 4 +must be spelled by some circumlocation, such as -I./2 . + f2c.ps updated to mention the new -Idir option, correct a typo, +and bring the man page at the end up to date. + lex.c: fix bug in reading line numbers in #line lines. + fc updated to pass -Idir options to f2c. + +Thu Dec 29 09:48:03 EST 1994 + Fix bug (e.g., addressing fault) in diagnosing inconsistency in +the type of function eta in the following example: + function foo(c1,c2) + double complex foo,c1,c2 + double precision eta + foo = eta(c1,c2) + end + function eta(c1,c2) + double complex eta,c1,c2 + eta = c1*c2 + end + +Mon Jan 2 13:27:26 EST 1995 + Retain casts for SNGL (or FLOAT) that were erroneously optimized +away. Example: + subroutine foo(a,b) + double precision a,b + a = float(b) ! now rendered as *a = (real) (*b); + end + Use float (rather than double) temporaries in certain expressions +of type complex. Example: the temporary for sngl(b) in + complex a + double precision b + a = sngl(b) - (3.,4.) +is now of type float. + +Fri Jan 6 00:00:27 EST 1995 + Adjust intrinsic function cmplx to act as dcmplx (returning +double complex rather than complex) if either of its args is of +type double precision. The double temporaries used prior to 2 Jan. +1995 previously gave it this same behavior. + +Thu Jan 12 12:31:35 EST 1995 + Adjust -krd to use double temporaries in some calculations of +type complex. + libf77: pow_[dhiqrz][hiq].c: adjust x**i to work on machines +that sign-extend right shifts when i is the most negative integer. + +Wed Jan 25 00:14:42 EST 1995 + Fix memory fault in handling overlapping initializations in + block data + common /zot/ d + double precision d(3) + character*6 v(4) + real r(2) + equivalence (d(3),r(1)), (d(1),v(1)) + data v/'abcdef', 'ghijkl', 'mnopqr', 'stuvwx'/ + data r/4.,5./ + end + names.c: add "far", "huge", "near" to c_keywords (causing them +to have __ appended when used as local variables). + libf77: add s_copyow.c, an alternative to s_copy.c for handling +(illegal) character assignments where the right- and left-hand +sides overlap, as in a(2:4) = a(1:3). + +Thu Jan 26 14:21:19 EST 1995 + libf77: roll s_catow.c and s_copyow.c into s_cat.c and s_copy.c, +respectively, allowing the left-hand side of a character assignment +to appear on its right-hand side unless s_cat.c and s_copy.c are +compiled with -DNO_OVERWRITE (which is a bit more efficient). +Fortran 77 forbids the left-hand side from participating in the +right-hand side (of a character assignment), but Fortran 90 allows it. + libi77: wref.c: fix glitch in printing the exponent of 0 when +GOOD_SPRINTF_EXPONENT is not #defined. + +Fri Jan 27 12:25:41 EST 1995 + Under -C++ -ec (or -C++ -e1c), surround struct declarations with + #ifdef __cplusplus + extern "C" { + #endif +and + #ifdef __cplusplus + } + #endif +(This isn't needed with cfront, but apparently is necessary with +some other C++ compilers.) + libf77: minor tweak to s_copy.c: copy forward whenever possible +(for better cache behavior). + +Wed Feb 1 10:26:12 EST 1995 + Complain about parameter statements that assign values to dummy +arguments, as in + subroutine foo(x) + parameter(x = 3.4) + end + +Sat Feb 4 20:22:02 EST 1995 + fc: omit "lib=/lib/num/lib.lo". + +Wed Feb 8 08:41:14 EST 1995 + Minor changes to exec.c, putpcc.c to avoid "bad tag" or "error +in frexpr" with certain invalid Fortran. + +Sat Feb 11 08:57:39 EST 1995 + Complain about integer overflows, both in simplifying integer +expressions, and in converting integers from decimal to binary. + Fix a memory fault in putcx1() associated with invalid input. + +Thu Feb 23 11:20:59 EST 1995 + Omit MAXTOKENLEN; realloc token if necessary (to handle very long +strings). + +Fri Feb 24 11:02:00 EST 1995 + libi77: iio.c: z_getc: insert (unsigned char *) to allow internal +reading of characters with high-bit set (on machines that sign-extend +characters). + +Tue Mar 14 18:22:42 EST 1995 + Fix glitch (in io.c) in handling 0-length strings in format +statements, as in + write(*,10) + 10 format(' ab','','cd') + libi77: lread.c and rsfe.c: adjust s_rsle and s_rsfe to check for +end-of-file (to prevent infinite loops with empty read statements). + +Wed Mar 22 10:01:46 EST 1995 + f2c.ps: adjust discussion of -P on p. 7 to reflect a change made +3 Feb. 1993: -P no longer implies -A. + +Fri Apr 21 18:35:00 EDT 1995 + fc script: remove absolute paths (since PATH specifies only standard +places). On most systems, it's still necessary to adjust the PATH +assignment at the start of fc to fit the local conventions. + +Fri May 26 10:03:17 EDT 1995 + fc script: add recognition of -P and .P files. + libi77: iio.c: z_wnew: fix bug in handling T format items in internal +writes whose last item is written to an earlier position than some +previous item. + +Wed May 31 11:39:48 EDT 1995 + libf77: added subroutine exit(rc) (with integer return code rc), +which works like a stop statement but supplies rc as the program's +return code. + +Fri Jun 2 11:56:50 EDT 1995 + Fix memory fault in + parameter (x=2.) + data x /2./ + end +This now elicits two error messages; the second ("too many +initializers"), though not desirable, seems hard to eliminate +without considerable hassle. + +Mon Jul 17 23:24:20 EDT 1995 + Fix botch in simplifying constants in certain complex +expressions. Example: + subroutine foo(s,z) + double complex z + double precision s, M, P + parameter ( M = 100.d0, P = 2.d0 ) + z = M * M / s * dcmplx (1.d0, P/M) +*** The imaginary part of z was miscomputed *** + end + Under -ext, complain about nonintegral dimensions. + +Fri Jul 21 11:18:36 EDT 1995 + Fix glitch on line 159 of init.c: change + "(shortlogical *)0)", +to + "(shortlogical *)0", +This affects multiple entry points when some but not all have +arguments of type logical*2. + libi77: adjust lwrite.c, wref.c, wrtfmt.c so compiling with +-DWANT_LEAD_0 causes formatted writes of floating-point numbers of +magnitude < 1 to have an explicit 0 before the decimal point (if the +field-width permits it). Note that the Fortran 77 Standard leaves it +up to the implementation whether to supply these superfluous zeros. + +Tue Aug 1 09:25:56 EDT 1995 + Permit real (or double precision) parameters in dimension expressions. + +Mon Aug 7 08:04:00 EDT 1995 + Append "_eqv" rather than just "_" to names that that appear in +EQUIVALENCE statements as well as structs in f2c.h (to avoid a +conflict when these names also name common blocks). + +Tue Aug 8 12:49:02 EDT 1995 + Modify yesterday's change: merge st_fields with c_keywords, to +cope with equivalences introduced to permit initializing numeric +variables with character data. DATA statements causing these +equivalences can appear after executable statements, so the only +safe course is to rename all local variable with names in the +former st_fields list. This has the unfortunate side effect that +the common local variable "i" will henceforth be renamed "i__". + +Wed Aug 30 00:19:32 EDT 1995 + libf77: add F77_aloc, now used in s_cat and system_ (to allocate +memory and check for failure in so doing). + libi77: improve MSDOS logic in backspace.c. + +Wed Sep 6 09:06:19 EDT 1995 + libf77: Fix return type of system_ (integer) under -DKR_headers. + libi77: Move some f_init calls around for people who do not use +libF77's main(); now open and namelist read statements that are the +first I/O statements executed should work right in that context. +Adjust namelist input to treat a subscripted name whose subscripts do +not involve colons similarly to the name without a subscript: accept +several values, stored in successive elements starting at the +indicated subscript. Adjust namelist output to quote character +strings (avoiding confusion with arrays of character strings). + +Thu Sep 7 00:36:04 EDT 1995 + Fix glitch in integer*8 exponentiation function: it's pow_qq, not +pow_qi. + libi77: fix some bugs with -DAllow_TYQUAD (for integer*8); when +looking for the &name that starts NAMELIST input, treat lines whose +first nonblank character is something other than &, $, or ? as +comment lines (i.e., ignore them), unless rsne.c is compiled with +-DNo_Namelist_Comments. + +Thu Sep 7 09:05:40 EDT 1995 + libi77: rdfmt.c: one more tweak for -DAllow_TYQUAD. + +Tue Sep 19 00:03:02 EDT 1995 + Adjust handling of floating-point subscript bounds (a questionable +f2c extension) so subscripts in the generated C are of integral type. + Move #define of roundup to proc.c (where its use is commented out); +version.c left at 19950918. + +Wed Sep 20 17:24:19 EDT 1995 + Fix bug in handling ichar() under -h. + +Thu Oct 5 07:52:56 EDT 1995 + libi77: wrtfmt.c: fix bug with t editing (f__cursor was not always +zeroed in mv_cur). + +Tue Oct 10 10:47:54 EDT 1995 + Under -ext, warn about X**-Y and X**+Y. Following the original f77, +f2c treats these as X**(-Y) and X**(+Y), respectively. (They are not +allowed by the official Fortran 77 Standard.) Some Fortran compilers +give a bizarre interpretation to larger contexts, making multiplication +noncommutative: they treat X**-Y*Z as X**(-Y*Z) rather than X**(-Y)*Z, +which, following the rules of Fortran 77, is the same as (X**(-Y))*Z. + +Wed Oct 11 13:27:05 EDT 1995 + libi77: move defs of f__hiwater, f__svic, f__icptr from wrtfmt.c +to err.c. This should work around a problem with buggy loaders and +sometimes leads to smaller executable programs. + +Sat Oct 21 23:54:22 EDT 1995 + Under -h, fix bug in the treatment of ichar('0') in arithmetic +expressions. + Demote to -dneg (a new command-line option not mentioned in the +man page) imitation of the original f77's treatment of unary minus +applied to a REAL operand (yielding a DOUBLE PRECISION result). +Previously this imitation (which was present for debugging) occurred +under (the default) -!R. It is still suppressed by -R. + +Tue Nov 7 23:52:57 EST 1995 + Adjust assigned GOTOs to honor SAVE declarations. + Add comments about ranlib to lib[FI]77/README and makefile. + +Tue Dec 19 22:54:06 EST 1995 + libf77: s_cat.c: fix bug when 2nd or later arg overlaps lhs. + +Tue Jan 2 17:54:00 EST 1996 + libi77: rdfmt.c: move #include "ctype.h" up before "stdlib.h"; no +change to Version.c. + +Sun Feb 25 22:20:20 EST 1996 + Adjust expr.c to permit raising the integer constants 1 and -1 to +negative constant integral powers. + Avoid faulting when -T and -d are not followed by a directory name +(immediately, without intervening spaces). + +Wed Feb 28 12:49:01 EST 1996 + Fix a glitch in handling complex parameters assigned a "wrong" type. +Example: + complex d, z + parameter(z = (0d0,0d0)) + data d/z/ ! elicited "non-constant initializer" + call foo(d) + end + +Thu Feb 29 00:53:12 EST 1996 + Fix bug in handling character parameters assigned a char() value. +Example: + character*2 b,c + character*1 esc + parameter(esc = char(27)) + integer i + data (b(i:i),i=1,2)/esc,'a'/ + data (c(i:i),i=1,2)/esc,'b'/ ! memory fault + call foo(b,c) + end + +Fri Mar 1 23:44:51 EST 1996 + Fix glitch in evaluating .EQ. and .NE. when both operands are +logical constants (.TRUE. or .FALSE.). + +Fri Mar 15 17:29:54 EST 1996 + libi77: lread.c, rsfe.c: honor END= in READ stmts with empty iolist. + +Tue Mar 19 23:08:32 EST 1996 + lex.c: arrange for a "statement" consisting of a single short bogus +keyword to elicit an error message showing the whole keyword. The +error message formerly omitted the last letter of the bad keyword. + libf77: s_cat.c: supply missing break after overlap detection. + +Mon May 13 23:35:26 EDT 1996 + Recognize Fortran 90's /= as a synonym for .NE.. (<> remains a +synonym for .NE..) + Emit an empty int function of no arguments to supply an external +name to named block data subprograms (so they can be called somewhere +to force them to be loaded from a library). + Fix bug (memory fault) in handling the following illegal Fortran: + parameter(i=1) + equivalence(i,j) + end + Treat cdabs, cdcos, cdexp, cdlog, cdsin, and cdsqrt as synonyms for +the double complex intrinsics zabs, zcos, zexp, zlog, zsin, and zsqrt, +respectively, unless -cd is specified. + Recognize the Fortran 90 bit-manipulation intrinsics btest, iand, +ibclr, ibits, ibset, ieor, ior, ishft, and ishftc, unless -i90 is +specified. Note that iand, ieor, and ior are thus now synonyms for +"and", "xor", and "or", respectively. + Add three macros (bit_test, bit_clear, bit_set) to f2c.h for use +with btest, ibclr, and ibset, respectively. Add new functions +[lq]bit_bits, [lq]bit_shift, and [lq]_bit_cshift to libF77 for +use with ibits, ishft, and ishftc, respectively. + Add integer function ftell(unit) (returning -1 on error) and +subroutine fseek(unit, offset, whence, *) to libI77 (with branch to +label * on error). + +Tue May 14 23:21:12 EDT 1996 + Fix glitch (possible memory fault, or worse) in handling multiple +entry points with names over 28 characters long. + +Mon Jun 10 01:20:16 EDT 1996 + Update netlib E-mail and ftp addresses in f2c/readme and +f2c/src/readme (which are different files) -- to reflect the upcoming +breakup of AT&T. + libf77: trivial tweaks to F77_aloc.c and system_.c; Version.c not +changed. + libi77: Adjust rsli.c and lread.c so internal list input with too +few items in the input string will honor end= . + +Mon Jun 10 22:59:57 EDT 1996 + Add Bits_per_Byte to sysdep.h and adjust definition of Table_size +to depend on Bits_per_Byte (forcing Table_size to be a power of 2); in +lex.c, change "comstart[c & 0xfff]" to "comstart[c & (Table_size-1)]" +to avoid an out-of-range subscript on end-of-file. + +Wed Jun 12 00:24:28 EDT 1996 + Fix bug in output.c (dereferencing a freed pointer) revealed in + print * !np in out_call in output.c clobbered by free + end !during out_expr. + +Wed Jun 19 08:12:47 EDT 1996 + f2c.h: add types uinteger, ulongint (for libF77); add qbit_clear +and qbit_set macros (in a commented-out section) for integer*8. + For integer*8, use qbit_clear and qbit_set for ibclr and ibset. + libf77: add casts to unsigned in [lq]bitshft.c. + +Thu Jun 20 13:30:43 EDT 1996 + Complain at character*(*) in common (rather than faulting). + Fix bug in recognizing hex constants that start with "16#" (e.g., +16#1234abcd, which is a synonym for z'1234abcd'). + Fix bugs in constant folding of expressions involving btest, ibclr, +and ibset. + Fix bug in constant folding of rshift(16#80000000, -31) (on a 32-bit +machine; more generally, the bug was in constant folding of +rshift(ibset(0,NBITS-1), 1-NBITS) when f2c runs on a machine with +long ints having NBITS bits. + +Mon Jun 24 07:58:53 EDT 1996 + Adjust struct Literal and newlabel() function to accommodate huge +source files (with more than 32767 newlabel() invocations). + Omit .c file when the .f file has a missing final end statement. + +Wed Jun 26 14:00:02 EDT 1996 + libi77: Add discussion of MXUNIT (highest allowed Fortran unit number) +to libI77/README. + +Fri Jun 28 14:16:11 EDT 1996 + Fix glitch with -onetrip: the temporary variable used for nonconstant +initial loop variable values was recycled too soon. Example: + do i = j+1, k + call foo(i+1) ! temp for j+1 was reused here + enddo + end + +Tue Jul 2 16:11:27 EDT 1996 + formatdata.c: add a 0 to the end of the basetype array (for TYBLANK) +(an omission that was harmless on most machines). + expr.c: fix a dereference of NULL that was only possible with buggy +input, such as + subroutine $sub(s) ! the '$' is erroneous + character s*(*) + s(1:) = ' ' + end + +Sat Jul 6 00:44:56 EDT 1996 + Fix glitch in the intrinsic "real" function when applied to a +complex (or double complex) variable and passed as an argument to +some intrinsic functions. Example: + complex a + b = sqrt(a) + end + Fix glitch (only visible if you do not use f2c's malloc and the +malloc you do use is defective in the sense that malloc(0) returns 0) +in handling include files that end with another include (perhaps +followed by comments). + Fix glitch with character*(*) arguments named "h" and "i" when +the body of the subroutine invokes the intrinsic LEN function. + Arrange that after a previous "f2c -P foo.f" has produced foo.P, +running "f2c foo.P foo.f" will produce valid C when foo.f contains + call sub('1234') + end + subroutine sub(msg) + end +Specifically, the length argument in "call sub" is now suppressed. +With or without foo.P, it is also now suppressed when the order of +subprograms in file foo.f is reversed: + subroutine sub(msg) + end + call sub('1234') + end + Adjust copyright notices to reflect AT&T breakup. + +Wed Jul 10 09:25:49 EDT 1996 + Fix bug (possible memory fault) in handling erroneously placed +and inconsistent declarations. Example that faulted: + character*1 w(8) + call foo(w) + end + subroutine foo(m) + data h /0.5/ + integer m(2) ! should be before data + end + Fix bug (possible fault) in handling illegal "if" constructions. +Example (that faulted): + subroutine foo(i,j) + if (i) then ! bug: i is integer, not logical + else if (j) then ! bug: j is integer, not logical + endif + end + Fix glitch with character*(*) argument named "ret_len" to a +character*(*) function. + +Wed Jul 10 23:04:16 EDT 1996 + Fix more glitches in the intrinsic "real" function when applied to a +complex (or double complex) variable and passed as an argument to +some intrinsic functions. Example: + complex a, b + r = sqrt(real(conjg(a))) + sqrt(real(a*b)) + end + +Thu Jul 11 17:27:16 EDT 1996 + Fix a memory fault associated with complicated, illegal input. +Example: + subroutine goo + character a + call foo(a) ! inconsistent with subsequent def and call + end + subroutine foo(a) + end + call foo(a) + end + +Wed Jul 17 19:18:28 EDT 1996 + Fix yet another case of intrinsic "real" applied to a complex +argument. Example: + complex a(3) + x = sqrt(real(a(2))) ! gave error message about bad tag + end + +Mon Aug 26 11:28:57 EDT 1996 + Tweak sysdep.c for non-Unix systems in which process ID's can be +over 5 digits long. + +Tue Aug 27 08:31:32 EDT 1996 + Adjust the ishft intrinsic to use unsigned right shifts. (Previously, +a negative constant second operand resulted in a possibly signed shift.) + +Thu Sep 12 14:04:07 EDT 1996 + equiv.c: fix glitch with -DKR_headers. + libi77: fmtlib.c: fix bug in printing the most negative integer. + +Fri Sep 13 08:54:40 EDT 1996 + Diagnose some illegal appearances of substring notation. + +Tue Sep 17 17:48:09 EDT 1996 + Fix fault in handling some complex parameters. Example: + subroutine foo(a) + double complex a, b + parameter(b = (0,1)) + a = b ! f2c faulted here + end + +Thu Sep 26 07:47:10 EDT 1996 + libi77: fmt.h: for formatted writes of negative integer*1 values, +make ic signed on ANSI systems. If formatted writes of integer*1 +values trouble you when using a K&R C compiler, switch to an ANSI +compiler or use a compiler flag that makes characters signed. + +Tue Oct 1 14:41:36 EDT 1996 + Give a better error message when dummy arguments appear in data +statements. + +Thu Oct 17 13:37:22 EDT 1996 + Fix bug in typechecking arguments to character and complex (or +double complex) functions; the bug could cause length arguments +for character arguments to be omitted on invocations appearing +textually after the first invocation. For example, in + subroutine foo + character c + complex zot + call goo(zot(c), zot(c)) + end +the length was omitted from the second invocation of zot, and +there was an erroneous error message about inconsistent calling +sequences. + +Wed Dec 4 13:59:14 EST 1996 + Fix bug revealed by + subroutine test(cdum,rdum) + complex cdum + rdum=cos(real(cdum)) ! "Unexpected tag 3 in opconv_fudge" + end + Fix glitch in parsing "DO 10 D0 = 1, 10". + Fix glitch in parsing + real*8 x + real*8 x ! erroneous "incompatible type" message + call foo(x) + end + +Mon Dec 9 23:15:02 EST 1996 + Fix glitch in parameter adjustments for arrays whose lower +bound depends on a scalar argument. Example: + subroutine bug(p,z,m,n) + integer z(*),m,n + double precision p(z(m):z(m) + n) ! p_offset botched + call foo(p(0), p(n)) + end + libi77: complain about non-positive rec= in direct read and write +statements. + libf77: trivial adjustments; Version.c not changed. + +Wed Feb 12 00:18:03 EST 1997 + output.c: fix (seldom problematic) glitch in out_call: put parens +around the ... in a test of the form "if (q->tag == TADDR && ...)". + vax.c: fix bug revealed in the "psi_offset =" assignment in the +following example: + subroutine foo(psi,m) + integer z(100),m + common /a/ z + double precision psi(z(m):z(m) + 10) + call foo(m+1, psi(0),psi(10)) + end + +Mon Feb 24 23:44:54 EST 1997 + For consistency with f2c's current treatment of adjacent character +strings in FORMAT statements, recognize a Hollerith string following +a string (and merge adjacent strings in FORMAT statements). + +Wed Feb 26 13:41:11 EST 1997 + New libf2c.zip, a combination of the libf77 and libi77 bundles (and +available only by ftp). + libf77: adjust functions with a complex output argument to permit +aliasing it with input arguments. (For now, at least, this is just +for possible benefit of g77.) + libi77: tweak to ftell_.c for systems with strange definitions of +SEEK_SET, etc. + +Tue Apr 8 20:57:08 EDT 1997 + libf77: [cz]_div.c: tweaks invisible on most systems (that may +improve things slightly with optimized compilation on systems that use +gratuitous extra precision). + libi77: fmt.c: adjust to complain at missing numbers in formats +(but still treat missing ".nnn" as ".0"). + +Fri Apr 11 14:05:57 EDT 1997 + libi77: err.c: attempt to make stderr line buffered rather than +fully buffered. (Buffering is needed for format items T and TR.) + +Thu Apr 17 22:42:43 EDT 1997 + libf77: add F77_aloc.o to makefile (and makefile.u in libf2c.zip). + +Fri Apr 25 19:32:09 EDT 1997 + libf77: add [de]time_.c (which may give trouble on some systems). + +Tue May 27 09:18:52 EDT 1997 + libi77: ftell_.c: fix typo that caused the third argument to be +treated as 2 on some systems. + +Mon Jun 9 00:04:37 EDT 1997 + libi77 (and libf2c.zip): adjust include order in err.c lread.c wref.c +rdfmt.c to include fmt.h (etc.) after system includes. Version.c not +changed. + +Mon Jul 21 16:04:54 EDT 1997 + proc.c: fix glitch in logic for "nonpositive dimension" message. + libi77: inquire.c: always include string.h (for possible use with +-DNON_UNIX_STDIO); Version.c not changed. + +Thu Jul 24 17:11:23 EDT 1997 + Tweak "Notice" to reflect the AT&T breakup -- we missed it when +updating the copyright notices in the source files last summer. + Adjust src/makefile so malloc.o is not used by default, but can +be specified with "make MALLOC=malloc.o". + Add comments to src/README about the "CRAY" T3E. + +Tue Aug 5 14:53:25 EDT 1997 + Add definition of calloc to malloc.c; this makes f2c's malloc +work on some systems where trouble hitherto arose because references +to calloc brought in the system's malloc. (On sensible systems, +calloc is defined separately from malloc. To avoid confusion on +other systems, f2c/malloc.c now defines calloc.) + libi77: lread.c: adjust to accord with a change to the Fortran 8X +draft (in 1990 or 1991) that rescinded permission to elide quote marks +in namelist input of character data; to get the old behavior, compile +with F8X_NML_ELIDE_QUOTES #defined. wrtfmt.o: wrt_G: tweak to print +the right number of 0's for zero under G format. + +Sat Aug 16 05:45:32 EDT 1997 + libi77: iio.c: fix bug in internal writes to an array of character +strings that sometimes caused one more array element than required by +the format to be blank-filled. Example: format(1x). + +Wed Sep 17 00:39:29 EDT 1997 + libi77: fmt.[ch] rdfmt.c wrtfmt.c: tweak struct syl for machines +with 64-bit pointers and 32-bit ints that did not 64-bit align +struct syl (e.g., Linux on the DEC Alpha). This change should be +invisible on other machines. + +Sun Sep 21 22:05:19 EDT 1997 + libf77: [de]time_.c (Unix systems only): change return type to double. + +Thu Dec 4 22:10:09 EST 1997 + Fix bug with handling large blocks of comments (over 4k); parts of the +second and subsequent blocks were likely to be lost (not copied into +comments in the resulting C). Allow comment lines to be longer before +breaking them. + +Mon Jan 19 17:19:27 EST 1998 + makefile: change the rule for making gram.c to one for making gram1.c; +henceforth, asking netlib to "send all from f2c/src" will bring you a +working gram.c. Nowadays there are simply too many broken versions of +yacc floating around. + libi77: backspace.c: for b->ufmt==0, change sizeof(int) to +sizeof(uiolen). On machines where this would make a difference, it is +best for portability to compile libI77 with -DUIOLEN_int, which will +render the change invisible. + +Tue Feb 24 08:35:33 EST 1998 + makefile: remove gram.c from the "make clean" rule. + +Wed Feb 25 08:29:39 EST 1998 + makefile: change CFLAGS assignment to -O; add "veryclean" rule. + +Wed Mar 4 13:13:21 EST 1998 + libi77: open.c: fix glitch in comparing file names under +-DNON_UNIX_STDIO. + +Mon Mar 9 23:56:56 EST 1998 + putpcc.c: omit an unnecessary temporary variable in computing +(expr)**3. + libf77, libi77: minor tweaks to make some C++ compilers happy; +Version.c not changed. + +Wed Mar 18 18:08:47 EST 1998 + libf77: minor tweaks to [ed]time_.c; Version.c not changed. + libi77: endfile.c, open.c: acquire temporary files from tmpfile(), +unless compiled with -DNON_ANSI_STDIO, which uses mktemp(). +New buffering scheme independent of NON_UNIX_STDIO for handling T +format items. Now -DNON_UNIX_STDIO is no longer be necessary for +Linux, and libf2c no longer causes stderr to be buffered -- the former +setbuf or setvbuf call for stderr was to make T format items work. +open.c: use the Posix access() function to check existence or +nonexistence of files, except under -DNON_POSIX_STDIO, where trial +fopen calls are used. In open.c, fix botch in changes of 19980304. + libf2c.zip: the PC makefiles are now set for NT/W95, with comments +about changes for DOS. + +Fri Apr 3 17:22:12 EST 1998 + Adjust fix of 19960913 to again permit substring notation on +character variables in data statements. + +Sun Apr 5 19:26:50 EDT 1998 + libi77: wsfe.c: make $ format item work: this was lost in the changes +of 17 March 1998. + +Sat May 16 19:08:51 EDT 1998 + Adjust output of ftnlen constants: rather than appending L, +prepend (ftnlen). This should make the resulting C more portable, +e.g., to systems (such as DEC Alpha Unix systems) on which long +may be longer than ftnlen. + Adjust -r so it also casts REAL expressions passed to intrinsic +functions to REAL. + +Wed May 27 16:02:35 EDT 1998 + libf2c.zip: tweak description of compiling libf2c for INTEGER*8 +to accord with makefile.u rather than libF77/makefile. + +Thu May 28 22:45:59 EDT 1998 + libi77: backspace.c dfe.c due.c iio.c lread.c rsfe.c sue.c wsfe.c: +set f__curunit sooner so various error messages will correctly +identify the I/O unit involved. + libf2c.zip: above, plus tweaks to PC makefiles: for some purposes, +it's still best to compile with -DMSDOS (even for use with NT). + +Thu Jun 18 01:22:52 EDT 1998 + libi77: lread.c: modified so floating-point numbers (containing +either a decimal point or an exponent field) are treated as errors +when they appear as list input for integer data. Compile lread.c with +-DALLOW_FLOAT_IN_INTEGER_LIST_INPUT to restore the old behavior. + +Mon Aug 31 10:38:54 EDT 1998 + formatdata.c: if possible, and assuming doubles must be aligned on +double boundaries, use existing holes in DATA for common blocks to +force alignment of the block. For example, + block data + common /abc/ a, b + double precision a + integer b(2) + data b(2)/1/ + end +used to generate + struct { + integer fill_1[3]; + integer e_2; + doublereal e_3; + } abc_ = { {0}, 1, 0. }; +and now generates + struct { + doublereal fill_1[1]; + integer fill_2[1]; + integer e_3; + } abc_ = { {0}, {0}, 1 }; +In the old generated C, e_3 was added to force alignment; in the new C, +fill_1 does this job. + +Mon Sep 7 19:48:51 EDT 1998 + libi77: move e_wdfe from sfe.c to dfe.c, where it was originally. +Why did it ever move to sfe.c? + +Tue Sep 8 10:22:50 EDT 1998 + Treat dreal as a synonym for dble unless -cd is specified on the +command line. + +Sun Sep 13 22:23:41 EDT 1998 + format.c: fix bug in writing prototypes under f2c -A ... *.P: +under some circumstances involving external functions with no known +type, a null pointer was passed to printf. + +Tue Oct 20 23:25:54 EDT 1998 + Comments added to libf2c/README and libF77/README, pointing out +the need to modify signal1.h on some systems. + +Wed Feb 10 22:59:52 EST 1999 + defs.h lex.c: permit long names (up to at least roughly +MAX_SHARPLINE_LEN = 1000 characters long) in #line lines (which only +matters under -g). + fc: add -U option; recognize .so files. + +Sat Feb 13 10:18:27 EST 1999 + libf2c: endfile.c, lread.c, signal1.h0: minor tweaks to make some +(C++) compilers happier; f77_aloc.c: make exit_() visible to C++ +compilers. Version strings not changed. + +Thu Mar 11 23:14:02 EST 1999 + Modify f2c (exec.c, expr.c) to diagnose incorrect mixing of types +when (f2c extended) intrinsic functions are involved, as in +(not(17) .and. 4). Catching this in the first executable statement +is a bit tricky, as some checking must be postponed until all statement +function declarations have been parsed. Thus there is a chance of +today's changes introducing bugs under (let us hope) unusual conditions. + +Sun Mar 28 13:17:44 EST 1999 + lex.c: tweak to get the file name right in error messages caused +by statements just after a # nnn "filename" line emitted by the C +preprocessor. (The trouble is that the line following the # nnn line +must be read to see if it is a continuation of the stuff that preceded +the # nnn line.) When # nnn "filename" lines appear among the lines +for a Fortran statement, the filename reported in an error message for +the statement should now be the file that was current when the first +line of the statement was read. + +Sun May 2 22:38:25 EDT 1999 + libf77, libi77, libf2c.zip: make getenv_() more portable (call +getenv() rather than knowing about char **environ); adjust some +complex intrinsics to work with overlapping arguments (caused by +inappropriate use of equivalence); open.c: get "external" versus +"internal" right in the error message if a file cannot be opened; +err.c: cast a pointer difference to (int) for %d; rdfmt.c: omit +fixed-length buffer that could be overwritten by formats Inn or Lnn +with nn > 83. + +Mon May 3 13:14:07 EDT 1999 + "Invisible" changes to omit a few compiler warnings in f2c and +libf2c; two new casts in libf2c/open.c that matter with 64-bit longs, +and one more tweak (libf2c/c_log.c) for pathological equivalences. + Minor update to "fc" script: new -L flag and comment correction. + +Fri Jun 18 02:33:08 EDT 1999 + libf2c.zip: rename backspace.c backspac.c, and fix a glitch in it +-- b->ufd may change in t_runc(). (For now, it's still backspace.c +in the libi77 bundle.) + +Sun Jun 27 22:05:47 EDT 1999 + libf2c.zip, libi77: rsne.c: fix bug in namelist input: a misplaced +increment could cause wrong array elements to be assigned; e.g., +"&input k(5)=10*1 &end" assigned k(5) and k(15 .. 23). + +Tue Sep 7 14:10:24 EDT 1999 + f2c.h, libf2c/f2c.h0, libf2c/README: minor tweaks so a simple +sed command converts f2c.h == libf2c/f2c.h0 to a form suitable for +machines with 8-byte longs and doubles, 4-byte int's and floats, +while working with a forthcoming (ill-advised) update to the C +standard that outlaws plain "unsigned". + f2c.h, libf2c/f2c.h0: change "if 0" to "#ifdef INTEGER_STAR_8". + libf77, libf2c.zip: [cz]_div.c and README: arrange for compilation +under -DIEEE_COMPLEX_DIVIDE to make these routines avoid calling sig_die +when the denominator of a complex or double complex division vanishes; +instead, they return pairs of NaNs or Infinities, depending whether the +numerator also vanishes or not. + +Tue Oct 5 23:50:14 EDT 1999 + formatdata.c, io.c, output.c, sysdep.c: adjust to make format +strings legal when they contain 8-bit characters with the high bit on. +(For many C compilers, this is not necessary, but it the ANSI/ISO C +standard does not require this to work.) + libf2c.zip: tweak README and correct xsum0.out. + +Mon Oct 25 17:30:54 EDT 1999 + io.c: fix glitch introduced in the previous change (19991005) that +caused format(' %') to print "%%" rather than "%". + +Mon Nov 15 12:10:35 EST 1999 + libf2c.zip: fix bug with the sequence backspace(n); endfile(n); +rewind(n); read(n). Supply missing (long) casts in a couple of places +where they matter when size(ftnint) == sizeof(int) < sizeof(long). + +Tue Jan 18 19:22:24 EST 2000 + Arrange for parameter statements involving min(...) and max(...) +functions of three or more arguments to work. + Warn about text after "end" (rather than reporting a syntax error +with a surprising line number). + Accept preprocessor line numbers of the form "# 1234" (possibly +with trailing blanks). + Accept a comma after write(...) and before a list of things to write. + +Fri Jan 21 17:26:27 EST 2000 + Minor updates to make compiling Win32 console binaries easier. A +side effect is that the MSDOS restriction of only one Fortran file +per invocation is lifted (and "f2c *.f") works. + +Tue Feb 1 18:38:32 EST 2000 + f2c/src/tokdefs.h added (to help people on non-Unix systems -- the +makefile has always had a rule for generating tokdefs.h). + +Fri Mar 10 18:48:17 EST 2000 + libf77, libf2c.zip: z_log.c: the real part of the double complex log +of numbers near, e.g., (+-1,eps) with |eps| small is now more accurate. +For example if z = (1,1d-7), then "write(*,*) z" now writes +"(5.E-15,1.E-07" rather than the previous "(4.88498131E-15,1.E-07)". + +Thu Apr 20 13:02:54 EDT 2000 + libf77, libi77, libf2c.zip: s_cat.c, rsne.c, xwsne.c: fix type +errors that only matter if sizeof(ftnint) != sizeof(ftnlen). + +Tue May 30 23:36:18 EDT 2000 + expr.c: adjust subcheck() to use a temporary variable of type TYLONG +rather than TYSHORT under -C -I2. + +Wed May 31 08:48:03 EDT 2000 + Simplify yesterday's adjustment; today's change should be invisible. + +Tue Jul 4 22:52:21 EDT 2000 + misc.c, function "addressable": fix fault with "f2c -I2 foo.f" when +foo.f consists of the 4 lines + subroutine foo(c) + character*(*) c + i = min(len(c),23) + end + Sundry files: tweaks for portability, e.g., for compilation by overly +fastidious C++ compilers; "false" and "true" now treated as C keywords +(so they get two underscores appended). + libf77, libi77, libf2c.zip: "invisible" adjustments to permit +compilation by C++ compilers; version numbers not changed. + +Thu Jul 6 23:46:07 EDT 2000 + Various files: tweaks to banish more compiler warnings. + lib?77, libf2c.zip/makefile.u: add "|| true" to ranlib invocations. + Thanks to Nelson H. F. Beebe for messages leading to these changes +(and to many of the ones two days ago). + xsum.c: tweak include order. + +Fri Jul 7 18:01:25 EDT 2000 + fc: accept -m xxx or -mxxx, pass them to the compiler as -mxxx +(suggestion of Nelson Beebe). Note that fc simply appends to CFLAGS, +so system-specific stuff can be supplied in the environment variable +CFLAGS. With some shells, invocations of the form + CFLAGS='system-specific stuff' fc ... +are one way to do this. + +Thu Aug 17 21:38:36 EDT 2000 + Fix obscure glitch: in "Error on line nnn of ...: Bad # line:...", +get nnn right. + +Sat Sep 30 00:28:30 EDT 2000 + libf77, libf2c.zip: dtime_.c, etime_.c: use floating-point divide; +dtime_.d, erf_.c, erfc_.c, etime.c: for use with "f2c -R", compile with +-DREAL=float. + +Tue Dec 5 22:55:56 EST 2000 + lread.c: under namelist input, when reading a logical array, treat +Tstuff= and Fstuff= as new assignments rather than as logical constants. + +Fri Feb 23 00:43:56 EST 2001 + libf2c: endfile.c: adjust to use truncate() unless compiled with +-DNO_TRUNCATE (or with -DMSDOS). Add libf2c/mkfile.plan9. + +Sat Feb 24 21:14:24 EST 2001 + Prevent malloc(0) when a subroutine of no arguments has an entry +with no arguments, as in + subroutine foo + entry goo + end + Fix a fault that was possible when MAIN (illegally) had entry points. + Fix a buffer overflow connected with the error message for names more +than MAXNAMELEN (i.e., 50) bytes long. + Fix a bug in command-line argument passing that caused the invocation +"f2c -!czork foo.f" to complain about two invalid flags ('-ork' and +'-oo.f') instead of just one ('-ork'). + fc: add -s option (strip executable); portability tweaks. + Adjustments to handing of integer*8 to permit processing 8-byte hex, +binary, octal, and decimal constants. The adjustments are only +available when type long long (for >= 64 bit integers) is available to +f2c; they are assumed available unless f2c is compiled with either +-DNO_TYQUAD or -DNO_LONGLONG. As has long been the case, compilation +of f2c itself with -DNO_TYQUAD eliminates recognition of integer*8 +altogether. Compilation with just -DNO_LONGLONG permits the previous +handling of integer*8, which could only handle 32-bit constants +associated with integer*8 variables. + New command-line argument -i8const (available only when f2c itself +is compiled with neither -DNO_TYQUAD nor -DNO_LONGLONG) suppresses +the new automatic promotion of integer constants too long to express +as 32-bit values to type integer*8. There are corresponding updates +to f2c.1 and f2c.1t. + +Wed Feb 28 00:50:04 EST 2001 + Adjust misc.c for (older) systems that recognize long long but do not +have LLONG_MAX or LONGLONG_MAX in limits.h. + main.c: filter out bad files before dofork loop to avoid trouble +in Win32 "f2c.exe" binaries. + +Thu Mar 1 16:25:19 EST 2001 + Cosmetic change for consistency with some other netlib directories: +change NO_LONGLONG to NO_LONG_LONG. (This includes adjusting the above +entry for Feb 23 2001.) No change (other than timestamp) to version.c. + libf2c: endfile.c: switch to ftruncate (absent -DNO_TRUNCATE), +thus permitting truncation of scratch files on true Unix systems, +where scratch files have no name. Add an fflush() (surprisingly) +needed on some Linux systems. + +Tue Mar 20 22:03:23 EST 2001 + expr.c: complain ("impossible conversion") about attempts to assign +character expressions ... to integer variables, rather than implicitly +assigning ichar(...). + +Sat Jun 23 23:08:22 EDT 2001 + New command-line option -trapuv adds calls on _uninit_f2c() to prologs +to dynamically initialize local variables, except those appearing in +SAVE or DATA statements, with values that may help find references to +uninitialized variables. For example, with IEEE arithmetic, floating- +point variables are initialized to signaling NaNs. + expr.c: new warning for out-of-bounds constant substring expressions. +Under -C, such expressions now inhibit C output. + libf2c/mkfile.plan9: fix glitch with rule for "check" (or xsum.out). + libf2c.zip: add uninit.c (for _uninit_f2c()) in support of -trapuv. + fc, f2c.1, f2c.1t: adjust for -trapuv. + +Thu Jul 5 22:00:51 EDT 2001 + libf2c.zip: modify uninit.c for __mc68k__ under Linux. + +Wed Aug 22 08:01:37 EDT 2001 + cds.c, expr.c: in constants, preserve the sign of 0. + expr.c: fix some glitches in folding constants to integer*8 +(when NO_LONG_LONG is not #defined). + intr.c: fold constant min(...) and max(...) expressions. + +Fri Nov 16 02:00:03 EST 2001 + libf2c.zip: tweak to permit handling files over 2GB long where +possible, with suitable -D options, provided for some systems in +new header file sysdep1.h (copied from sysdep1.h0 by default). +Add an fseek to endfile.c to fix a glitch on some systems. + +Wed Nov 28 17:58:12 EST 2001 + libf2c.zip: on IEEE systems, print -0 as -0 when the relevant +libf2c/makefile.* is suitably adjusted: see comments about +-DSIGNED_ZEROS in libf2c/makefile.*. + +Fri Jan 18 16:17:44 EST 2002 + libf2c.zip: fix bugs (reported by Holger Helmke) in qbit_bits(): +wrong return type, missing ~ on y in return value. This affects +the intrinsic ibits function for first argument of type integer*8. + +Thu Feb 7 17:14:43 EST 2002 + Fix bug handling leading array dimensions in common: invalid C +resulted. Example (after one provided by Dmitry G. Baksheyev): + + subroutine foo(a) + common/c/m + integer m, n + equivalence(m,n) + integer a(n,2) + a(1,2) = 3 + end + + Fix a bug, apparently introduced sometime after 19980913, in +handling certain substring expressions that involve temporary +assignments and the first invocation of an implicitly typed function. +When the expressions appeared in "else if (...)" and "do while(...)", +the temporary assignments appeared too soon. Examples are hard to +find, but here is one (after an example provided by Nat Bachman): + + subroutine foo(n) + character*8 s + do while (moo(s(n+1:n+2)) .ge. 2) + n = n + 1 + enddo + end + +It is hard for f2c to get this sort of example correct when the +"untyped" function is a generic intrinsic. When incorrect code would +otherwise result, f2c now issues an error message and declines to +produce C. For example, + + subroutine foo(n) + character*8 s + double precision goo + do while (sin(goo(s(n+1:n+2))) .ge. 2) + n = n + 1 + enddo + end + +gives the new error message, but both + + subroutine foo(n) + character*8 s + double precision goo + do while (dsin(goo(s(n+1:n+2))) .ge. 2) + n = n + 1 + enddo + end +and + subroutine foo(n) + character*8 s + double precision goo + do while (sin(goo(min(n, (n-3)**2))) .ge. 2) + n = n + 1 + enddo + end + +give correct C. + +Fri Feb 8 08:43:40 EST 2002 + Make a cleaner fix of the bug fixed yesterday in handling certain +"do while(...)" and "else if (...)" constructs involving auxiliary +assignments. (Yesterday's changes to expr.c are recanted; expr.c +is now restored to that of 20010820.) Now + + subroutine foo(n) + character*8 s + double precision goo + do while (sin(goo(s(n+1:n+2))) .ge. 0.2) + n = n + 1 + enddo + end + +is correctly translated. + +Thu Mar 14 12:53:08 EST 2002 + lex.c: adjust to avoid an error message under -72 when source files +are in CRLF form ("text mode" on Microsoft systems), a source line is +exactly 72 characters long, and f2c is run on a system (such as a Unix +or Linux system) that does not distinguish text and binary modes. +Example (in CRLF form): + write(*,*)"Hello world, with a source line that is 72 chars long." + end + libf2c/z_log.c: add code to cope with buggy compilers (e.g., some +versions of gcc under -O2 or -O3) that do floating-point comparisons +against values computed into extended-precision registers on some +systems (such as Intel IA32 systems). Compile with +-DNO_DOUBLE_EXTENDED to omit the kludge that circumvents this bug. + +Thu May 2 19:09:01 EDT 2002 + src/misc.c, src/sysdep.h, src/gram.c: tweaks for KR_headers (a rare +concern today); version.c touched but left unchanged. + libf2c: fix glitch in makefile.vc; KR_header tweaks in s_stop.c +and uninit.c (which also had a misplaced #endif). + +Wed Jun 5 16:13:34 EDT 2002 + libf2c: uninit.c: for Linux on an ARM processor, add some +#ifndef _FPU... tests; f77vers.c not changed. + +Tue Jun 25 15:13:32 EDT 2002 + New command-line option -K requests old-style ("K&R") C. The +default is changed to -A (ANSI/ISO style). + Under -K, cast string-length arguments to (ftnlen). This should +matter only in the unusual case that "readme" instructs obtaining +f2c.h by + sed 's/long int /long long /' f2c.h0 >f2c.h + Increase defaults for some table sizes: make -Nn802 -Nq300 -Nx400 +the default. + +Fri Sep 6 18:39:24 EDT 2002 + libf2c.zip: rsne.c: fix bug with multiple repeat counts in reading +namelists, e.g., &nl a(2) = 3*1.0, 2*2.0, 3*3.0 / +(Bug found by Jim McDonald, reported by Toon Moene.) + +Fri Oct 4 10:23:51 EDT 2002 + libf2c.zip: uninit.c: on IRIX systems, omit references to shell +variables (a dreg). This only matters with f2c -trapuv . + +Thu Dec 12 22:16:00 EST 2002 + proc.c: tweak to omit "* 1" from "a_offset = 1 + a_dim1 * 1;". + libf2c.zip: uninit.c: adjust to work with HP-UX B.11.11 as well as +HP-UX B.10.20; f77vers.c not changed. + +Tue Feb 11 08:19:54 EST 2003 + Fix a fault with f2c -s on the following example of invalid Fortran +(reported by Nickolay A. Khokhlov); "function" should appear before +"cat" on the first line: + character*(*) cat(a, b) + character*(*) a, b + cat = a // b + end + Issue warnings about inappropriate uses of arrays a, b, c and pass +a temporary for d in + real a(2), b(2), c(2), d + call foo((a), 1*b, +c, +d) + end +(correcting bugs reported by Arnaud Desitter). + +Thu Mar 6 22:48:08 EST 2003 + output.c: fix a bug leading to "Unexpected tag 4 in opconv_fudge" +when f2c -s processes the real part of a complex array reference. +Example (simplified from netlib/linpack/zchdc.f): + + subroutine foo(a,work,n,k) + integer k, n + complex*16 a(n,n), work(n) + work(k) = dcmplx(dsqrt(dreal(a(k,k))),0.0d0) + end + +(Thanks to Nickolay A. Khokhlov for the bug report.) + +Thu Mar 20 13:50:12 EST 2003 + format.c: code around a bug (reported by Nelson H. F. Beebe) in +some versions of FreeBSD. Compiling with __FreeBSD__ but not +NO_FSCANF_LL_BUG #defined or with FSCANF_LL_BUG #defined causes +special logic to replace fscanf(infile, "%llx", result) with +custom logic. Here's an example (from Beebe) where the bug bit: + integer*8 m, n + m = 9223372036854775807 + end + +Fri Mar 21 13:14:05 EST 2003 + libf2c.zip: err.c: before writing to a file after reading from it, +do an f_seek(file, 0, SEEK_CUR) to make writing legal in ANSI C. + +Fri Jun 6 14:56:44 EDT 2003 +libf2c.zip: add comments about libf2c.so (and a rule that works under +Linux, after an adjustment to the CFLAGS = line) to libf2c/makefile.u. + +Sat Oct 25 07:57:53 MDT 2003 +README, main.c, sysdep.c: adjust comments about libf2c and expand the +comments thereon in the C that f2c writes (since too few people read +the README files). Change makefile to makefile.u (with the +expectation that people will "cp makefile.u makefile" and edit +makefile if necessary) and add makefile.vc (for Microsoft Visual C++). + +Thu Oct 7 23:25:28 MDT 2004 +names.c: for convenience of MSVC++ users, map "cdecl" to "cdecl__". + +Fri Mar 4 18:40:48 MST 2005 +sysdep.c, makefile.u, new file sysdeptest.c: changes in response to a +message forwarded by Eric Grosse from Thierry Carrez +(who is apparently unaware of f2c's -T option) about an unlikely +security issue: that a local attacker could plant symbolic links in +/tmp corresponding to temporary file names that f2c generates and thus +cause overwriting of arbitrary files. Today's change is that if +neither -T nor the unusual debugging flag -Dn is specified and the +system is not an MS-Windows system (which cannot have symbolic links, +as far as I know), then f2c's temporary files will be written in a +temporary directory that is readable and writable only by the user and +that is removed at the end of f2c's execution. To disable today's +change, compile sysdep.c with -DNO_TEMPDIR (i.e., with NO_TEMPDIR +#defined). + +Sun Mar 27 20:06:49 MST 2005 +sysdep.c: in set_tmp_names(), fix botched placement of +"if (debugflag == 1) return;": move it below declarations. + +Sun May 1 21:45:46 MDT 2005 +sysdep.c: fix a possible fault under -DMSDOS and improper handling +of a tmpnam failure under the unusual combination of both -DNO_MKDTEMP +and -DNO_MKSTEMP (without -DNO_TEMPDIR). + +Tue Oct 4 23:38:54 MDT 2005 +libf2c.zip: uninit.c: on IA32 Linux systems, leave the rounding +precision alone rather than forcing it to 53 bits; compile with +-DUNINIT_F2C_PRECISION_53 to get the former behavior. This only +affects Fortran files translated by f2c -trapuv . + +Sun May 7 00:38:59 MDT 2006 + main.c, version.c: add options -? (or --help) that print out +pointers to usage documentation and -v (or --version) that print +the current version. + fc script: fix botch with -O[123]; recognize --version (or -v) +and --help (or -?). + Add f2c.pdf == PDF version of f2c.ps. + +Sun Oct 8 02:45:04 MDT 2006 + putpcc.c: fix glitch in subscripting complex variables: subscripts +of type integer*8 were converted to integer*4, which causes trouble +when 32-bit addressing does not suffice. + +Tue Sep 11 23:54:05 MDT 2007 + xsum.c: insert explicit "int" before main. + +Mon Dec 3 20:53:24 MST 2007 + libf2c/main.c: insert explicit "int" before main. + +Sat Apr 5 21:39:57 MDT 2008 + libf2c.zip: tweaks for political C++ and const correctness, and +to fix ctype trouble in some recent Linux versions. No behavior +should change. + +Sun Apr 6 22:38:56 MDT 2008 + libf2c.zip: adjust alternate makefiles to reflect yesterday's change. + +Wed Nov 26 23:23:27 MST 2008 + libf2c.zip: add brief discussion of MacOSX to comments in makefile.u. + +Fri Jan 2 23:13:25 MST 2009 + libf2c.zip: add -DNO_ISATTY to CFLAGS assignment in makefile.vc. + +Sat Apr 11 18:06:00 MDT 2009 + src/sysdep.c src/sysdeptest.c: tweak for MacOSX (include ). + +Wed Jul 7 10:51:12 MDT 2010 + src/data.c, src/format.c, src/p1output.c: "invisible" tweaks to +silence warnings seen in compilation under Ubuntu; version.c not changed. + +Fri Aug 27 09:14:17 MDT 2010 + format.c: make sizeof(buf) depend on MAXNAMELEN to fix a bug with long +names. Update mswin/f2c.exe.gz accordingly. + +Fri Sep 3 16:03:24 MDT 2010 + fc: have "-m ..." modify CC rather than CFLAGS (to affect linking). + +Mon Aug 1 13:46:40 MDT 2011 + README, README in libf2c.zip: update some netlib pointers. + +Thu Sep 26 16:42:35 MDT 2013 + arithchk.c and sysdep1.h0 updated. The former has a new +"#ifdef NO_SSZIZE_T" section for use elsewhere. The latter has a +change supplied by Gregor Richards for use with some libc variants. + +Fri Jul 11 16:29:03 MDT 2014 + comptry.bat in libf2c.zip updated. + +NOTE: the old libf77 and libi77 bundles are no longer being updated. +Use libf2c.zip instead. + +20160102 + malloc.c: use memmove rather than memcpy in realloc(). + +20181026 + Fix an allocation glitch in proc.c: +1149c1149 +< size = sizeof(int) + (3 + 2 * nd) * sizeof (expptr); +--- +> size = sizeof(struct Dimblock) + 2*sizeof(expptr)*(nd-1); +Thanks to Ole Streicher for pointing out the need for this change. + +20190311 + main.c: update URL's in "f2c -?" and "f2c --help" output. + +20191129 + pread.c: fix a glitch not known to have caused any trouble: +355c355 +< if (c < '0' && c > '9') +--- +> if (c < '0' || c > '9') + +20200425 + sysdeptest.c: add #include + +20200916 + data.c exec.c format.c formatdata.c ftypes.h mem.c output.c +p1output.c proc.c sysdep.c: introduce type Addr, an unsigned +integer type that can hold an address. The changes allow compilation +of the f2c source on platforms that actually use more than 32 bits +for addresses. (Many 64-bit platforms keep addresses <= 32 bits +long when possible. One that does not and for which today's changes +are relevant is Microsoft Windows with Microsoft's cl compiler.) diff --git a/tools/connec/src/connec2d b/tools/connec/src/connec2d new file mode 100755 index 0000000000000000000000000000000000000000..03e3f6f6aa0779930abee315092e57b80ae53d6b GIT binary patch literal 67416 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 literal 0 HcmV?d00001 diff --git a/tools/connec/src/connec2d.F b/tools/connec/src/connec2d.F new file mode 100644 index 0000000..8574027 --- /dev/null +++ b/tools/connec/src/connec2d.F @@ -0,0 +1,425 @@ +C CONNEC2D.FOR VER.21-FEB-2002 +C +C PROGRAM FOR CONNECTIVITY ANALYSIS OF A 2D INDICATOR MAP +C +C GIVEN AN INDICATOR FIELDS (VALUES 0 AND 1 ONLY), THE RANDOM SET +C WITH VALUES 1 IS ANALYSED FOR CONNECTIVITY. +C +C INPUT PARAMETER FILE WITH +C +C IPHA : 0 OR 1 FOR CONNECTIVITY ANALYSIS OF PHASE 0 OR 1. +C ICON : 4 FOR 4-CONNECTIVITY AND 8 FOR 8-CONNECTIVITY +C CINP : INPUT FILE WITH INDICATOR VARIABLE (VALUS 0/1 ONLY) +C NX NY : NUMBER OF POINTS IN X AND Y +C DX DY : GRID DIMENSIONS IN X AND Y +C COUT : OUTPUT FILE WITH STATISTICS +C COU2 : OUTPUT FILE WITH CONNECTED COMPONENTS +C COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCITON +C +C DX,DY ARE ONLY USED FOR CONVERTING GRID UNITS TO REAL UNITS. +C NX : NUMBER OF POINTS ALONG THE X DIRECTION +C NY : NUMBER OF POINTS ALONG THE Y DIRECTION +C +C IND(I,J) : 0/1 INDICATOR VALUE +C AT THE TERMINATION OF THE PROGRAM THE MATRIX IND(I,J) CONTAINS +C THE CONNECTED COMPONENTS WITH VALUES 1,2,3,4,5,... FOR FIRST, +C SECOND, THIRD, ... ETC CONNECTED COMMPONENTS. +C THE VALUE 0 REMAINS 0. +C COUT : OUTPUT FILE WITH STATISTICS AND CONNECTIVITY FUNCTION. +C COU2 : OUTPUT FILE WITH THE CONNECTED COMPONENTS. +C COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCTION +C +C FOR THE CONNECTIVITY FUNCTION: +C NPX(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG +C THE X DIRECTION AND THAT BELONG TO FACIES 1. +C NPCX(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. +C NPY(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG +C THE Y DIRECTION AND THAT BELONG TO FACIES 1. +C NPCY(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. +C +C +C PPHA : PROPORTION OF FACIES 1. +C NCC : NUMBER OF CONNECTED COMPONENTS. +C RISM : MEAN CONNECTED COMPONENT SIZE IN PIXELS. +C RSME : MRAN SIZE IN REAL UNITS. +C RTOT : MEAN SIZE RELATIVE TO SIZE OF FACIES 1. +C RXME : MEAN LENGTH ALONG THE X DIRECTION. +C RYME : MEAN LENGTH ALONG THE Y DIRECTION. +C ICOM : NUMBER OF THE LARGEST COMPONENT. +C ISMA : SIZE IN PIXELS (OR LARGEST COMPONENT). +C RSIZ : SIZE RELATIVE TO SIZE OF FACIES 1. +C IXMA : MAXIMUM LENGTH ALONG X. +C IYMA : MAXIMUM LENGTH ALONG Y. +C ISMI : SIZE OF SMALLEST COMPONENT. +C IXMI : MINIMUM LENGTH ALONG X. +C IYMI : MINIMUM LENGTH ALONG Y. +C IPX : NUMBER OF PERCOLATING COMPONENTS ALONG X. +C IPY : NUMBER OF PERCOLATING COMPONENTS ALONG Y. +C CCFU(.,.) : CONNECTIVITY FUNCTION. +C +C CCFU(.,1): CONNECTIVITY FUNCTION ALONG X (E-W). +C CCFU(.,2): CONNECTIVITY FUNCTION ALONG Y (N-S). +C CCFU(.,3): CONNECTIVITY FUNCTION ALONG NE-SW DIRECTION. +C CCFU(.,4): CONNECTIVITY FUNCTION ALONG NW-SE DIRECTION. +C CCFU(.,5): MEAN CONNECTIVITY FUNCTION ALONG X AND Y. +C CCFU(.,6): MEAN CONNECTIVITY FUNCTION ALONG THE DIAGONALS. +C +C +C ---------------------------------------------------------------- +C + DIMENSION IND(4096,4096) +C,NPX(256),NPY(256),NPCX(256),NPCY(256) +C DIMENSION NPE(256),NPW(256),NPCE(256),NPCW(256),CCFU(256,6) +C + CHARACTER*12 CPAR,CINP,COU2 +C +C MATRIX DIMENSION LIMITATION +C + NXM=4096 + NYM=4096 +C + CPAR="coninput.txt" + OPEN (1,FILE=CPAR) + READ (1,*) IPHA + IF (IPHA.NE.0.AND.IPHA.NE.1) THEN + WRITE (6,*)'THE FIRST LINE IN THE PARAMETER FILE' + WRITE (6,*)'MUST BE A 0 OR A 1' + WRITE (6,*)'0 FOR CONNECTIVITY ANALYSIS OF PHASE 0' + WRITE (6,*)'1 FOR CONNECTIVITY ANALYSIS OF PHASE 1' + WRITE (6,*)'THE ACTUAL VALUE IN THE PARAMETER FILE IS: ',IPHA + STOP + END IF + READ (1,*) ICON + IF (ICON.NE.4.AND.ICON.NE.8) THEN + WRITE (6,*)'THE SECOND LINE IN THE PARAMETER FILE' + WRITE (6,*)'MUST BE A 4 OR A 8' + WRITE (6,*)'4 MEANS 4-CONNECTIVITY' + WRITE (6,*)'8 MEANS 8-CONNECTIVITY' + WRITE (6,*)'THE ACTUAL VALUE IN THE PARAMETER FILE IS: ',ICON + STOP + END IF + READ (1,100) CINP + READ (1,*) NX,NY + READ (1,*) DX,DY + READ (1,100) COU2 + CLOSE (1) + IF (NX.GT.NXM) THEN + WRITE (6,*)'MAXIMUM NX IS ',NXM + WRITE (6,*)'ACTUAL VALUE IS ',NX + STOP + END IF + IF (NY.GT.NYM) THEN + WRITE (6,*)'MAXIMUM NY IS ',NYM + WRITE (6,*)'ACTUAL VALUE IS ',NY + STOP + END IF +C +C READING EXPERIMENTAL INDICATOR DATA 2D FIELD +C + OPEN (1,FILE=CINP) + JPHA=0 + DO 1 I=1,NX + DO 2 J=1,NY + READ (1,*) VAL + IND(I,J)=INT(VAL) + IF (IPHA.EQ.0) THEN + IF (INT(VAL).EQ.0) THEN + IND(I,J)=1 + ELSE + IND(I,J)=0 + END IF + END IF + IF (IND(I,J).NE.1.AND.IND(I,J).NE.0) THEN + WRITE (6,*)'EXPERIMENTAL DATA MUST BE INDICATOR DATA 0/1' + WRITE (6,*)'ACTUAL VALUE : ',IND(I,J) + STOP + END IF + IF (IPHA.EQ.0) THEN + IF (INT(VAL).EQ.0) THEN + IND(I,J)=1 + ELSE + IND(I,J)=0 + END IF + END IF + IF (IND(I,J).EQ.1) JPHA=JPHA+1 +2 CONTINUE +1 CONTINUE + CLOSE (1) + IARE=NX*NY + PPHA=FLOAT(JPHA)/IARE + WRITE (6,*) + IF (ICON.EQ.4) WRITE (6,*)'4-CONNECTIVITY ANALYSIS' + IF (ICON.EQ.8) WRITE (6,*)'8-CONNECTIVITY ANALYSIS' + WRITE (6,*) + WRITE (6,*)'PROPORTION OF PHASE 1 IS: ',PPHA +C +C +C LOOKING FOR CONNECTED COMPONENTS +C + NCC=0 +C +5 DO 6 I=1,NX + DO 7 J=1,NY + IF (IND(I,J).EQ.1) THEN + IAI=I + IAJ=J + GOTO 8 + END IF +7 CONTINUE +6 CONTINUE +C NO MORE CONNECTED COMPONENTS SENDING CONTROL TO LABEL 20 + GOTO 20 +C +C A NEW COMPONEND HAS BEEN FOUND, INCREASE NUMBER OF +C CONNECTED COMPONENTS BY 1 +C +C +8 NCC=NCC+1 +C +C LOOKING FOR COMPONENT NCC WITH LABEL NNC+1 +C + IND(IAI,IAJ)=NCC+1 + DO 9 I=IAI,NX + DO 10 J=IAJ,NY + IF ((I-1).GT.0) THEN + IF (IND(I-1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J)=NCC+1 + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J)=NCC+1 + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I,J-1)=NCC+1 + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I,J+1)=NCC+1 + END IF + END IF + IF (ICON.EQ.8) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J+1)=NCC+1 + END IF + END IF + END IF +10 CONTINUE +9 CONTINUE + DO 40 I=IAI,1,-1 + DO 41 J=IAJ,1,-1 + IF ((I-1).GT.0) THEN + IF (IND(I-1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J)=NCC+1 + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J)=NCC+1 + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I,J-1)=NCC+1 + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I,J+1)=NCC+1 + END IF + END IF + IF (ICON.EQ.8) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I-1,J+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) IND(I+1,J+1)=NCC+1 + END IF + END IF + END IF +41 CONTINUE +40 CONTINUE +C +62 NNN=0 + DO 60 I=1,NX + DO 61 J=1,NY + IF ((I-1).GT.0) THEN + IF (IND(I-1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I-1,J)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I+1,J)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I,J-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I,J+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (ICON.EQ.8) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I-1,J-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I+1,J-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I-1,J+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1).EQ.1) THEN + IF (IND(I,J).EQ.NCC+1) THEN + IND(I+1,J+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + END IF +61 CONTINUE +60 CONTINUE + IF (NNN.GT.0) GOTO 62 + GOTO 5 +C +C THE CONNECTED COMPONENT IS THE COMPONENT WITH VALUES +C IA(I,J)=NCC, WE SUBSTRACT 1 FROM THE LEBEL +C +20 DO 50 I=1,NX + DO 51 J=1,NY + IF (IND(I,J).NE.0) IND(I,J)=IND(I,J)-1 +51 CONTINUE +50 CONTINUE +C + +C +C OUTPUT FILE WITH CONNECTED COMPONENTS +C + OPEN (1,FILE=COU2) +C OPEN (2,FILE=CINP) +C + DO 15 I=1,NX + DO 16 J=1,NY +C READ (2,*) ZVA + WRITE (1,*) IND(I,J) +16 CONTINUE +15 CONTINUE +C + CLOSE (1) + +C +100 FORMAT (A) +110 FORMAT (1X,'INPUT INDICATOR FILE : ',A12) +120 FORMAT (1X,'NX : ',I6) +130 FORMAT (1X,'NY : ',I6) +140 FORMAT (1X,'DX : ',F10.3) +150 FORMAT (1X,'DY : ',F10.3) +160 FORMAT (1X,'PROPORTION OF FACIES ',I1,' : ',F10.4) +170 FORMAT (/1X,'CONNECTED COMPONENTS STATISTICS'// + * /1X,'NUMBER OF CONNECTED COMPONENTS : ',I6) +175 FORMAT (/1X,'AVERAGES'/1X,8('=')) +176 FORMAT (/1X,'MINIMA'/1X,6('=')) +177 FORMAT (/1X,'MAXIMA'/1X,6('=')) +178 FORMAT (/1X,'PERCOLATION'/1X,11('=')) +180 FORMAT (1X,'MEAN SIZE IN PIXELS : ',F10.4) +190 FORMAT (1X,'MEAN SIZE REAL UNITS : ',F12.4) +200 FORMAT (1X,'MEAN SIZE RELATIVE TO TOTAL AREA OF FACIES ',I1, + * ' : ',F10.4) +210 FORMAT (1X,'MEAN LENGTH ALONG X (IN PIXELS) : ',F10.4) +220 FORMAT (1X,'MINIMUM LENGTH ALONG X (IN PIXELS) : ',I6) +230 FORMAT (1X,'MAXIMUM LENGTH ALONG X (IN PIXELS) : ',I6) +235 FORMAT (1X,'THE LARGEST COMPONENT IS NUMBER : ',I6) +236 FORMAT (1X,'WITH MAXIMUM SIZE IN PIXELS : ',I6) +237 FORMAT (1X,'AND RELATIVE TO TOTAL AREA OF FACIES ' + * ,I1,' : ',F10.4) +238 FORMAT (1X,'SIZE IN PIXELS OF SMALLEST COMPONENT : ',I6) +240 FORMAT (1X,'MEAN LENGTH ALONG Y (IN PIXELS) : ',F10.4) +250 FORMAT (1X,'MIMIMUN LENGTH ALONG Y (IN PIXELS) : ',I6) +260 FORMAT (1X,'MAXIMUM LENGTH ALONG Y (IN PIXELS) : ',I6) +270 FORMAT (1X,'NUMBER OF PERCOLATING COMPONENTS IN X : ',I6) +280 FORMAT (1X,'NUMBER OF PERCOLATING COMPONENTS IN Y : ',I6) +290 FORMAT (/1X,'OUTPUT FILE WITH CONNECTED COMPONENTS : ',A12) +295 FORMAT (/1X,'OUTPUT FILE WITH CONNECTIVIY FUNCTION : ',A12) +300 FORMAT (/1X,'CONNECTIVITY FUNCTION'/1X,21('=') + * //1X,'ALONG THE X DIRECTION') +310 FORMAT (F10.3,F12.6,2I12) +320 FORMAT (/1X,'ALONG THE Y DIRECTION') +321 FORMAT (/1X,'ALONG THE NE-SW DIRECTION') +322 FORMAT (/1X,'ALONG THE NW-SE DIRECTION') +323 FORMAT (/1X,'AVERAGE ALONG THE DIAGONALS') +330 FORMAT (/1X,'AVERAGE ALONG X AND Y') +400 FORMAT (25(/),1X,'CONNEC2D PROGRAM VER. 1.0'/1X,27('=')/// + * 1X,'INPUT PARAMETER FILE ---> ',$) +410 FORMAT (/1X,'OUTPUT FILE WITH STATISTICS AND CONNECTIVITY ' + * 'FUNCTION: ',A12) +420 FORMAT (/1X,'OUTPUT FILE WITH CONNECTED COMPONENTS: ',A12) +425 FORMAT (/1X,'OUTPUT FILE WITH CONNECTIVITY FUNCTION: ',A12) +430 FORMAT (1X,'OUTPUT RESULTS OF CONNEC2D'//1X'4-CONNECTIVITY' + * ' ANALYSIS'/1X,'PARAMETER FILE WAS : ',A12//) +440 FORMAT (1X,'OUTPUT RESULTS OF CONNEC2D'//1X'4-CONNECTIVITY' + * ' ANALYSIS'/1X,'PARAMETER FILE WAS : ',A12//) + END diff --git a/tools/connec/src/connec2d.c b/tools/connec/src/connec2d.c new file mode 100644 index 0000000..93a0d87 --- /dev/null +++ b/tools/connec/src/connec2d.c @@ -0,0 +1,683 @@ +/* connec2d.F -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#include "f2c.h" + +/* Table of constant values */ + +static integer c__3 = 3; +static integer c__1 = 1; +static integer c__9 = 9; +static integer c__4 = 4; + +/* CONNEC2D.FOR VER.21-FEB-2002 */ + +/* PROGRAM FOR CONNECTIVITY ANALYSIS OF A 2D INDICATOR MAP */ + +/* GIVEN AN INDICATOR FIELDS (VALUES 0 AND 1 ONLY), THE RANDOM SET */ +/* WITH VALUES 1 IS ANALYSED FOR CONNECTIVITY. */ + +/* INPUT PARAMETER FILE WITH */ + +/* IPHA : 0 OR 1 FOR CONNECTIVITY ANALYSIS OF PHASE 0 OR 1. */ +/* ICON : 4 FOR 4-CONNECTIVITY AND 8 FOR 8-CONNECTIVITY */ +/* CINP : INPUT FILE WITH INDICATOR VARIABLE (VALUS 0/1 ONLY) */ +/* NX NY : NUMBER OF POINTS IN X AND Y */ +/* DX DY : GRID DIMENSIONS IN X AND Y */ +/* COUT : OUTPUT FILE WITH STATISTICS */ +/* COU2 : OUTPUT FILE WITH CONNECTED COMPONENTS */ +/* COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCITON */ + +/* DX,DY ARE ONLY USED FOR CONVERTING GRID UNITS TO REAL UNITS. */ +/* NX : NUMBER OF POINTS ALONG THE X DIRECTION */ +/* NY : NUMBER OF POINTS ALONG THE Y DIRECTION */ + +/* IND(I,J) : 0/1 INDICATOR VALUE */ +/* AT THE TERMINATION OF THE PROGRAM THE MATRIX IND(I,J) CONTAINS */ +/* THE CONNECTED COMPONENTS WITH VALUES 1,2,3,4,5,... FOR FIRST, */ +/* SECOND, THIRD, ... ETC CONNECTED COMMPONENTS. */ +/* THE VALUE 0 REMAINS 0. */ +/* COUT : OUTPUT FILE WITH STATISTICS AND CONNECTIVITY FUNCTION. */ +/* COU2 : OUTPUT FILE WITH THE CONNECTED COMPONENTS. */ +/* COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCTION */ + +/* FOR THE CONNECTIVITY FUNCTION: */ +/* NPX(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG */ +/* THE X DIRECTION AND THAT BELONG TO FACIES 1. */ +/* NPCX(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. */ +/* NPY(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG */ +/* THE Y DIRECTION AND THAT BELONG TO FACIES 1. */ +/* NPCY(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. */ + + +/* PPHA : PROPORTION OF FACIES 1. */ +/* NCC : NUMBER OF CONNECTED COMPONENTS. */ +/* RISM : MEAN CONNECTED COMPONENT SIZE IN PIXELS. */ +/* RSME : MRAN SIZE IN REAL UNITS. */ +/* RTOT : MEAN SIZE RELATIVE TO SIZE OF FACIES 1. */ +/* RXME : MEAN LENGTH ALONG THE X DIRECTION. */ +/* RYME : MEAN LENGTH ALONG THE Y DIRECTION. */ +/* ICOM : NUMBER OF THE LARGEST COMPONENT. */ +/* ISMA : SIZE IN PIXELS (OR LARGEST COMPONENT). */ +/* RSIZ : SIZE RELATIVE TO SIZE OF FACIES 1. */ +/* IXMA : MAXIMUM LENGTH ALONG X. */ +/* IYMA : MAXIMUM LENGTH ALONG Y. */ +/* ISMI : SIZE OF SMALLEST COMPONENT. */ +/* IXMI : MINIMUM LENGTH ALONG X. */ +/* IYMI : MINIMUM LENGTH ALONG Y. */ +/* IPX : NUMBER OF PERCOLATING COMPONENTS ALONG X. */ +/* IPY : NUMBER OF PERCOLATING COMPONENTS ALONG Y. */ +/* CCFU(.,.) : CONNECTIVITY FUNCTION. */ + +/* CCFU(.,1): CONNECTIVITY FUNCTION ALONG X (E-W). */ +/* CCFU(.,2): CONNECTIVITY FUNCTION ALONG Y (N-S). */ +/* CCFU(.,3): CONNECTIVITY FUNCTION ALONG NE-SW DIRECTION. */ +/* CCFU(.,4): CONNECTIVITY FUNCTION ALONG NW-SE DIRECTION. */ +/* CCFU(.,5): MEAN CONNECTIVITY FUNCTION ALONG X AND Y. */ +/* CCFU(.,6): MEAN CONNECTIVITY FUNCTION ALONG THE DIAGONALS. */ + + +/* ---------------------------------------------------------------- */ + +/* Main program */ int MAIN__(void) +{ + /* Format strings */ + static char fmt_100[] = "(a)"; + + /* System generated locals */ + integer i__1, i__2; + olist o__1; + cllist cl__1; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer f_open(olist *), s_rsle(cilist *), do_lio(integer *, integer *, + char *, ftnlen), e_rsle(void), s_wsle(cilist *), e_wsle(void); + /* Subroutine */ int s_stop(char *, ftnlen); + integer s_rsfe(cilist *), do_fio(integer *, char *, ftnlen), e_rsfe(void), + f_clos(cllist *); + + /* Local variables */ + static integer i__, j; + static real dx, dy; + static integer nx, ny, iai, ncc, iaj, ind[16777216] /* was [4096][4096] */ + ; + static real val; + static integer nnn, nxm, nym; + static char cou2[12]; + static integer iare, ipha, jpha; + static char cpar[12]; + static integer icon; + static char cinp[12]; + static real ppha; + + /* Fortran I/O blocks */ + static cilist io___4 = { 0, 1, 0, 0, 0 }; + static cilist io___6 = { 0, 6, 0, 0, 0 }; + static cilist io___7 = { 0, 6, 0, 0, 0 }; + static cilist io___8 = { 0, 6, 0, 0, 0 }; + static cilist io___9 = { 0, 6, 0, 0, 0 }; + static cilist io___10 = { 0, 6, 0, 0, 0 }; + static cilist io___11 = { 0, 1, 0, 0, 0 }; + static cilist io___13 = { 0, 6, 0, 0, 0 }; + static cilist io___14 = { 0, 6, 0, 0, 0 }; + static cilist io___15 = { 0, 6, 0, 0, 0 }; + static cilist io___16 = { 0, 6, 0, 0, 0 }; + static cilist io___17 = { 0, 6, 0, 0, 0 }; + static cilist io___18 = { 0, 1, 0, fmt_100, 0 }; + static cilist io___20 = { 0, 1, 0, 0, 0 }; + static cilist io___23 = { 0, 1, 0, 0, 0 }; + static cilist io___26 = { 0, 1, 0, fmt_100, 0 }; + static cilist io___28 = { 0, 6, 0, 0, 0 }; + static cilist io___29 = { 0, 6, 0, 0, 0 }; + static cilist io___30 = { 0, 6, 0, 0, 0 }; + static cilist io___31 = { 0, 6, 0, 0, 0 }; + static cilist io___35 = { 0, 1, 0, 0, 0 }; + static cilist io___38 = { 0, 6, 0, 0, 0 }; + static cilist io___39 = { 0, 6, 0, 0, 0 }; + static cilist io___42 = { 0, 6, 0, 0, 0 }; + static cilist io___43 = { 0, 6, 0, 0, 0 }; + static cilist io___44 = { 0, 6, 0, 0, 0 }; + static cilist io___45 = { 0, 6, 0, 0, 0 }; + static cilist io___46 = { 0, 6, 0, 0, 0 }; + static cilist io___51 = { 0, 1, 0, 0, 0 }; + + +/* ,NPX(256),NPY(256),NPCX(256),NPCY(256) */ +/* DIMENSION NPE(256),NPW(256),NPCE(256),NPCW(256),CCFU(256,6) */ + + +/* MATRIX DIMENSION LIMITATION */ + + nxm = 4096; + nym = 4096; + + s_copy(cpar, "coninput.txt", (ftnlen)12, (ftnlen)12); + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cpar; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); + s_rsle(&io___4); + do_lio(&c__3, &c__1, (char *)&ipha, (ftnlen)sizeof(integer)); + e_rsle(); + if (ipha != 0 && ipha != 1) { + s_wsle(&io___6); + do_lio(&c__9, &c__1, "THE FIRST LINE IN THE PARAMETER FILE", (ftnlen) + 36); + e_wsle(); + s_wsle(&io___7); + do_lio(&c__9, &c__1, "MUST BE A 0 OR A 1", (ftnlen)18); + e_wsle(); + s_wsle(&io___8); + do_lio(&c__9, &c__1, "0 FOR CONNECTIVITY ANALYSIS OF PHASE 0", ( + ftnlen)38); + e_wsle(); + s_wsle(&io___9); + do_lio(&c__9, &c__1, "1 FOR CONNECTIVITY ANALYSIS OF PHASE 1", ( + ftnlen)38); + e_wsle(); + s_wsle(&io___10); + do_lio(&c__9, &c__1, "THE ACTUAL VALUE IN THE PARAMETER FILE IS: ", ( + ftnlen)43); + do_lio(&c__3, &c__1, (char *)&ipha, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + s_rsle(&io___11); + do_lio(&c__3, &c__1, (char *)&icon, (ftnlen)sizeof(integer)); + e_rsle(); + if (icon != 4 && icon != 8) { + s_wsle(&io___13); + do_lio(&c__9, &c__1, "THE SECOND LINE IN THE PARAMETER FILE", (ftnlen) + 37); + e_wsle(); + s_wsle(&io___14); + do_lio(&c__9, &c__1, "MUST BE A 4 OR A 8", (ftnlen)18); + e_wsle(); + s_wsle(&io___15); + do_lio(&c__9, &c__1, "4 MEANS 4-CONNECTIVITY", (ftnlen)22); + e_wsle(); + s_wsle(&io___16); + do_lio(&c__9, &c__1, "8 MEANS 8-CONNECTIVITY", (ftnlen)22); + e_wsle(); + s_wsle(&io___17); + do_lio(&c__9, &c__1, "THE ACTUAL VALUE IN THE PARAMETER FILE IS: ", ( + ftnlen)43); + do_lio(&c__3, &c__1, (char *)&icon, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + s_rsfe(&io___18); + do_fio(&c__1, cinp, (ftnlen)12); + e_rsfe(); + s_rsle(&io___20); + do_lio(&c__3, &c__1, (char *)&nx, (ftnlen)sizeof(integer)); + do_lio(&c__3, &c__1, (char *)&ny, (ftnlen)sizeof(integer)); + e_rsle(); + s_rsle(&io___23); + do_lio(&c__4, &c__1, (char *)&dx, (ftnlen)sizeof(real)); + do_lio(&c__4, &c__1, (char *)&dy, (ftnlen)sizeof(real)); + e_rsle(); + s_rsfe(&io___26); + do_fio(&c__1, cou2, (ftnlen)12); + e_rsfe(); + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + if (nx > nxm) { + s_wsle(&io___28); + do_lio(&c__9, &c__1, "MAXIMUM NX IS ", (ftnlen)14); + do_lio(&c__3, &c__1, (char *)&nxm, (ftnlen)sizeof(integer)); + e_wsle(); + s_wsle(&io___29); + do_lio(&c__9, &c__1, "ACTUAL VALUE IS ", (ftnlen)16); + do_lio(&c__3, &c__1, (char *)&nx, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + if (ny > nym) { + s_wsle(&io___30); + do_lio(&c__9, &c__1, "MAXIMUM NY IS ", (ftnlen)14); + do_lio(&c__3, &c__1, (char *)&nym, (ftnlen)sizeof(integer)); + e_wsle(); + s_wsle(&io___31); + do_lio(&c__9, &c__1, "ACTUAL VALUE IS ", (ftnlen)16); + do_lio(&c__3, &c__1, (char *)&ny, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + +/* READING EXPERIMENTAL INDICATOR DATA 2D FIELD */ + + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cinp; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); + jpha = 0; + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + s_rsle(&io___35); + do_lio(&c__4, &c__1, (char *)&val, (ftnlen)sizeof(real)); + e_rsle(); + ind[i__ + (j << 12) - 4097] = (integer) val; + if (ipha == 0) { + if ((integer) val == 0) { + ind[i__ + (j << 12) - 4097] = 1; + } else { + ind[i__ + (j << 12) - 4097] = 0; + } + } + if (ind[i__ + (j << 12) - 4097] != 1 && ind[i__ + (j << 12) - + 4097] != 0) { + s_wsle(&io___38); + do_lio(&c__9, &c__1, "EXPERIMENTAL DATA MUST BE INDICATOR DA" + "TA 0/1", (ftnlen)44); + e_wsle(); + s_wsle(&io___39); + do_lio(&c__9, &c__1, "ACTUAL VALUE : ", (ftnlen)15); + do_lio(&c__3, &c__1, (char *)&ind[i__ + (j << 12) - 4097], ( + ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + if (ipha == 0) { + if ((integer) val == 0) { + ind[i__ + (j << 12) - 4097] = 1; + } else { + ind[i__ + (j << 12) - 4097] = 0; + } + } + if (ind[i__ + (j << 12) - 4097] == 1) { + ++jpha; + } +/* L2: */ + } +/* L1: */ + } + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + iare = nx * ny; + ppha = (real) jpha / iare; + s_wsle(&io___42); + e_wsle(); + if (icon == 4) { + s_wsle(&io___43); + do_lio(&c__9, &c__1, "4-CONNECTIVITY ANALYSIS", (ftnlen)23); + e_wsle(); + } + if (icon == 8) { + s_wsle(&io___44); + do_lio(&c__9, &c__1, "8-CONNECTIVITY ANALYSIS", (ftnlen)23); + e_wsle(); + } + s_wsle(&io___45); + e_wsle(); + s_wsle(&io___46); + do_lio(&c__9, &c__1, "PROPORTION OF PHASE 1 IS: ", (ftnlen)26); + do_lio(&c__4, &c__1, (char *)&ppha, (ftnlen)sizeof(real)); + e_wsle(); + + +/* LOOKING FOR CONNECTED COMPONENTS */ + + ncc = 0; + +L5: + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + if (ind[i__ + (j << 12) - 4097] == 1) { + iai = i__; + iaj = j; + goto L8; + } +/* L7: */ + } +/* L6: */ + } +/* NO MORE CONNECTED COMPONENTS SENDING CONTROL TO LABEL 20 */ + goto L20; + +/* A NEW COMPONEND HAS BEEN FOUND, INCREASE NUMBER OF */ +/* CONNECTED COMPONENTS BY 1 */ + + +L8: + ++ncc; + +/* LOOKING FOR COMPONENT NCC WITH LABEL NNC+1 */ + + ind[iai + (iaj << 12) - 4097] = ncc + 1; + i__1 = nx; + for (i__ = iai; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = iaj; j <= i__2; ++j) { + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j << 12) - 4097] = ncc + 1; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + if (icon == 8) { + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + } +/* L10: */ + } +/* L9: */ + } + for (i__ = iai; i__ >= 1; --i__) { + for (j = iaj; j >= 1; --j) { + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j << 12) - 4097] = ncc + 1; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + if (icon == 8) { + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j - 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j + 1 << 12) - 4097] = ncc + 1; + } + } + } + } +/* L41: */ + } +/* L40: */ + } + +L62: + nnn = 0; + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j - 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + (j + 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (icon == 8) { + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j - 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j - 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ - 1 + (j + 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 << 12) - 4097] == 1) { + if (ind[i__ + (j << 12) - 4097] == ncc + 1) { + ind[i__ + 1 + (j + 1 << 12) - 4097] = ncc + 1; + ++nnn; + } + } + } + } +/* L61: */ + } +/* L60: */ + } + if (nnn > 0) { + goto L62; + } + goto L5; + +/* THE CONNECTED COMPONENT IS THE COMPONENT WITH VALUES */ +/* IA(I,J)=NCC, WE SUBSTRACT 1 FROM THE LEBEL */ + +L20: + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + if (ind[i__ + (j << 12) - 4097] != 0) { + --ind[i__ + (j << 12) - 4097]; + } +/* L51: */ + } +/* L50: */ + } + + +/* OUTPUT FILE WITH CONNECTED COMPONENTS */ + + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cou2; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); +/* OPEN (2,FILE=CINP) */ + + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { +/* READ (2,*) ZVA */ + s_wsle(&io___51); + do_lio(&c__3, &c__1, (char *)&ind[i__ + (j << 12) - 4097], ( + ftnlen)sizeof(integer)); + e_wsle(); +/* L16: */ + } +/* L15: */ + } + + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + +/* L110: */ +/* L120: */ +/* L130: */ +/* L140: */ +/* L150: */ +/* L160: */ +/* L170: */ +/* L175: */ +/* L176: */ +/* L177: */ +/* L178: */ +/* L180: */ +/* L190: */ +/* L200: */ +/* L210: */ +/* L220: */ +/* L230: */ +/* L235: */ +/* L236: */ +/* L237: */ +/* L238: */ +/* L240: */ +/* L250: */ +/* L260: */ +/* L270: */ +/* L280: */ +/* L290: */ +/* L295: */ +/* L300: */ +/* L310: */ +/* L320: */ +/* L321: */ +/* L322: */ +/* L323: */ +/* L330: */ +/* L400: */ +/* L410: */ +/* L420: */ +/* L425: */ +/* L430: */ +/* L440: */ + return 0; +} /* MAIN__ */ + diff --git a/tools/connec/src/connec2d.o b/tools/connec/src/connec2d.o new file mode 100644 index 0000000000000000000000000000000000000000..5008f4b6a71c7a53542a0b83833ca191836fe9ca GIT binary patch literal 33896 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 Po2fWye`x$=jsO1u0x5`t literal 0 HcmV?d00001 diff --git a/tools/connec/src/connec3d.F b/tools/connec/src/connec3d.F new file mode 100644 index 0000000..e612c70 --- /dev/null +++ b/tools/connec/src/connec3d.F @@ -0,0 +1,854 @@ +C CONNEC3D.FOR VER.11-NOV-2002 +C +C PROGRAM FOR CONNECTIVITY ANALYSIS OF A 3D INDICATOR MAP +C +C GIVEN AN INDICATOR FIELDS (VALUES 0 AND 1 ONLY), THE RANDOM SET +C WITH VALUES 1 IS ANALYSED FOR CONNECTIVITY. +C +C INPUT PARAMETER FILE WITH +C +C IPHA : 0 OR 1 FOR CONNECTIVITY ANALYSIS OF PHASE 0 OR 1. +C ICON : 6, 18 OR 26-CONNECTIVITY. +C CINP : INPUT FILE WITH INDICATOR VARIABLE (VALUS 0/1 ONLY) +C NX NY NZ : NUMBER OF POINTS IN X AND Y +C DX DY DZ : GRID DIMENSIONS IN X AND Y +C N2 : NUMBER OF LAGS FOR CONNECTIVITY FUNCTION CALCULATION +C COUT : OUTPUT FILE WITH STATISTICS +C COU2 : OUTPUT FILE WITH CONNECTED COMPONENTS +C COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCITON +C +C DX,DY,DZ ARE ONLY USED FOR CONVERTING GRID UNITS TO REAL UNITS. +C NX : NUMBER OF POINTS ALONG THE X DIRECTION +C NY : NUMBER OF POINTS ALONG THE Y DIRECTION +C NZ : NUMBER OF POINTS ALONG THE Z DIRECTION +C +C IND(I,J,L) : 0/1 INDICATOR VALUE +C AT THE TERMINATION OF THE PROGRAM THE MATRIX IND(I,J) CONTAINS +C THE CONNECTED COMPONENTS WITH VALUES 1,2,3,4,5,... FOR FIRST, +C SECOND, THIRD, ... ETC CONNECTED COMMPONENTS. +C THE VALUE 0 REMAINS 0. +C COUT : OUTPUT FILE WITH STATISTICS AND CONNECTIVITY FUNCTION. +C COU2 : OUTPUT FILE WITH THE CONNECTED COMPONENTS. +C COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCTION +C +C FOR THE CONNECTIVITY FUNCTION: +C NPX(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG +C THE X DIRECTION AND THAT BELONG TO FACIES 1. +C NPCX(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. +C NPY(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG +C THE Y DIRECTION AND THAT BELONG TO FACIES 1. +C NPCY(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. +C NPZ(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG +C THE Z DIRECTION AND THAT BELONG TO FACIES 1. +C NPCZ(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. +C +C +C PPHA : PROPORTION OF FACIES 1. +C NCC : NUMBER OF CONNECTED COMPONENTS. +C RISM : MEAN CONNECTED COMPONENT SIZE IN PIXELS. +C RSME : MRAN SIZE IN REAL UNITS. +C RTOT : MEAN SIZE RELATIVE TO SIZE OF FACIES 1. +C RXME : MEAN LENGTH ALONG THE X DIRECTION. +C RYME : MEAN LENGTH ALONG THE Y DIRECTION. +C RZME : MEAN LENGTH ALONG THE Z DIRECTION. +C ICOM : NUMBER OF THE LARGEST COMPONENT. +C ISMA : SIZE IN PIXELS (OR LARGEST COMPONENT). +C RSIZ : SIZE RELATIVE TO SIZE OF FACIES 1. +C IXMA : MAXIMUM LENGTH ALONG X. +C IYMA : MAXIMUM LENGTH ALONG Y. +C IZMA : MAXIMUM LENGTH ALONG Z. +C ISMI : SIZE OF SMALLEST COMPONENT. +C IXMI : MINIMUM LENGTH ALONG X. +C IYMI : MINIMUM LENGTH ALONG Y. +C IZMI : MINIMUM LENGTH ALONG Z. +C IPX : NUMBER OF PERCOLATING COMPONENTS ALONG X. +C IPY : NUMBER OF PERCOLATING COMPONENTS ALONG Y. +C IPZ : NUMBER OF PERCOLATING COMPONENTS ALONG Z. +C CCFU(.,.) : CONNECTIVITY FUNCTION. +C +C CCFU(.,1): CONNECTIVITY FUNCTION ALONG X (E-W). +C CCFU(.,2): CONNECTIVITY FUNCTION ALONG Y (N-S). +C CCFU(.,3): CONNECTIVITY FUNCTION ALONG Z (VERTICAL). +C CCFU(.,4): CONNECTIVITY FUNCTION ALONG 3D FIRST DIAGONAL. +C CCFU(.,5): CONNECTIVITY FUNCTION ALONG 3D SECOND DIAGONAL. +C CCFU(.,6): CONNECTIVITY FUNCTION ALONG 3D THIRD DIAGONAL. +C CCFU(.,7): CONNECTIVITY FUNCTION ALONG 3D FOURTH DIAGONAL. +C CCFU(.,8): MEAN CONNECTIVITY FUNCTION ALONG X AND Y. +C CCFU(.,9): MEAN CONNECTIVITY FUNCTION ALONG X,Y,Z. +C CCFU(.,10): MEAN CONNECTIVITY FUNCTION ALONG THE 3D DIAGONALS. +C CCFU(.,11): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL X-Y PLANE. +C CCFU(.,12): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL X-Y PLANE. +C CCFU(.,13): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL X-Z PLANE. +C CCFU(.,14): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL X-Z PLANE. +C CCFU(.,15): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL Y-Z PLANE. +C CCFU(.,16): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL Y-Z PLANE. +C +C +C ---------------------------------------------------------------- +C + DIMENSION IND(512,512,512) + + +C,NPX(256),NPY(256),NPCX(256),NPCY(256) +C DIMENSION NPZ(256),NPCZ(256),NP1(256),NP2(256),NP3(256) +C DIMENSION NP4(256) +C,NPC1(256),NPC2(256),NPC3(256),NPC4(256) +C DIMENSION CCFU(256,16) +C DIMENSION NXY1(256),NXY2(256),NXZ1(256),NXZ2(256) +C DIMENSION NYZ1(256),NYZ2(256),NCXY1(256),NCXY2(256) +C DIMENSION NCXZ1(256),NCXZ2(256),NCYZ1(256),NCYZ2(256) +C + CHARACTER*12 CPAR,CINP,COU2 +C +C MATRIX DIMENSION LIMITATION +C + NXM=256 + NYM=NXM + NZM=NXM +C + CPAR="coninput.txt" + OPEN (1,FILE=CPAR) + READ (1,*) IPHA + IF (IPHA.NE.0.AND.IPHA.NE.1) THEN + WRITE (6,*)'ERROR IN PARAMETER FILE !!!' + WRITE (6,*)'THE FIRST LINE IN THE PARAMETER FILE' + WRITE (6,*)'MUST BE A 0 OR A 1' + WRITE (6,*)'0 FOR CONNECTIVITY ANALYSIS OF PHASE 0' + WRITE (6,*)'1 FOR CONNECTIVITY ANALYSIS OF PHASE 1' + WRITE (6,*)'THE ACTUAL VALUE IN THE PARAMETER FILE IS: ',IPHA + STOP + END IF + READ (1,*) ICON + IF (ICON.NE.6.AND.ICON.NE.18.AND.ICON.NE.26) THEN + WRITE (6,*)'ERROR IN PARAMETER FILE !!!' + WRITE (6,*)'THE SECOND LINE IN THE PARAMETER FILE' + WRITE (6,*)'MUST BE 6, 18 OR 26' + WRITE (6,*)'6 MEANS 6-CONNECTIVITY (FACE CONNECTIVITY)' + WRITE (6,*)'18 MEANS 18-CONNECTIVITY (FACE+EDGE CONNECTIVITY)' + WRITE (6,*)'26 MEANS 26-CONNECTIVITY (FACE+EDGE+VERTEX CONN.)' + WRITE (6,*)'THE ACTUAL VALUE IN THE PARAMETER FILE IS: ',ICON + STOP + END IF + READ (1,100) CINP + READ (1,*) NX,NY,NZ + READ (1,*) DX,DY,DZ + READ (1,100) COU2 + CLOSE (1) + IF (NX.GT.NXM) THEN + WRITE (6,*)'ERROR IN PARAMETER FILE !!!' + WRITE (6,*)'MAXIMUM ALLOWED NX IS ',NXM + WRITE (6,*)'ACTUAL VALUE IS ',NX + STOP + END IF + IF (NY.GT.NYM) THEN + WRITE (6,*)'ERROR IN PARAMETER FILE !!!' + WRITE (6,*)'MAXIMUM ALLOWED NY IS ',NYM + WRITE (6,*)'ACTUAL VALUE IS ',NY + STOP + END IF + IF (NZ.GT.NZM) THEN + WRITE (6,*)'ERROR IN PARAMETER FILE !!!' + WRITE (6,*)'MAXIMUM ALLOWED NZ IS ',NZM + WRITE (6,*)'ACTUAL VALUE IS ',NZ + STOP + END IF +C +C READING EXPERIMENTAL INDICATOR DATA 3D FIELD +C + OPEN (1,FILE=CINP) + JPHA=0 + DO 1 I=1,NX + DO 2 J=1,NY + DO 3 L=1,NZ + READ (1,*) VAL + IND(I,J,L)=INT(VAL) + IF (IPHA.EQ.0) THEN + IF (INT(VAL).EQ.0) THEN + IND(I,J,L)=1 + ELSE + IND(I,J,L)=0 + END IF + END IF + IF (IND(I,J,L).NE.1.AND.IND(I,J,L).NE.0) THEN + WRITE (6,*)'EXPERIMENTAL DATA MUST BE INDICATOR DATA 0/1' + WRITE (6,*)'ACTUAL VALUE : ',IND(I,J,L) + STOP + END IF + IF (IPHA.EQ.0) THEN + IF (INT(VAL).EQ.0) THEN + IND(I,J,L)=1 + ELSE + IND(I,J,L)=0 + END IF + END IF + IF (IND(I,J,L).EQ.1) JPHA=JPHA+1 +3 CONTINUE +2 CONTINUE +1 CONTINUE + CLOSE (1) + IARE=NX*NY*NZ + PPHA=FLOAT(JPHA)/IARE + WRITE (6,*) + IF (ICON.EQ.6) WRITE (6,*)'6-CONNECTIVITY ANALYSIS' + IF (ICON.EQ.18) WRITE (6,*)'18-CONNECTIVITY ANALYSIS' + IF (ICON.EQ.26) WRITE (6,*)'26-CONNECTIVITY ANALYSIS' + WRITE (6,*) + WRITE (6,*)'PROPORTION OF PHASE 1 IS: ',PPHA +C +C +C LOOKING FOR CONNECTED COMPONENTS +C + NCC=0 +C +5 DO 6 I=1,NX + DO 7 J=1,NY + DO 67 L=1,NZ + IF (IND(I,J,L).EQ.1) THEN + IAI=I + IAJ=J + IAL=L + GOTO 8 + END IF +67 CONTINUE +7 CONTINUE +6 CONTINUE +C NO MORE CONNECTED COMPONENTS SENDING CONTROL TO LABEL 20 + GOTO 20 +C +C A NEW COMPONEND HAS BEEN FOUND, INCREASE NUMBER OF +C CONNECTED COMPONENTS BY 1 +C +C +8 NCC=NCC+1 + WRITE (6,*)'NCC : ',NCC +C +C LOOKING FOR COMPONENT NCC WITH LABEL NNC+1 +C + IND(IAI,IAJ,IAL)=NCC+1 + DO 9 I=IAI,NX + DO 10 J=IAJ,NY + DO 68 L=IAL,NZ +C +C 6-CONNECTIVITY +C + IF ((I-1).GT.0) THEN + IF (IND(I-1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L)=NCC+1 + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L)=NCC+1 + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L)=NCC+1 + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L)=NCC+1 + END IF + END IF + IF (L-1.GT.0) THEN + IF (IND(I,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J,L-1)=NCC+1 + END IF + END IF + IF (L+1.LE.NZ) THEN + IF (IND(I,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J,L+1)=NCC+1 + END IF + END IF +C +C 18-CONNECTIVITY +C + IF (ICON.GT.6) THEN + IF ((J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L-1)=NCC+1 + END IF + END IF + IF ((J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L-1)=NCC+1 + END IF + END IF + IF ((J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L+1)=NCC+1 + END IF + END IF + IF ((J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L+1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(L-1).GT.0) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L)=NCC+1 + END IF + END IF + END IF +C +C 26-CONNECTIVITY +C + IF (ICON.GT.18) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I+1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I-1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I+1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L+1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L+1)=NCC+1 + END IF + END IF + END IF +68 CONTINUE +10 CONTINUE +9 CONTINUE + DO 40 I=IAI,1,-1 + DO 41 J=IAJ,1,-1 + DO 69 L=IAL,1,-1 +C +C 6-CONNECTIVITY +C + IF ((I-1).GT.0) THEN + IF (IND(I-1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L)=NCC+1 + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L)=NCC+1 + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L)=NCC+1 + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L)=NCC+1 + END IF + END IF + IF (L-1.GT.0) THEN + IF (IND(I,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J,L-1)=NCC+1 + END IF + END IF + IF (L+1.LE.NZ) THEN + IF (IND(I,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J,L+1)=NCC+1 + END IF + END IF +C +C 18-CONNECTIVITY +C + IF (ICON.GT.6) THEN + IF ((J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L-1)=NCC+1 + END IF + END IF + IF ((J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L-1)=NCC+1 + END IF + END IF + IF ((J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J-1,L+1)=NCC+1 + END IF + END IF + IF ((J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I,J+1,L+1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(L-1).GT.0) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L)=NCC+1 + END IF + END IF + END IF +C +C 26-CONNECTIVITY +C + IF (ICON.GT.18) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I+1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I-1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L-1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I+1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L-1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J-1,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J-1,L+1)=NCC+1 + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I-1,J+1,L+1)=NCC+1 + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) IND(I+1,J+1,L+1)=NCC+1 + END IF + END IF + END IF +69 CONTINUE +41 CONTINUE +40 CONTINUE +C +62 NNN=0 + DO 60 I=1,NX + DO 61 J=1,NY + DO 70 L=1,NZ +C +C 6-CONNECTIVITY +C + IF ((I-1).GT.0) THEN + IF (IND(I-1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (I+1.LE.NX) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (J-1.GT.0) THEN + IF (IND(I,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J-1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (J+1.LE.NY) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J+1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (L-1.GT.0) THEN + IF (IND(I,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF (L+1.LE.NZ) THEN + IF (IND(I,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF +C +C 18-CONNECTIVITY +C + IF (ICON.GT.6) THEN + IF ((J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J-1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J+1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J-1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I,J+1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(L-1).GT.0) THEN + IF (IND(I+1,J,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY) THEN + IF (IND(I+1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J+1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0) THEN + IF (IND(I+1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J-1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY) THEN + IF (IND(I-1,J+1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J+1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0) THEN + IF (IND(I-1,J-1,L).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J-1,L)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + END IF +C +C 26-CONNECTIVITY +C + IF (ICON.GT.18) THEN + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I-1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J-1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L-1).GT.0) THEN + IF (IND(I+1,J-1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J-1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I-1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J+1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L-1).GT.0) THEN + IF (IND(I+1,J+1,L-1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J+1,L-1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J-1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J-1).GT.0.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J-1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J-1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I-1).GT.0.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I-1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I-1,J+1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + IF ((I+1).LE.NX.AND.(J+1).LE.NY.AND.(L+1).LE.NZ) THEN + IF (IND(I+1,J+1,L+1).EQ.1) THEN + IF (IND(I,J,L).EQ.NCC+1) THEN + IND(I+1,J+1,L+1)=NCC+1 + NNN=NNN+1 + END IF + END IF + END IF + END IF +70 CONTINUE +61 CONTINUE +60 CONTINUE + IF (NNN.GT.0) GOTO 62 + GOTO 5 +C +C THE CONNECTED COMPONENT IS THE COMPONENT WITH VALUES +C IA(I,J,L)=NCC, WE SUBSTRACT 1 FROM THE LEBEL +C +20 DO 50 I=1,NX + DO 51 J=1,NY + DO 71 L=1,NZ + IF (IND(I,J,L).NE.0) IND(I,J,L)=IND(I,J,L)-1 +71 CONTINUE +51 CONTINUE +50 CONTINUE +C + +C OUTPUT FILE WITH CONNECTED COMPONENTS +C + OPEN (1,FILE=COU2) +C + DO 15 I=1,NX + DO 16 J=1,NY + DO 85 L=1,NZ + WRITE (1,*) IND(I,J,L) +85 CONTINUE +16 CONTINUE +15 CONTINUE +C + CLOSE (1) + +C +100 FORMAT (A) +110 FORMAT (1X,'INPUT INDICATOR FILE : ',A12) +120 FORMAT (1X,'NX : ',I6) +130 FORMAT (1X,'NY : ',I6) +131 FORMAT (1X,'NZ : ',I6) +140 FORMAT (1X,'DX : ',F10.3) +150 FORMAT (1X,'DY : ',F10.3) +151 FORMAT (1X,'DZ : ',F10.3) +160 FORMAT (1X,'PROPORTION OF FACIES ',I1,' : ',F10.4) +170 FORMAT (/1X,'CONNECTED COMPONENTS STATISTICS'// + * /1X,'NUMBER OF CONNECTED COMPONENTS : ',I6) +175 FORMAT (/1X,'AVERAGES'/1X,8('=')) +176 FORMAT (/1X,'MINIMA'/1X,6('=')) +177 FORMAT (/1X,'MAXIMA'/1X,6('=')) +178 FORMAT (/1X,'PERCOLATION'/1X,11('=')) +180 FORMAT (1X,'MEAN SIZE IN PIXELS : ',F10.4) +190 FORMAT (1X,'MEAN SIZE REAL UNITS : ',F12.4) +200 FORMAT (1X,'MEAN SIZE RELATIVE TO TOTAL AREA OF FACIES ',I1, + * ' : ',F10.4) +210 FORMAT (1X,'MEAN LENGTH ALONG X (IN PIXELS) : ',F10.4) +220 FORMAT (1X,'MINIMUM LENGTH ALONG X (IN PIXELS) : ',I6) +230 FORMAT (1X,'MAXIMUM LENGTH ALONG X (IN PIXELS) : ',I6) +235 FORMAT (1X,'THE LARGEST COMPONENT IS NUMBER : ',I6) +236 FORMAT (1X,'WITH MAXIMUM SIZE IN PIXELS : ',I6) +237 FORMAT (1X,'AND RELATIVE TO TOTAL AREA OF FACIES ' + * ,I1,' : ',F10.4) +238 FORMAT (1X,'SIZE IN PIXELS OF SMALLEST COMPONENT : ',I6) +240 FORMAT (1X,'MEAN LENGTH ALONG Y (IN PIXELS) : ',F10.4) +241 FORMAT (1X,'MEAN LENGTH ALONG Z (IN PIXELS) : ',F10.4) +250 FORMAT (1X,'MIMIMUN LENGTH ALONG Y (IN PIXELS) : ',I6) +260 FORMAT (1X,'MAXIMUM LENGTH ALONG Y (IN PIXELS) : ',I6) +251 FORMAT (1X,'MIMIMUN LENGTH ALONG Z (IN PIXELS) : ',I6) +261 FORMAT (1X,'MAXIMUM LENGTH ALONG Z (IN PIXELS) : ',I6) + +270 FORMAT (1X,'NUMBER OF PERCOLATING COMPONENTS IN X : ',I6) +280 FORMAT (1X,'NUMBER OF PERCOLATING COMPONENTS IN Y : ',I6) +281 FORMAT (1X,'NUMBER OF PERCOLATING COMPONENTS IN Z : ',I6) +290 FORMAT (/1X,'OUTPUT FILE WITH CONNECTED COMPONENTS : ',A12) +295 FORMAT (/1X,'OUTPUT FILE WITH CONNECTIVIY FUNCTION : ',A12) +300 FORMAT (/1X,'CONNECTIVITY FUNCTION'/1X,21('=') + * //1X,'ALONG THE X DIRECTION (1,0,0)') +310 FORMAT (F10.3,F12.6,2I12) +320 FORMAT (/1X,'ALONG THE Y DIRECTION (0,1,0)') +321 FORMAT (/1X,'ALONG THE Z DIRECTION (0,0,1)') +322 FORMAT (/1X,'ALONG THE FIRST 3D DIAGONAL (1,1,1)') +323 FORMAT (/1X,'ALONG THE SECOND 3D DIAGONAL (1,-1,1)') +324 FORMAT (/1X,'ALONG THE THIRD 3D DIAGONAL (-1,-1,1)') +325 FORMAT (/1X,'ALONG THE FOURTH 3D DIAGONAL (-1,1,1)') +327 FORMAT (/1X,'AVERAGE ALONG THE 3D DIAGONALS') +330 FORMAT (/1X,'AVERAGE ALONG X AND Y') +328 FORMAT (/1X,'AVERAGE ALONG X, Y AND Z') +329 FORMAT (/1X,'FIRST DIAGONAL ON THE X-Y PLANE (1,1,0)') +331 FORMAT (/1X,'SECOND DIAGONAL ON THE X-Y PLANE (1,-1,0') +332 FORMAT (/1X,'FIRST DIAGONAL ON THE X-Z PLANE (1,0,1)') +333 FORMAT (/1X,'SECOND DIAGONAL ON THE X-Z PLANE (1,0,-1)') +334 FORMAT (/1X,'FIRST DIAGONAL ON THE Y-Z PLANE (0,1,1)') +335 FORMAT (/1X,'SECOND DIAGONAL ON THE Y-Z PLANE (0,1,-1)') +400 FORMAT (25(/),1X,'CONNEC3D PROGRAM VER. 1.0'/1X,27('=')/// + * 1X,'INPUT PARAMETER FILE ---> ',$) +410 FORMAT (/1X,'OUTPUT FILE WITH STATISTICS AND CONNECTIVITY ' + * 'FUNCTION: ',A12) +420 FORMAT (/1X,'OUTPUT FILE WITH CONNECTED COMPONENTS: ',A12) +425 FORMAT (/1X,'OUTPUT FILE WITH CONNECTIVITY FUNCTION: ',A12) +430 FORMAT (1X,'OUTPUT RESULTS OF CONNEC3D'//1X'6-CONNECTIVITY' + * ' ANALYSIS'/1X,'PARAMETER FILE WAS : ',A12//) +440 FORMAT (1X,'OUTPUT RESULTS OF CONNEC3D'//1X'18-CONNECTIVITY' + * ' ANALYSIS'/1X,'PARAMETER FILE WAS : ',A12//) +450 FORMAT (1X,'OUTPUT RESULTS OF CONNEC3D'//1X'26-CONNECTIVITY' + * ' ANALYSIS'/1X,'PARAMETER FILE WAS : ',A12//) + END diff --git a/tools/connec/src/connec3d.c b/tools/connec/src/connec3d.c new file mode 100644 index 0000000..a3d231d --- /dev/null +++ b/tools/connec/src/connec3d.c @@ -0,0 +1,1449 @@ +/* connec3d.F -- translated by f2c (version 20200916). + You must link the resulting object file with libf2c: + on Microsoft Windows system, link with libf2c.lib; + on Linux or Unix systems, link with .../path/to/libf2c.a -lm + or, if you install libf2c.a in a standard place, with -lf2c -lm + -- in that order, at the end of the command line, as in + cc *.o -lf2c -lm + Source for libf2c is in /netlib/f2c/libf2c.zip, e.g., + + http://www.netlib.org/f2c/libf2c.zip +*/ + +#include "f2c.h" + +/* Table of constant values */ + +static integer c__3 = 3; +static integer c__1 = 1; +static integer c__9 = 9; +static integer c__4 = 4; + +/* CONNEC3D.FOR VER.11-NOV-2002 */ + +/* PROGRAM FOR CONNECTIVITY ANALYSIS OF A 3D INDICATOR MAP */ + +/* GIVEN AN INDICATOR FIELDS (VALUES 0 AND 1 ONLY), THE RANDOM SET */ +/* WITH VALUES 1 IS ANALYSED FOR CONNECTIVITY. */ + +/* INPUT PARAMETER FILE WITH */ + +/* IPHA : 0 OR 1 FOR CONNECTIVITY ANALYSIS OF PHASE 0 OR 1. */ +/* ICON : 6, 18 OR 26-CONNECTIVITY. */ +/* CINP : INPUT FILE WITH INDICATOR VARIABLE (VALUS 0/1 ONLY) */ +/* NX NY NZ : NUMBER OF POINTS IN X AND Y */ +/* DX DY DZ : GRID DIMENSIONS IN X AND Y */ +/* N2 : NUMBER OF LAGS FOR CONNECTIVITY FUNCTION CALCULATION */ +/* COUT : OUTPUT FILE WITH STATISTICS */ +/* COU2 : OUTPUT FILE WITH CONNECTED COMPONENTS */ +/* COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCITON */ + +/* DX,DY,DZ ARE ONLY USED FOR CONVERTING GRID UNITS TO REAL UNITS. */ +/* NX : NUMBER OF POINTS ALONG THE X DIRECTION */ +/* NY : NUMBER OF POINTS ALONG THE Y DIRECTION */ +/* NZ : NUMBER OF POINTS ALONG THE Z DIRECTION */ + +/* IND(I,J,L) : 0/1 INDICATOR VALUE */ +/* AT THE TERMINATION OF THE PROGRAM THE MATRIX IND(I,J) CONTAINS */ +/* THE CONNECTED COMPONENTS WITH VALUES 1,2,3,4,5,... FOR FIRST, */ +/* SECOND, THIRD, ... ETC CONNECTED COMMPONENTS. */ +/* THE VALUE 0 REMAINS 0. */ +/* COUT : OUTPUT FILE WITH STATISTICS AND CONNECTIVITY FUNCTION. */ +/* COU2 : OUTPUT FILE WITH THE CONNECTED COMPONENTS. */ +/* COU3 : OUTPUT FILE WITH CONNECTIVITY FUNCTION */ + +/* FOR THE CONNECTIVITY FUNCTION: */ +/* NPX(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG */ +/* THE X DIRECTION AND THAT BELONG TO FACIES 1. */ +/* NPCX(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. */ +/* NPY(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG */ +/* THE Y DIRECTION AND THAT BELONG TO FACIES 1. */ +/* NPCY(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. */ +/* NPZ(K): NUMBER OF PAIRS OF VALUES SEPARATED A DISTANCE K ALONG */ +/* THE Z DIRECTION AND THAT BELONG TO FACIES 1. */ +/* NPCZ(K): NUMBER OF THE PREVIOUS VALUES THAT ARE CONNECTED. */ + + +/* PPHA : PROPORTION OF FACIES 1. */ +/* NCC : NUMBER OF CONNECTED COMPONENTS. */ +/* RISM : MEAN CONNECTED COMPONENT SIZE IN PIXELS. */ +/* RSME : MRAN SIZE IN REAL UNITS. */ +/* RTOT : MEAN SIZE RELATIVE TO SIZE OF FACIES 1. */ +/* RXME : MEAN LENGTH ALONG THE X DIRECTION. */ +/* RYME : MEAN LENGTH ALONG THE Y DIRECTION. */ +/* RZME : MEAN LENGTH ALONG THE Z DIRECTION. */ +/* ICOM : NUMBER OF THE LARGEST COMPONENT. */ +/* ISMA : SIZE IN PIXELS (OR LARGEST COMPONENT). */ +/* RSIZ : SIZE RELATIVE TO SIZE OF FACIES 1. */ +/* IXMA : MAXIMUM LENGTH ALONG X. */ +/* IYMA : MAXIMUM LENGTH ALONG Y. */ +/* IZMA : MAXIMUM LENGTH ALONG Z. */ +/* ISMI : SIZE OF SMALLEST COMPONENT. */ +/* IXMI : MINIMUM LENGTH ALONG X. */ +/* IYMI : MINIMUM LENGTH ALONG Y. */ +/* IZMI : MINIMUM LENGTH ALONG Z. */ +/* IPX : NUMBER OF PERCOLATING COMPONENTS ALONG X. */ +/* IPY : NUMBER OF PERCOLATING COMPONENTS ALONG Y. */ +/* IPZ : NUMBER OF PERCOLATING COMPONENTS ALONG Z. */ +/* CCFU(.,.) : CONNECTIVITY FUNCTION. */ + +/* CCFU(.,1): CONNECTIVITY FUNCTION ALONG X (E-W). */ +/* CCFU(.,2): CONNECTIVITY FUNCTION ALONG Y (N-S). */ +/* CCFU(.,3): CONNECTIVITY FUNCTION ALONG Z (VERTICAL). */ +/* CCFU(.,4): CONNECTIVITY FUNCTION ALONG 3D FIRST DIAGONAL. */ +/* CCFU(.,5): CONNECTIVITY FUNCTION ALONG 3D SECOND DIAGONAL. */ +/* CCFU(.,6): CONNECTIVITY FUNCTION ALONG 3D THIRD DIAGONAL. */ +/* CCFU(.,7): CONNECTIVITY FUNCTION ALONG 3D FOURTH DIAGONAL. */ +/* CCFU(.,8): MEAN CONNECTIVITY FUNCTION ALONG X AND Y. */ +/* CCFU(.,9): MEAN CONNECTIVITY FUNCTION ALONG X,Y,Z. */ +/* CCFU(.,10): MEAN CONNECTIVITY FUNCTION ALONG THE 3D DIAGONALS. */ +/* CCFU(.,11): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL X-Y PLANE. */ +/* CCFU(.,12): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL X-Y PLANE. */ +/* CCFU(.,13): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL X-Z PLANE. */ +/* CCFU(.,14): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL X-Z PLANE. */ +/* CCFU(.,15): CONNECTIVITY FUNCTION ALONG FIRST DIAGONAL Y-Z PLANE. */ +/* CCFU(.,16): CONNECTIVITY FUNCTION ALONG SECOND DIAGONAL Y-Z PLANE. */ + + +/* ---------------------------------------------------------------- */ + +/* Main program */ int MAIN__(void) +{ + /* Format strings */ + static char fmt_100[] = "(a)"; + + /* System generated locals */ + integer i__1, i__2, i__3; + olist o__1; + cllist cl__1; + + /* Builtin functions */ + /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); + integer f_open(olist *), s_rsle(cilist *), do_lio(integer *, integer *, + char *, ftnlen), e_rsle(void), s_wsle(cilist *), e_wsle(void); + /* Subroutine */ int s_stop(char *, ftnlen); + integer s_rsfe(cilist *), do_fio(integer *, char *, ftnlen), e_rsfe(void), + f_clos(cllist *); + + /* Local variables */ + static integer i__, j, l; + static real dx, dy, dz; + static integer nx, ny, nz, iai, ncc, iaj, ial, ind[134217728] /* + was [512][512][512] */; + static real val; + static integer nnn, nxm, nym, nzm; + static char cou2[12]; + static integer iare, ipha, jpha; + static char cpar[12]; + static integer icon; + static char cinp[12]; + static real ppha; + + /* Fortran I/O blocks */ + static cilist io___5 = { 0, 1, 0, 0, 0 }; + static cilist io___7 = { 0, 6, 0, 0, 0 }; + static cilist io___8 = { 0, 6, 0, 0, 0 }; + static cilist io___9 = { 0, 6, 0, 0, 0 }; + static cilist io___10 = { 0, 6, 0, 0, 0 }; + static cilist io___11 = { 0, 6, 0, 0, 0 }; + static cilist io___12 = { 0, 6, 0, 0, 0 }; + static cilist io___13 = { 0, 1, 0, 0, 0 }; + static cilist io___15 = { 0, 6, 0, 0, 0 }; + static cilist io___16 = { 0, 6, 0, 0, 0 }; + static cilist io___17 = { 0, 6, 0, 0, 0 }; + static cilist io___18 = { 0, 6, 0, 0, 0 }; + static cilist io___19 = { 0, 6, 0, 0, 0 }; + static cilist io___20 = { 0, 6, 0, 0, 0 }; + static cilist io___21 = { 0, 6, 0, 0, 0 }; + static cilist io___22 = { 0, 1, 0, fmt_100, 0 }; + static cilist io___24 = { 0, 1, 0, 0, 0 }; + static cilist io___28 = { 0, 1, 0, 0, 0 }; + static cilist io___32 = { 0, 1, 0, fmt_100, 0 }; + static cilist io___34 = { 0, 6, 0, 0, 0 }; + static cilist io___35 = { 0, 6, 0, 0, 0 }; + static cilist io___36 = { 0, 6, 0, 0, 0 }; + static cilist io___37 = { 0, 6, 0, 0, 0 }; + static cilist io___38 = { 0, 6, 0, 0, 0 }; + static cilist io___39 = { 0, 6, 0, 0, 0 }; + static cilist io___40 = { 0, 6, 0, 0, 0 }; + static cilist io___41 = { 0, 6, 0, 0, 0 }; + static cilist io___42 = { 0, 6, 0, 0, 0 }; + static cilist io___47 = { 0, 1, 0, 0, 0 }; + static cilist io___50 = { 0, 6, 0, 0, 0 }; + static cilist io___51 = { 0, 6, 0, 0, 0 }; + static cilist io___54 = { 0, 6, 0, 0, 0 }; + static cilist io___55 = { 0, 6, 0, 0, 0 }; + static cilist io___56 = { 0, 6, 0, 0, 0 }; + static cilist io___57 = { 0, 6, 0, 0, 0 }; + static cilist io___58 = { 0, 6, 0, 0, 0 }; + static cilist io___59 = { 0, 6, 0, 0, 0 }; + static cilist io___64 = { 0, 6, 0, 0, 0 }; + static cilist io___66 = { 0, 1, 0, 0, 0 }; + + +/* ,NPX(256),NPY(256),NPCX(256),NPCY(256) */ +/* DIMENSION NPZ(256),NPCZ(256),NP1(256),NP2(256),NP3(256) */ +/* DIMENSION NP4(256) */ +/* ,NPC1(256),NPC2(256),NPC3(256),NPC4(256) */ +/* DIMENSION CCFU(256,16) */ +/* DIMENSION NXY1(256),NXY2(256),NXZ1(256),NXZ2(256) */ +/* DIMENSION NYZ1(256),NYZ2(256),NCXY1(256),NCXY2(256) */ +/* DIMENSION NCXZ1(256),NCXZ2(256),NCYZ1(256),NCYZ2(256) */ + + +/* MATRIX DIMENSION LIMITATION */ + + nxm = 256; + nym = nxm; + nzm = nxm; + + s_copy(cpar, "coninput.txt", (ftnlen)12, (ftnlen)12); + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cpar; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); + s_rsle(&io___5); + do_lio(&c__3, &c__1, (char *)&ipha, (ftnlen)sizeof(integer)); + e_rsle(); + if (ipha != 0 && ipha != 1) { + s_wsle(&io___7); + do_lio(&c__9, &c__1, "ERROR IN PARAMETER FILE !!!", (ftnlen)27); + e_wsle(); + s_wsle(&io___8); + do_lio(&c__9, &c__1, "THE FIRST LINE IN THE PARAMETER FILE", (ftnlen) + 36); + e_wsle(); + s_wsle(&io___9); + do_lio(&c__9, &c__1, "MUST BE A 0 OR A 1", (ftnlen)18); + e_wsle(); + s_wsle(&io___10); + do_lio(&c__9, &c__1, "0 FOR CONNECTIVITY ANALYSIS OF PHASE 0", ( + ftnlen)38); + e_wsle(); + s_wsle(&io___11); + do_lio(&c__9, &c__1, "1 FOR CONNECTIVITY ANALYSIS OF PHASE 1", ( + ftnlen)38); + e_wsle(); + s_wsle(&io___12); + do_lio(&c__9, &c__1, "THE ACTUAL VALUE IN THE PARAMETER FILE IS: ", ( + ftnlen)43); + do_lio(&c__3, &c__1, (char *)&ipha, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + s_rsle(&io___13); + do_lio(&c__3, &c__1, (char *)&icon, (ftnlen)sizeof(integer)); + e_rsle(); + if (icon != 6 && icon != 18 && icon != 26) { + s_wsle(&io___15); + do_lio(&c__9, &c__1, "ERROR IN PARAMETER FILE !!!", (ftnlen)27); + e_wsle(); + s_wsle(&io___16); + do_lio(&c__9, &c__1, "THE SECOND LINE IN THE PARAMETER FILE", (ftnlen) + 37); + e_wsle(); + s_wsle(&io___17); + do_lio(&c__9, &c__1, "MUST BE 6, 18 OR 26", (ftnlen)19); + e_wsle(); + s_wsle(&io___18); + do_lio(&c__9, &c__1, "6 MEANS 6-CONNECTIVITY (FACE CONNECTIVITY)", ( + ftnlen)42); + e_wsle(); + s_wsle(&io___19); + do_lio(&c__9, &c__1, "18 MEANS 18-CONNECTIVITY (FACE+EDGE CONNECTIVI" + "TY)", (ftnlen)49); + e_wsle(); + s_wsle(&io___20); + do_lio(&c__9, &c__1, "26 MEANS 26-CONNECTIVITY (FACE+EDGE+VERTEX CON" + "N.)", (ftnlen)49); + e_wsle(); + s_wsle(&io___21); + do_lio(&c__9, &c__1, "THE ACTUAL VALUE IN THE PARAMETER FILE IS: ", ( + ftnlen)43); + do_lio(&c__3, &c__1, (char *)&icon, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + s_rsfe(&io___22); + do_fio(&c__1, cinp, (ftnlen)12); + e_rsfe(); + s_rsle(&io___24); + do_lio(&c__3, &c__1, (char *)&nx, (ftnlen)sizeof(integer)); + do_lio(&c__3, &c__1, (char *)&ny, (ftnlen)sizeof(integer)); + do_lio(&c__3, &c__1, (char *)&nz, (ftnlen)sizeof(integer)); + e_rsle(); + s_rsle(&io___28); + do_lio(&c__4, &c__1, (char *)&dx, (ftnlen)sizeof(real)); + do_lio(&c__4, &c__1, (char *)&dy, (ftnlen)sizeof(real)); + do_lio(&c__4, &c__1, (char *)&dz, (ftnlen)sizeof(real)); + e_rsle(); + s_rsfe(&io___32); + do_fio(&c__1, cou2, (ftnlen)12); + e_rsfe(); + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + if (nx > nxm) { + s_wsle(&io___34); + do_lio(&c__9, &c__1, "ERROR IN PARAMETER FILE !!!", (ftnlen)27); + e_wsle(); + s_wsle(&io___35); + do_lio(&c__9, &c__1, "MAXIMUM ALLOWED NX IS ", (ftnlen)22); + do_lio(&c__3, &c__1, (char *)&nxm, (ftnlen)sizeof(integer)); + e_wsle(); + s_wsle(&io___36); + do_lio(&c__9, &c__1, "ACTUAL VALUE IS ", (ftnlen)16); + do_lio(&c__3, &c__1, (char *)&nx, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + if (ny > nym) { + s_wsle(&io___37); + do_lio(&c__9, &c__1, "ERROR IN PARAMETER FILE !!!", (ftnlen)27); + e_wsle(); + s_wsle(&io___38); + do_lio(&c__9, &c__1, "MAXIMUM ALLOWED NY IS ", (ftnlen)22); + do_lio(&c__3, &c__1, (char *)&nym, (ftnlen)sizeof(integer)); + e_wsle(); + s_wsle(&io___39); + do_lio(&c__9, &c__1, "ACTUAL VALUE IS ", (ftnlen)16); + do_lio(&c__3, &c__1, (char *)&ny, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + if (nz > nzm) { + s_wsle(&io___40); + do_lio(&c__9, &c__1, "ERROR IN PARAMETER FILE !!!", (ftnlen)27); + e_wsle(); + s_wsle(&io___41); + do_lio(&c__9, &c__1, "MAXIMUM ALLOWED NZ IS ", (ftnlen)22); + do_lio(&c__3, &c__1, (char *)&nzm, (ftnlen)sizeof(integer)); + e_wsle(); + s_wsle(&io___42); + do_lio(&c__9, &c__1, "ACTUAL VALUE IS ", (ftnlen)16); + do_lio(&c__3, &c__1, (char *)&nz, (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + +/* READING EXPERIMENTAL INDICATOR DATA 3D FIELD */ + + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cinp; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); + jpha = 0; + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + i__3 = nz; + for (l = 1; l <= i__3; ++l) { + s_rsle(&io___47); + do_lio(&c__4, &c__1, (char *)&val, (ftnlen)sizeof(real)); + e_rsle(); + ind[i__ + (j + (l << 9) << 9) - 262657] = (integer) val; + if (ipha == 0) { + if ((integer) val == 0) { + ind[i__ + (j + (l << 9) << 9) - 262657] = 1; + } else { + ind[i__ + (j + (l << 9) << 9) - 262657] = 0; + } + } + if (ind[i__ + (j + (l << 9) << 9) - 262657] != 1 && ind[i__ + + (j + (l << 9) << 9) - 262657] != 0) { + s_wsle(&io___50); + do_lio(&c__9, &c__1, "EXPERIMENTAL DATA MUST BE INDICATO" + "R DATA 0/1", (ftnlen)44); + e_wsle(); + s_wsle(&io___51); + do_lio(&c__9, &c__1, "ACTUAL VALUE : ", (ftnlen)15); + do_lio(&c__3, &c__1, (char *)&ind[i__ + (j + (l << 9) << + 9) - 262657], (ftnlen)sizeof(integer)); + e_wsle(); + s_stop("", (ftnlen)0); + } + if (ipha == 0) { + if ((integer) val == 0) { + ind[i__ + (j + (l << 9) << 9) - 262657] = 1; + } else { + ind[i__ + (j + (l << 9) << 9) - 262657] = 0; + } + } + if (ind[i__ + (j + (l << 9) << 9) - 262657] == 1) { + ++jpha; + } +/* L3: */ + } +/* L2: */ + } +/* L1: */ + } + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + iare = nx * ny * nz; + ppha = (real) jpha / iare; + s_wsle(&io___54); + e_wsle(); + if (icon == 6) { + s_wsle(&io___55); + do_lio(&c__9, &c__1, "6-CONNECTIVITY ANALYSIS", (ftnlen)23); + e_wsle(); + } + if (icon == 18) { + s_wsle(&io___56); + do_lio(&c__9, &c__1, "18-CONNECTIVITY ANALYSIS", (ftnlen)24); + e_wsle(); + } + if (icon == 26) { + s_wsle(&io___57); + do_lio(&c__9, &c__1, "26-CONNECTIVITY ANALYSIS", (ftnlen)24); + e_wsle(); + } + s_wsle(&io___58); + e_wsle(); + s_wsle(&io___59); + do_lio(&c__9, &c__1, "PROPORTION OF PHASE 1 IS: ", (ftnlen)26); + do_lio(&c__4, &c__1, (char *)&ppha, (ftnlen)sizeof(real)); + e_wsle(); + + +/* LOOKING FOR CONNECTED COMPONENTS */ + + ncc = 0; + +L5: + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + i__3 = nz; + for (l = 1; l <= i__3; ++l) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == 1) { + iai = i__; + iaj = j; + ial = l; + goto L8; + } +/* L67: */ + } +/* L7: */ + } +/* L6: */ + } +/* NO MORE CONNECTED COMPONENTS SENDING CONTROL TO LABEL 20 */ + goto L20; + +/* A NEW COMPONEND HAS BEEN FOUND, INCREASE NUMBER OF */ +/* CONNECTED COMPONENTS BY 1 */ + + +L8: + ++ncc; + s_wsle(&io___64); + do_lio(&c__9, &c__1, "NCC : ", (ftnlen)6); + do_lio(&c__3, &c__1, (char *)&ncc, (ftnlen)sizeof(integer)); + e_wsle(); + +/* LOOKING FOR COMPONENT NCC WITH LABEL NNC+1 */ + + ind[iai + (iaj + (ial << 9) << 9) - 262657] = ncc + 1; + i__1 = nx; + for (i__ = iai; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = iaj; j <= i__2; ++j) { + i__3 = nz; + for (l = ial; l <= i__3; ++l) { + +/* 6-CONNECTIVITY */ + + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ - 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j - 1 + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + 1 + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (l - 1 > 0) { + if (ind[i__ + (j + (l - 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l - 1 << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (l + 1 <= nz) { + if (ind[i__ + (j + (l + 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l + 1 << 9) << 9) - 262657] = ncc + + 1; + } + } + } + +/* 18-CONNECTIVITY */ + + if (icon > 6) { + if (j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + (j - 1 + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + (j - 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + (j + 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && l - 1 > 0) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && l + 1 <= nz) { + if (ind[i__ + 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + } + +/* 26-CONNECTIVITY */ + + if (icon > 18) { + if (i__ - 1 > 0 && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + } +/* L68: */ + } +/* L10: */ + } +/* L9: */ + } + for (i__ = iai; i__ >= 1; --i__) { + for (j = iaj; j >= 1; --j) { + for (l = ial; l >= 1; --l) { + +/* 6-CONNECTIVITY */ + + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ - 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j - 1 + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + 1 + (l << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (l - 1 > 0) { + if (ind[i__ + (j + (l - 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l - 1 << 9) << 9) - 262657] = ncc + + 1; + } + } + } + if (l + 1 <= nz) { + if (ind[i__ + (j + (l + 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l + 1 << 9) << 9) - 262657] = ncc + + 1; + } + } + } + +/* 18-CONNECTIVITY */ + + if (icon > 6) { + if (j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + (j - 1 + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + (j - 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + (j + 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && l - 1 > 0) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && l + 1 <= nz) { + if (ind[i__ + 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + } + } + } + } + +/* 26-CONNECTIVITY */ + + if (icon > 18) { + if (i__ - 1 > 0 && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + } + } + } + } +/* L69: */ + } +/* L41: */ + } +/* L40: */ + } + +L62: + nnn = 0; + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + i__3 = nz; + for (l = 1; l <= i__3; ++l) { + +/* 6-CONNECTIVITY */ + + if (i__ - 1 > 0) { + if (ind[i__ - 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ - 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + 1 + (j + (l << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + if (j - 1 > 0) { + if (ind[i__ + (j - 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j - 1 + (l << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + if (j + 1 <= ny) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + 1 + (l << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + if (l - 1 > 0) { + if (ind[i__ + (j + (l - 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l - 1 << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + if (l + 1 <= nz) { + if (ind[i__ + (j + (l + 1 << 9) << 9) - 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == ncc + + 1) { + ind[i__ + (j + (l + 1 << 9) << 9) - 262657] = ncc + + 1; + ++nnn; + } + } + } + +/* 18-CONNECTIVITY */ + + if (icon > 6) { + if (j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + (j - 1 + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + (j + 1 + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + (j - 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + (j + 1 + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j + (l - 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && l - 1 > 0) { + if (ind[i__ + 1 + (j + (l << 9) << 9) - 262657] == 1) + { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && l + 1 <= nz) { + if (ind[i__ + 1 + (j + (l + 1 << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny) { + if (ind[i__ + 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny) { + if (ind[i__ - 1 + (j + 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l << 9) << 9) - 262657] == + 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + } + +/* 26-CONNECTIVITY */ + + if (icon > 18) { + if (i__ - 1 > 0 && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l - 1 > 0) { + if (ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l - 1 > 0) { + if (ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l - 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j - 1 > 0 && l + 1 <= nz) { + if (ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j - 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ - 1 > 0 && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ - 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + if (i__ + 1 <= nx && j + 1 <= ny && l + 1 <= nz) { + if (ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] == 1) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] == + ncc + 1) { + ind[i__ + 1 + (j + 1 + (l + 1 << 9) << 9) - + 262657] = ncc + 1; + ++nnn; + } + } + } + } +/* L70: */ + } +/* L61: */ + } +/* L60: */ + } + if (nnn > 0) { + goto L62; + } + goto L5; + +/* THE CONNECTED COMPONENT IS THE COMPONENT WITH VALUES */ +/* IA(I,J,L)=NCC, WE SUBSTRACT 1 FROM THE LEBEL */ + +L20: + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + i__3 = nz; + for (l = 1; l <= i__3; ++l) { + if (ind[i__ + (j + (l << 9) << 9) - 262657] != 0) { + --ind[i__ + (j + (l << 9) << 9) - 262657]; + } +/* L71: */ + } +/* L51: */ + } +/* L50: */ + } + +/* OUTPUT FILE WITH CONNECTED COMPONENTS */ + + o__1.oerr = 0; + o__1.ounit = 1; + o__1.ofnmlen = 12; + o__1.ofnm = cou2; + o__1.orl = 0; + o__1.osta = 0; + o__1.oacc = 0; + o__1.ofm = 0; + o__1.oblnk = 0; + f_open(&o__1); + + i__1 = nx; + for (i__ = 1; i__ <= i__1; ++i__) { + i__2 = ny; + for (j = 1; j <= i__2; ++j) { + i__3 = nz; + for (l = 1; l <= i__3; ++l) { + s_wsle(&io___66); + do_lio(&c__3, &c__1, (char *)&ind[i__ + (j + (l << 9) << 9) - + 262657], (ftnlen)sizeof(integer)); + e_wsle(); +/* L85: */ + } +/* L16: */ + } +/* L15: */ + } + + cl__1.cerr = 0; + cl__1.cunit = 1; + cl__1.csta = 0; + f_clos(&cl__1); + +/* L110: */ +/* L120: */ +/* L130: */ +/* L131: */ +/* L140: */ +/* L150: */ +/* L151: */ +/* L160: */ +/* L170: */ +/* L175: */ +/* L176: */ +/* L177: */ +/* L178: */ +/* L180: */ +/* L190: */ +/* L200: */ +/* L210: */ +/* L220: */ +/* L230: */ +/* L235: */ +/* L236: */ +/* L237: */ +/* L238: */ +/* L240: */ +/* L241: */ +/* L250: */ +/* L260: */ +/* L251: */ +/* L261: */ +/* L270: */ +/* L280: */ +/* L281: */ +/* L290: */ +/* L295: */ +/* L300: */ +/* L310: */ +/* L320: */ +/* L321: */ +/* L322: */ +/* L323: */ +/* L324: */ +/* L325: */ +/* L327: */ +/* L330: */ +/* L328: */ +/* L329: */ +/* L331: */ +/* L332: */ +/* L333: */ +/* L334: */ +/* L335: */ +/* L400: */ +/* L410: */ +/* L420: */ +/* L425: */ +/* L430: */ +/* L440: */ +/* L450: */ + return 0; +} /* MAIN__ */ + diff --git a/tools/connec/src/connec3d.o b/tools/connec/src/connec3d.o new file mode 100644 index 0000000000000000000000000000000000000000..11e0811d18520cc0621ab91132ceb26974a128c9 GIT binary patch literal 83352 zcmeI534B!5*~V`GQ4|RvRz;N23T2H+Sfi8@nLyAXAPfo$1Pq|;ltlrxq67*87A@|y zML)5N`T=THEGi%^s3YRmD#aSDTE(~^F8G1^-FN1FChvVF2eKedf93vuVeb6ro##B~ zIp?0aGj~F+$&2)=m6qmVOY^#WW%ocm@3q`A+9Qs8c-$xY%Rl)`I>{6Am;6|6-jDBZ&Reaw zk4gLaoAb6LN>wn=Zzd0=+qCpGy)Dt(Pvf^s@>b_B+?=R2O{_i2e>8u|@rjxg2Z?%h zJa2t^@krC3xqH&mi~9?(f+tr%(AJ+($@<2XtZ(@}*SFoTens+q(pLy%7|62{12lI} z-SpzS10&Qpz4*oeXqsL;r@BMdV!vHZonyyUvc63v>$AS+`tNy&U59^ako%tt2bgOI zcsRASI{S@vZM7awX>I=@Y|fJmYnlFFShI`wu=MTvY4{8 zuT9@?eKlRCZA+}f{v1g?gN}PCXVFYdkN>VYF{3e(p1VGc-i)M@oV*3;OM2|{R{@3SPi|U;C#UqofVEBc+xh`c&=NhX$lCv+SxOcL z*ZyAy9ty1egUmxI>rD!9E@IrEtrWAn;^=~MZm<}M?c z5^@S~rjFT>c=hN7Ka!uqpt1CGavp1uA%)}MoQ z23yJXr^bd8SbwS<4yH|okE`VS9voLSHlV=zQ{{kYF|Kec{$Cv90zLEa5QA;`VNdXl+6^g)#o*^wcHyP5Bsma~=Yg(1xNy}F= z&~z`F zIQ@oK>ZKk(&B{5Zjw*+JZWaymhHOcGGB}C7GU45A6jN566i~rss6W<+W&bZ1;oSk%)PR~rbvKNS&nVy++WiJqw zPY)5baZj+S%)Mlgc=K4%4;&8t+)DI>w_MXJizDDY|-xFCA?+Axj=yx3RZi?7ZDV#W9I{yOC{xqJXx{mbNsuMPWy zB$$rs(MKe)2715Rm%EPV*?7TKUEHh zW>1B4N?CtuY)*mo=V0Yj;j4VfoXm$FmANQ$_}Z}ZeEQHwlRV@qd$G@dBPCy~tnjQ! zu0l0?)+F;Vmj|jC&EadqWv}RS4__Ou-bGG&Q9FEXxMII2gOeqDp^2hAd~F!N$y|20 zQbg5Cue{R*8J5bNG901{P08~rv-l@JE2#K|rt&5oSXHjiC0{y|Z;TIL8}@(EG59NR z!7J-#($)0z%%n@6d{p7;CMMXyxU89s%$%#${JED5vI^x)=Np$ozK*zqr(1_x0EP)Qao_R(#`M6<&(}?#x_s&|hgz{D!&zr3mkX*PEAp z|B!x>{La8bfnOvaW*)+Uw9m9-zKt0F*5C$QM5*XEB~}@+xWa+|w~_MRBnE#qY#3am zei5VZ<;po?=s&iTT(1df4E=#9`6TeU$Zcz3* zhB;*aza_9bfv*B4Pu%2TnPQbc)*kvkCe}!rSO@Eum=E}B)x^Yu$n58G=Ebc>$CX@~ zl5a<=bj2}suIb0P%}q`w6Zu7F*9_C+^gm#R;Y{}6L`LycI5~d^6aTGH@=ZXczkha! zj?J>kc5su!0a%4~tn!!Q4pCNRZ`rGLO*iGhq*+$Ub*#q5RW`K_Zd{mJ6+RlvUMY1Q ztFe)l%`iFPsPeZ44m86moLtH}R%4SZn{3}}awoZ8JHIt2Q|5>^AFIXBIx6^a?rNh} zjrR}14-tmrWhwa~LNYey*mZ`LJXULVSjhvm+F>D)3eT)$LN$A4 zB@;TBGYerIcuJX+lDjoq0WqWmN znTl{_4)8-iBa@jPlprazYUP;>(Y&P8&^(hNnwOP>l4p4n6YMniWUatbsc$+edim(k zPt39-9G?MH=Lp}=#H@6lW@7p#=_8d2o=G2~Jk7*BxOpP9Zth7~mHC;BHu(`%&B`+w zqCL>RhxvIhVohdg*Uy@H*qdpZ+^xcQC{oXmQc3(j6u+sY?03A&EAju!|LFcp^q0kt zGgb0sR4nzw%X5G+|0egls`H(hz<&b-4LAm1%7F)<)Ba0z)_QOX5%E7Q@XXWl2sZ!k=fpSvr6j)j|AAM0lfR>5H#}}xW%lJy zB2;HP{QT;q=gC#iYHf$}uU35CzdOI`j(>HZ|L^Yq;r9Q#=kMY1|IZ%(fA{zuX#Hz7 zvURxu7fqftcG8p?(=(>eobKff7|?G(s82ztf9`%G2%{KwD93+09~L%v{cD9g(X_44<6_A4mJ>ly8HL7(W5P;NnP zWXQli14I3Kh5F~`4$KQ>dR|sV>ij=LB^~&v;7wDG8>_0v6gsiURJfm%1xOcfv z^Rm%Uc6lwupV#(+yaCa?!SPlzT6=wS2lweasBb7Y66tqgUN}@R*za}73x?x^l)54D zx)gj-9On)0pEsaS-@JmTpKv%gnj6BP_9+PW>6sh#!-?a}GqZwi`GJ#l47A5tBp=|; zCLicOpkM!f1EPKU6_m}Ati-4m^z0eZ!Nug<&+UPZkNrF~{?GxR-@9kevqG%~T{2_R z^ckTp8J#jR+jp1|znAs1tgacE9a|@;Hq=CK(`FCw(q=YHJGuUmM=kXmY36hJku5sK z|0lOW!}+y(9$U9|zbSr6oR{~H_^adX`mVgkYCF!ZYkPQi6?|50Ux_#QtLtf|9!?r5 z$9>$&9}brKhAIRue}GuH{M|s=z-7O-7yrCec9UDk-%B%oP%np>aNNgjwsLOwY~^TI z`XgJO|08}va>w6VC2qX){aew;edu2t=e4~NT8GCkRlb7wH0344uTdV-i3Od-%102t zUHJ;)_bM+TE?+Pc|NfF1-{Aj=IQRQoE5Xt3v&u&h|C{m^#NSa~LVTCteQ9hV> zRP{r8Xu!`%tskNFIC91+A4UA9$}b~6E6(eBJ(NR#zSd7sj{eG85zmwS{7U%>;(t(H zLi|zXAwBfa?k4CHmp_FWA1~tnfIjgLp|2-M(BA`n;z#)NNyclA_V*~gO;^5v_=(Dw z5^t{jHsUSg+@EjMZU?Pjq4gS**G>6)<^D|%+09d(64DuWhoMh=L!8&~wy95j*n3v_Ys6nx zUP63_^7o0q8|SsX5^DD|t^btj_iBAeKM-sc?^WWT+GgDVKFVJgWZvd$J#v=EYkLY& zthcp2{~IagY_*f4SN7oXzJ6oB1#I!xZvRd*pEm?Fx7iM!tCe56fk(JZM-EunC9pCBf6-^mA)qkvOmN#~CVPRn>+3)0yopRYoc}7lxb`jb+vENnpyCn8=WWQ@- zKPyx2=o7NC{5v_B`bf6i(FU?Q$enC&tZ!MK;O|MhS<-M$2ffo-?sU{U(s+(Lokgyn4yb&dAQp%=C)ssd!yn-S>C94k$*p4q)Hv)4fvr?o*_N$qK-Pm8_-^K=p;hgiw>RTjyBPui`>C; z;_YcKI^@VB+KY~v{+%pMv}2as(L_5+^I6&6xWt%s^=k?XeIK2=dgJ6K$D1HM!c(QW ztPbAgBZYSHMO{ z*0MWzVua6Xm8Zy!U`_V^czWW%})?*Fm$_;zNZ+ylpY zjQ88%sQ)q5<2{lnWc^|Db-BaK`-p{!*2E&nD;B zvWdQUfc`TA{SEqOB<{-VX?zndI`TZ(Av;<269pKrL$e=u?Q9A@;b&r1xqKIMIYY{&uQH_6mnpR-N9_>}jd zvR!Mq^|^pJd@eEi*5^%zTc5X+j{Fx+vi;iBTc7fNLN<*1sKi}wjp5ekW5nU}38Qa) zZZzEbe1>#}>iw;z-um2b>Lt&`>hmqbt5e}cHD3{~S`fP3L<*_sTAK5YuxB6X(|^UhW-#!FMf7tUc*hjU027MdeLg<|H$@J!)?E25=XmN8-1JG zb%xt@b)nI*?aKQt+2qFZ`y70o;o`HI-k0}VvWbSBC(oOD$y0u0d&O|u-@g;bJSj2y zw!iW|Og3rPj$a^*PMc zi_bIE=P1Kv7e2=mhtDa>+2;(ytaEWure1u?=Vr1kGhBAz^G@RMxk5Sn zTxq!Vc|YmM`&rr6n0o8;2~#gV7pu=rhRZH|K1Uorw<%|zuNrQB?jW7zdjBm`Z+(7b z>cuBs7d|&!cHwg`ari_5`>d}|l<6nC?ff6vjx*fqHzkhsv$=A)vB&8dhT9x6jgIuI z#Q%}4lc~3_3*Ah8#IHlUxu#w|n+NY}>Sed1|07$}aNDmTMn}$hp)=g@VTO+;9gOQZ zQ*U3VE;seE8}@%>yV`K;ri-XM=>JZ++*tjGO}*^O zdm-8WWVqGeNF4f`mCKFQj~Q-XXJ00rW_tfMQ*U#A$JEO%-oJckxb^uN@g~wKfBQNg?|{U0c2{nJgoJT@w>?s=^ZxB8jHq2I}&f0p4k=Uk&B zbEliO+soA3<7Z`a#LOuej2@*~?5hTDE^B3?gH?mc7l?fltlxLprlB^?~M+fBXo`JSm4 zk5B6B*GGn1pPv(l&##TX^?8I|*T6hSp7jm4`o|GR{fWvYcB_Ai;WmdeNN0zRS8G#m zbLeF1C5Klvhi-;jpFN2qhkT=NeMU{aSPA<-vR!Pr)xU%|a=6r?Kf!RD!%U+i{VI`0 z{q1T~Z(kpaO}+Sx#H&4T5pj*vyVG#--%RHLu8T>X&G~*)FMi}lwucP2IXq4rIX|Ub z^li?Y47WKvM><2*=QdMseeN*z;_*G55C1gW`rJtzK0h(~*5_VRFMU9swe-5194}VC z9&yZv2Ff{y;|#YsG$ozonnQC_Z*ypC>Lmvp7ukkepE<;lLwBQZb2!)3OCK=b&NtlZ z4vG2G@b$>>PGO8g($rkQ$sT+BB0;uGgB*Ahp6Z!}!|@6eoYG5R*=yG_0L zkssN9Z@A52HF322N270Ze%x@I!v@l6rt|VIrr!E|$<&L-Z}hl$-Eix(ggAV@YxJ$p zU8Y`gM*SYct^Rk!F(2ya^KSfxXs8^=-B8WpcvEk4IL*{c4md7a8E$=^NgVy^ zX!LCkJxslwZ@mq-`US+1!$61rV8d+=ql}L9tHl42ZLF!c$Hf9uFFrfQt37YMsh48~ zel}D6Os#*3cvv~EsKr=zR*8~IP^1!L%$bs=no}~3$4;Yt0 z#4#>oh+|xSMjYd^)Nt$bR^nJcmn-Ky?=sxx`GC=pd`kQu*&a0Yc0FHf>ZOe{;?yoh*2`Do%%k8%E!*dv6#}0iNk+W<>JNqZ*I8t-_qz<{~ZjM zcAM#WWLKkO{mcJcEgSsf`tEs#TmJ)y!~caw-})bFxbtAoy^PnLI$nznxBdMkarE~#qi_3rkExe&*`&waeTG~82Z=Y4!SJ_79s27G zw>dm*bfn!a+U{23;kdd#uZho5UP?To{43%MlpmR%*pV2eU94k`iR1mq>BRB6kV$;8 z>gN(KRz8HdzwX7iNyJe`#2w|4N3#L;da;_x|=IC8k0ICP4M!_Upcq5lAJ=s!jrId5_B z7l@^K8`r_PbD7Fd7eQW^*O|sX?+24_!&bS`CLgHItz)T-8+aw z|3Tu=e}Z^S*O})X{1xJ8_f6utQ%#Np>(#NlTTarkNUgYt83MjZM-A|BOo>_Qy%eTc)) zMa1D}DsklVbK=mynK<3i9`Px;>iDX2QMKGKc5kYpV}t`bB3R0#Np>h#M^1k zU5P_KLL7cZ5J&xZ;;1hs4xh`3!{-{}(0PhD+TBJR`tK8m{%+ziU4Lqy7|av=XyR!1 zc;fJxK^%U16NjGx#GyZoctpo*B5|~PEpg~9CXV{Mh{NYv;_$hZICORpN4p;phyD>K z1#^aeL*g+Vmym=1h&bBKCJvwH5r>~q#NlT$ap=z_4*eU5M|He@O&mJECk~yB#Nl&0 zarpd%ICQ=tj&>U~4dxI1mc*f-MLeeClI!64#L@0R;_x|vIQ+~b4nIqYL;p_V5zYTT z;%N5~;!&;t3vuYbNE|vliNk-blY=?K{|UsQ(}FnK?Mxi{1;n90gm_HHYpjD$A&z#h zBo3d;h{MkV#Np>L;;4@ihkglh)PG1E_1_SO|7Oj~&p(Sebbdk{I{k^m&t=5d>HL{S z9Qn_6@au^~|7POw`CH=fxtaJn_45*O=)XZcto0ueN4sgK1oMPWed4HZN*q3Oh{IsBI_`HZXd`>0~ovVpM=LX{Nb1!k|uOW_c+2G(?h(rHn;_&${arivK|C`>j z;qyKCX-FLUCle1Rp6<0Jj&?f}k7|7{;?O^zICP4L!~b=};r~|R&{;_wI*$;CpRL59 zFMmN@Hspr!`oO_IB@X?)#NqSUP+UH#51;Lc!%tV@(C&6F zh(o8CIQsQl;_$zYIO?Az4*kCqho9ZVq5m!Mn4S+bIL(W1JdVc`hkl4S{In$w|NV%= z&qc(cKbm+rVb7aE9PKV74xMGhQU4p_@VSvVeEy9%>fa>}{V$2bPlMBgIYa*>;xQeU z)()OY9QtPyho4@=;eQ-)_?bZ*`U{Cee;M(Jj@LcJp|grObRH)TpKlO{&(DaX-uq!N zXXrN~4nM7lL%$>On2t->!OtTO{R@c0&q(6%KaV*4EF}*8dx%5-G2*CynmFpW5{I8% z#Nnsz8Nr-U--I~yTM&nz9}|auKJl35KiI(wi5KfU97h~}W)O$}+lj-^J;d9o{vU}K zD}RPK+I@pK+TBGQI{S!2=g1c2=bu3w{(BNfyXO;!{w2iWXEt%@&m$hw@w(Z;mlKEn zZ;8XtgT&!~J8}4VmpJr4B_7uC@>&M-M7vFhquo}-q2GZxbh;CV&S>KBKbtt}7Z8X3 z?Zn|{4RPqNBOcT7iaGep#G(HW;_&kUarkfaqhQYP(~LOuGl@h0Y~m3e$McAz-9qBf zA4eSeGl)ZHIdS-3Lmc%_5r_UZ;_&l6ap>`#c2@!|?eB$sk zkT~>*6A$aSOd^hUXAzHR{X*jK^DE+L_jkmh{}6HLY$uL>eL@`d-w=m>gVw?P;in~W z=w}g+={V*(cs_CH4QHeB$tPBXQ`jBo6(x#G${5cvQ#n72?o;lQ{Hu5{G`H zHo=_Xza??hcO(w|JmT;(j5zc!BOcT7n(5%z5QqNt#Np>=;_&|jaroIn9QrR44{QGa zB#w5!B93-zwGHMRRh`Df(e5e4q2G!)^!pJ1=pD<9%zp3N@ELJ~_h{Jylarg-n zhkifeVbw1rj&{cpk7)gD;_x$%cvS0eCJsL~kuZjw z;pbH1&~HsVrsJFA;5~>#|2*RGa{+Pq{~2-kSx6l9%N+bp2fv><{5ty2ZX#MHLk!J>Rw0n+&_azRUi;2U}Y~mQ- zUl51RuZTnEe~H8AUx-8hMdC5d;VlP$pE&e)6Nk^V%;31d=V`>@ryX(VcOf3u^`tj( z)DIvIKO>04&o#v1XBlzm+)W%h4-to-=ZHi9uf&o6dk+2)ap>p`kxa={R-mn`51Bde4aRT{!Se2mJ)}4ozCUwkWM_N>rZnBZ%G{O`hVIX zkTZOqOB{ZRh@-!gh(muC@raJsLgHxmSHz+7JL0H+f;fD>N*q3S5{J$n;%K*Cmta27 zKaDu_+YyiHxO8*yp2X2^0de@elsNp%Ar3!_h(rH3#G(HO;!z#1$B9Gd&%~kg5909o zC2{yXrfV=~=$u3x?Y1Ef{d0&zzc2Baj>|9yA4MGPP9_eY3y8zdUBuz%e&W!7lz2q* z-%K3szC=8#^=}i0{zt^2Q#U7=Km4Cc9R52HhfXeWv^#(}^v4m0{tV(V9j|!~zL+@L zy_Gn8t|ksY&k%>7SBRtjed5sHM;!G>o)yd)^(PUB|E|R0r!R5nTudA~6Ntl4F>&bs zf;jU3jf3Ay9QtdB!{^h);q#xw;pb!G(EplvSm%Gev&+x<6ynfnMI1gm6Nk@1#Nl%s zap=q>4xNR>;pZ;m(7&HJ#$}y@KTRC^TZzMG332$ue~irMW5;w0<_!Jj#G&7YcvQ#h zEaK3~BMzMliNojR#Mi0*BI3}woj7#@o^sglz z*8FcIj&@fPht6u^sQ(jj`1}WP_}on#^=UnVIYYlOarkLN9QvJz$8=os96UlC`WF(1 zpG%0t|9s-`b0cx+uOtrr)x;xSVp~rfI?oY@&R>bc=hwvHvq7#G-|%{h`ewwT-<~-9 z7UIyqi+D`OYmI|HMjZN26NjIz z#Nq!-;_#CeE4Ply+*{{In&pCj^u`NMyE;_%azIP@dLp?@Lqi2AvdINH6EIP~We zhyIPkq4OAV_i&5Uh{Ml0#G&7p zcudD}n1hcZ4*ki*;b%5+_`jPt{5(J$`WuKt|5f79FCiY)ar~4x^!E~ne%<`?^KVZa z{?8!}KmCbAe#l&MeUdtT(PU6tNmpJ^aArAkq6NjI7h(rGq;$hAIJK|{f zxIX3Qd@6B_V+L`wn?oG>VdCi5c;e{S9O9_IfjIPkLmYk{B@X?K#A7;+FFE+@#G(HV zarpU!IQ*Y*ZZK!~Ih{E4I}?X~F7b$t@A<^h?oi@Ut)D;~?Os6~?OsP5`oAZRemzMX z^)ceme}g#ud_f%g-g&`1V>*rv9sC61&_A6x{In+y|AUCb&j{ksA5T22`CmyK?an72 z(fV76!_QsBqgua)IQ*<5j&?T_hyKUJ(cju?td`$i9sdXQjfg}4bmH)H7IEn35s&Hk z4s!6J#G!vF@x_|YRO0Y|2XXjWNgVa79sE%T-%Nb5`gzI0Uw7~ih@-!sJNRA)uirOe z0OR<+=6nM2u=;F4e2(%?#I-rE2k`}3-=BC?`NhPSDj!cA{k_J)uP2W2x{df^)qj*Y z#yv(HI@^gu=R@M~S-T+75ORio1L85w|5OKWK^*#-#No3$arhig9Dc?UFI7L&9sEk- z@H3xySaZIGIO^{r4*#o&!~a&|@c&QZ(Ah;CI<@)*#|3_x5{G^Z;xWyqlY@674*lN5 z;d2mi_?$r;e&!G_RX>Xy{3hbizt_Rn5Qopd5J$iMK^#7J6NgS(|6u;`)0jB)+YpC- zC*m>9A9DbG(FI7KxI{4kh;pYM35j~EcAddPi#Nq!9;_&|k zari&_{NT7i=S1RYw>5F-=Msm0gm_Hz8S3Cg#L?~~;_x|_IQ%Rp4nMyoUaEc`bnvyr z(eCpO{w8tw|CBg<9yK7CKYX4-9PPFx4*hP#p&um<{X*g~&0(^GUrro;77&M@+lj-^ zgT&$I3F4*dXN!ZsKpcLy6OZa~w39gM_YsHxV+RJu1^!zQhySyPLqDH5^oJ0K{!fWR z|0?1!&1bQL|B^WTtRxOUj}V8S7l^~pcH*V#=UoRcCEiZQarEnQ;?OB3j&^S*4*ds+L;o@2G0bxZe}OpK-A;U&=DC|V{L~*5oX_xc z0`XGybGn1KCJsLxiAU5=m^ge6CJvn<;;5fV9Q|5K9Q|5J96ApXN4uMdLw^Tx=>Lm& zOmq9n!M`PrcI#ab92fXJojClQO&orD5ieCg=R5dd;_x$pIQ(2eJgVdSbK=msi8yrb zBaVJOO&tAtjW~4PBaU{zA`boZ3xhdBzbWyU=GMl+vxuYJZp7hp5OMgKL>zu*5ieCg z#SXrRIQ-l~Jfh=uFLC%>Lp-YW8;C?!=)JAr75k#NlTKap=z>9@Bi5I{2-`p?^1V_Trs(yAl_%7n` zvyXUKkFWX{1@ni`5OL_VC64+W;^^04;^@~z;?TL0ICK^hho5_hLw^xm9DX_yho7GikLvjLBMzO5h(l)rarA2uarA2i zap?Rnap*in9De>r9Qtn)k7;h7Ir!JapxY65szy9LgLV0MjSf#5=VdkOnjZ{Zzm3&_lZO2YvS&Wb zcn9Lp?@k;(`xA%HDa7IDO5&yJXTF0kAr3#c5f5vgzatJm4-t=O{nNyuzm+(2UMG$m z_7O*a8x0SR3+kH_hkhn;_{k>@{ei?|nrD%Nk0TEK8N}gd4srOuhdBJKB3`O~9(V8! z#Nj7KJgnojgE)MCN*p?SiKD)5Vfo|InmGE^oj7uc5QqLS;_x$rIP~Wbk7;g89sE|} z(7&5F{5(J${$C^xKRbw*s-J&3_{YTIr`CvI&hT?A@kpY~JB2uOS`mj%2jb}01;o*> z@x)O-i#YVJCk{V%6Nml-#ABM<6Ar$KIP_m24nNz8!~eI$;iuk6FTUY(wo>)e#KBJ{ z4nJoSho7FrQC~nD^+Slm|5e1{|3>1d{|#~IuO<#ZTZlvdW#Tc-=bsL~lQ{IhAPzs? zCBgjR{|w^rb0+ap^>dbk=Mrz1XwDlz96rYohtJu>;qwOK(7ByBbnYPzo#%+7za_*` z|1ojse@7gCPACfI4E@uI$28Au2hSl6{V;L(=|>#?uOJRT*AXvOKT8~Z8FBde4e_v! z`zqq_`809({2OuTzfBxE9}$O6lTqd8-lGeSI~^+Son{}keA_e$c>pHCb*4-iKV8;PTS8*%8rMI3&< zCJy~Nmj?5XY0ga?{AA+LZ%G_}vWUa~5aRGNig>B|ne5<~6NjJciNnvYiNnwDiAQzZ z*Aj>RCgRY4fjIQPB#!z;$a=H?Zn~pW8(1nHSwtG)EgTd7qr`iIP{wnhkh^O$l+q* zs2@ul`m>3{&rQUk|107#&G`Wbf0#J*pCS%F&k~3K&xpg%H^fWT&r#!oIfJJYho2u3 zho21M5go_w#No3K@u=1hA&z!O5l6d|i9`Pu;>h7X;;3Is9Qw}^ho85JL;oYiNjA*;_!bCaro&=yj1-RcJM;t@H38hSjTHNarm4^JfihC6Nmp5#G_ij znmGLYi8$K*3vuXwL>&3lnh?w%^$m$b|1{$8lS3T(Vd62(KkDEY6Nmm7;)^w(pAv`v z+lj-^J;Y1Z&ngFhggEp!IQSL^f1UVZ_5Y58f9T-*h$EjPCkDq6yn%zCPP|le=t4ZK zKJ$prQ9g)xMEMBf3zSbG9#wuN@ukWa5l8;F6JM2|6zSQeMZuFJr#% zyTtY})rYlyAMrWL>rYPXAm@nk6NqEJ{fM}$V-4*nT&P~S7!>(_cBI}oIcXa zxMbQiFJtQD#GUw~vYX-WWlWe{G;)HMQ8ant#L<)dCrp|=eRM|ef(Y~Z=>4eXhKHrrZYTS9Be0ex7!MBH=^T#$3ocA+jjn~X!7&D*@=QZWG$4y$$zu_J@FM7OLbA8y-6-fH;Q`E#t#constblock.Const.ci >= 0) + nrep = repp->constblock.Const.ci; + else + { + err("invalid repetition count in DATA statement"); + frexpr(repp); + goto ret; + } + frexpr(repp); + + if( ! ISCONST(valp) ) { + if (valp->tag == TADDR + && valp->addrblock.uname_tag == UNAM_CONST) { + /* kludge */ + frexpr(valp->addrblock.memoffset); + valp->tag = TCONST; + } + else { + err("non-constant initializer"); + goto ret; + } + } + + if(toomanyinit) goto ret; + for(i = 0 ; i < nrep ; ++i) + { + p = nextdata(&elen); + if(p == NULL) + { + if (lineno != err_lineno) + err("too many initializers"); + toomanyinit = YES; + goto ret; + } + setdata((Addrp)p, (Constp)valp, elen); + frexpr((expptr)p); + } + +ret: + frexpr(valp); +} + + + Addrp +#ifdef KR_headers +nextdata(elenp) + ftnint *elenp; +#else +nextdata(ftnint *elenp) +#endif +{ + register struct Impldoblock *ip; + struct Primblock *pp; + register Namep np; + register struct Rplblock *rp; + tagptr p; + expptr neltp; + register expptr q; + int skip; + ftnint off, vlen; + + while(curdtp) + { + p = (tagptr)curdtp->datap; + if(p->tag == TIMPLDO) + { + ip = &(p->impldoblock); + if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL) { + char buf[100]; + sprintf(buf, "bad impldoblock #" Addrfmt, (Addr)ip); + Fatal(buf); + } + if(ip->isactive) + ip->varvp->Const.ci += ip->impdiff; + else + { + q = fixtype(cpexpr(ip->implb)); + if( ! ISICON(q) ) + goto doerr; + ip->varvp = (Constp) q; + + if(ip->impstep) + { + q = fixtype(cpexpr(ip->impstep)); + if( ! ISICON(q) ) + goto doerr; + ip->impdiff = q->constblock.Const.ci; + frexpr(q); + } + else + ip->impdiff = 1; + + q = fixtype(cpexpr(ip->impub)); + if(! ISICON(q)) + goto doerr; + ip->implim = q->constblock.Const.ci; + frexpr(q); + + ip->isactive = YES; + rp = ALLOC(Rplblock); + rp->rplnextp = rpllist; + rpllist = rp; + rp->rplnp = ip->varnp; + rp->rplvp = (expptr) (ip->varvp); + rp->rpltag = TCONST; + } + + if( (ip->impdiff>0 && (ip->varvp->Const.ci <= ip->implim)) + || (ip->impdiff<0 && (ip->varvp->Const.ci >= ip->implim)) ) + { /* start new loop */ + curdtp = ip->datalist; + goto next; + } + + /* clean up loop */ + + if(rpllist) + { + rp = rpllist; + rpllist = rpllist->rplnextp; + free( (charptr) rp); + } + else + Fatal("rpllist empty"); + + frexpr((expptr)ip->varvp); + ip->isactive = NO; + curdtp = curdtp->nextp; + goto next; + } + + pp = (struct Primblock *) p; + np = pp->namep; + cur_varname = np->fvarname; + skip = YES; + + if(p->primblock.argsp==NULL && np->vdim!=NULL) + { /* array initialization */ + q = (expptr) mkaddr(np); + off = typesize[np->vtype] * curdtelt; + if(np->vtype == TYCHAR) + off *= np->vleng->constblock.Const.ci; + q->addrblock.memoffset = + mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) ); + if( (neltp = np->vdim->nelt) && ISCONST(neltp)) + { + if(++curdtelt < neltp->constblock.Const.ci) + skip = NO; + } + else + err("attempt to initialize adjustable array"); + } + else + q = mklhs((struct Primblock *)cpexpr((expptr)pp), 0); + if(skip) + { + curdtp = curdtp->nextp; + curdtelt = 0; + } + if(q->headblock.vtype == TYCHAR) + if(ISICON(q->headblock.vleng)) + *elenp = q->headblock.vleng->constblock.Const.ci; + else { + err("initialization of string of nonconstant length"); + continue; + } + else *elenp = typesize[q->headblock.vtype]; + + if (np->vstg == STGBSS) { + vlen = np->vtype==TYCHAR + ? np->vleng->constblock.Const.ci + : typesize[np->vtype]; + if(vlen > 0) + np->vstg = STGINIT; + } + return( (Addrp) q ); + +doerr: + err("nonconstant implied DO parameter"); + frexpr(q); + curdtp = curdtp->nextp; + +next: + curdtelt = 0; + } + + return(NULL); +} + + + +LOCAL FILEP dfile; + + void +#ifdef KR_headers +setdata(varp, valp, elen) + register Addrp varp; + register Constp valp; + ftnint elen; +#else +setdata(register Addrp varp, register Constp valp, ftnint elen) +#endif +{ + struct Constblock con; + register int type; + int j, valtype; + ftnint i, k, offset; + char *varname; + static Addrp badvar; + register unsigned char *s; + static long last_lineno; + static char *last_varname; + + if (varp->vstg == STGCOMMON) { + if (!(dfile = blkdfile)) + dfile = blkdfile = opf(blkdfname, textwrite); + } + else { + if (procclass == CLBLOCK) { + if (varp != badvar) { + badvar = varp; + warn1("%s is not in a COMMON block", + varp->uname_tag == UNAM_NAME + ? varp->user.name->fvarname + : "???"); + } + return; + } + if (!(dfile = initfile)) + dfile = initfile = opf(initfname, textwrite); + } + varname = dataname(varp->vstg, varp->memno); + offset = varp->memoffset->constblock.Const.ci; + type = varp->vtype; + valtype = valp->vtype; + if(type!=TYCHAR && valtype==TYCHAR) + { + if(! ftn66flag + && (last_varname != cur_varname || last_lineno != lineno)) { + /* prevent multiple warnings */ + last_lineno = lineno; + warn1( + "non-character datum %.42s initialized with character string", + last_varname = cur_varname); + } + varp->vleng = ICON(typesize[type]); + varp->vtype = type = TYCHAR; + } + else if( (type==TYCHAR && valtype!=TYCHAR) || + (cktype(OPASSIGN,type,valtype) == TYERROR) ) + { + err("incompatible types in initialization"); + return; + } + if(type == TYADDR) + con.Const.ci = valp->Const.ci; + else if(type != TYCHAR) + { + if(valtype == TYUNKNOWN) + con.Const.ci = valp->Const.ci; + else consconv(type, &con, valp); + } + + j = 1; + + switch(type) + { + case TYLOGICAL: + case TYINT1: + case TYLOGICAL1: + case TYLOGICAL2: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + dataline(varname, offset, type); + prconi(dfile, con.Const.ci); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + dataline(varname, offset, type); + prconq(dfile, con.Const.cq); + break; +#endif + + case TYADDR: + dataline(varname, offset, type); + prcona(dfile, con.Const.ci); + break; + + case TYCOMPLEX: + case TYDCOMPLEX: + j = 2; + case TYREAL: + case TYDREAL: + dataline(varname, offset, type); + prconr(dfile, &con, j); + break; + + case TYCHAR: + k = valp -> vleng -> constblock.Const.ci; + if (elen < k) + k = elen; + s = (unsigned char *)valp->Const.ccp; + for(i = 0 ; i < k ; ++i) { + dataline(varname, offset++, TYCHAR); + fprintf(dfile, "\t%d\n", *s++); + } + k = elen - valp->vleng->constblock.Const.ci; + if(k > 0) { + dataline(varname, offset, TYBLANK); + fprintf(dfile, "\t%d\n", (int)k); + } + break; + + default: + badtype("setdata", type); + } + +} + + + +/* + output form of name is padded with blanks and preceded + with a storage class digit +*/ + char* +#ifdef KR_headers +dataname(stg, memno) + int stg; + long memno; +#else +dataname(int stg, long memno) +#endif +{ + static char varname[64]; + register char *s, *t; + char buf[16]; + + if (stg == STGCOMMON) { + varname[0] = '2'; + sprintf(s = buf, "Q.%ld", memno); + } + else { + varname[0] = stg==STGEQUIV ? '1' : '0'; + s = memname(stg, memno); + } + t = varname + 1; + while(*t++ = *s++); + *t = 0; + return(varname); +} + + + + + void +#ifdef KR_headers +frdata(p0) + chainp p0; +#else +frdata(chainp p0) +#endif +{ + register struct Chain *p; + register tagptr q; + + for(p = p0 ; p ; p = p->nextp) + { + q = (tagptr)p->datap; + if(q->tag == TIMPLDO) + { + if(q->impldoblock.isbusy) + return; /* circular chain completed */ + q->impldoblock.isbusy = YES; + frdata(q->impldoblock.datalist); + free( (charptr) q); + } + else + frexpr(q); + } + + frchain( &p0); +} + + + void +#ifdef KR_headers +dataline(varname, offset, type) + char *varname; + ftnint offset; + int type; +#else +dataline(char *varname, ftnint offset, int type) +#endif +{ + fprintf(dfile, datafmt, varname, offset, type); +} + + void +#ifdef KR_headers +make_param(p, e) + register struct Paramblock *p; + expptr e; +#else +make_param(register struct Paramblock *p, expptr e) +#endif +{ + register expptr q; + Constp qc; + + if (p->vstg == STGARG) + errstr("Dummy argument %.50s appears in a parameter statement.", + p->fvarname); + p->vclass = CLPARAM; + impldcl((Namep)p); + if (e->headblock.vtype != TYCHAR) + e = putx(fixtype(e)); + p->paramval = q = mkconv(p->vtype, e); + if (p->vtype == TYCHAR) { + if (q->tag == TEXPR) + p->paramval = q = fixexpr((Exprp)q); + if (q->tag == TADDR && q->addrblock.uname_tag == UNAM_CONST) { + qc = mkconst(TYCHAR); + qc->Const = q->addrblock.user.Const; + qc->vleng = q->addrblock.vleng; + q->addrblock.vleng = 0; + frexpr(q); + p->paramval = q = (expptr)qc; + } + if (!ISCONST(q) || q->constblock.vtype != TYCHAR) { + errstr("invalid value for character parameter %s", + p->fvarname); + return; + } + if (!(e = p->vleng)) + p->vleng = ICON(q->constblock.vleng->constblock.Const.ci + + q->constblock.Const.ccp1.blanks); + else if (q->constblock.vleng->constblock.Const.ci + > e->constblock.Const.ci) { + q->constblock.vleng->constblock.Const.ci + = e->constblock.Const.ci; + q->constblock.Const.ccp1.blanks = 0; + } + else + q->constblock.Const.ccp1.blanks + = e->constblock.Const.ci + - q->constblock.vleng->constblock.Const.ci; + } + } diff --git a/tools/connec/src/data.o b/tools/connec/src/data.o new file mode 100644 index 0000000000000000000000000000000000000000..6ed01061599f436504a42fda0cd9614b2d70b03b GIT binary patch literal 12256 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 EU*Q;$IsgCw literal 0 HcmV?d00001 diff --git a/tools/connec/src/defines.h b/tools/connec/src/defines.h new file mode 100644 index 0000000..1ed4537 --- /dev/null +++ b/tools/connec/src/defines.h @@ -0,0 +1,300 @@ +#define PDP11 4 + +#define BIGGEST_CHAR 0x7f /* Assumes 32-bit arithmetic */ +#define BIGGEST_SHORT 0x7fff /* Assumes 32-bit arithmetic */ +#define BIGGEST_LONG 0x7fffffff /* Assumes 32-bit arithmetic */ + +#define M(x) (1<tag==TCONST && ISINT(z->constblock.vtype)) +#define ISLOGICAL(z) ONEOF(z, MSKLOGICAL) + +/* ISCHAR assumes that z has some kind of structure, i.e. is not null */ + +#define ISCHAR(z) (z->headblock.vtype==TYCHAR) +#define ISINT(z) ONEOF(z, MSKINT) /* z is a tag, i.e. a mask number */ +#define ISCONST(z) (z->tag==TCONST) +#define ISERROR(z) (z->tag==TERROR) +#define ISPLUSOP(z) (z->tag==TEXPR && z->exprblock.opcode==OPPLUS) +#define ISSTAROP(z) (z->tag==TEXPR && z->exprblock.opcode==OPSTAR) +#define ISONE(z) (ISICON(z) && z->constblock.Const.ci==1) +#define INT(z) ONEOF(z, MSKINT|MSKCHAR) /* has INT storage in real life */ +#define ICON(z) mkintcon( (ftnint)(z) ) + +/* NO66 -- F77 feature is being used + NOEXT -- F77 extension is being used */ + +#define NO66(s) if(no66flag) err66(s) +#define NOEXT(s) if(noextflag) errext(s) diff --git a/tools/connec/src/defs.h b/tools/connec/src/defs.h new file mode 100644 index 0000000..0f0a1c2 --- /dev/null +++ b/tools/connec/src/defs.h @@ -0,0 +1,1073 @@ +/**************************************************************** +Copyright 1990 - 1996, 1999-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "sysdep.h" + +#include "ftypes.h" +#include "defines.h" +#include "machdefs.h" + +#define MAXDIM 20 +#define MAXINCLUDES 10 +#define MAXLITERALS 200 /* Max number of constants in the literal + pool */ +#define MAXCTL 20 +#define MAXHASH 802 +#define MAXSTNO 801 +#define MAXEXT 400 +#define MAXEQUIV 300 +#define MAXLABLIST 258 /* Max number of labels in an alternate + return CALL or computed GOTO */ +#define MAXCONTIN 99 /* Max continuation lines */ +#define MAX_SHARPLINE_LEN 1000 /* Elbow room for #line lines with long names */ +/* These are the primary pointer types used in the compiler */ + +typedef union Expression *expptr, *tagptr; +typedef struct Chain *chainp; +typedef struct Addrblock *Addrp; +typedef struct Constblock *Constp; +typedef struct Exprblock *Exprp; +typedef struct Nameblock *Namep; + +extern FILEP infile; +extern FILEP diagfile; +extern FILEP textfile; +extern FILEP asmfile; +extern FILEP c_file; /* output file for all functions; extern + declarations will have to be prepended */ +extern FILEP pass1_file; /* Temp file to hold the function bodies + read on pass 1 */ +extern FILEP expr_file; /* Debugging file */ +extern FILEP initfile; /* Intermediate data file pointer */ +extern FILEP blkdfile; /* BLOCK DATA file */ + +extern int current_ftn_file; +extern int maxcontin; + +extern char *blkdfname, *initfname, *sortfname; +extern long headoffset; /* Since the header block requires data we + don't know about until AFTER each + function has been processed, we keep a + pointer to the current (dummy) header + block (at the top of the assembly file) + here */ + +extern char main_alias[]; /* name given to PROGRAM psuedo-op */ +extern char *token; +extern int maxtoklen, toklen; +extern long err_lineno, lineno; +extern char *infname; +extern int needkwd; +extern struct Labelblock *thislabel; + +/* Used to allow runtime expansion of internal tables. In particular, + these values can exceed their associated constants */ + +extern int maxctl; +extern int maxequiv; +extern int maxstno; +extern int maxhash; +extern int maxext; + +extern flag nowarnflag; +extern flag ftn66flag; /* Generate warnings when weird f77 + features are used (undeclared dummy + procedure, non-char initialized with + string, 1-dim subscript in EQUIV) */ +extern flag no66flag; /* Generate an error when a generic + function (f77 feature) is used */ +extern flag noextflag; /* Generate an error when an extension to + Fortran 77 is used (hex/oct/bin + constants, automatic, static, double + complex types) */ +extern flag zflag; /* enable double complex intrinsics */ +extern flag shiftcase; +extern flag undeftype; +extern flag shortsubs; /* Use short subscripts on arrays? */ +extern flag onetripflag; /* if true, always execute DO loop body */ +extern flag checksubs; +extern flag debugflag; +extern int nerr; +extern int nwarn; + +extern int parstate; +extern flag headerdone; /* True iff the current procedure's header + data has been written */ +extern int blklevel; +extern flag saveall; +extern flag substars; /* True iff some formal parameter is an + asterisk */ +extern int impltype[ ]; +extern ftnint implleng[ ]; +extern int implstg[ ]; + +extern int tycomplex, tyint, tyioint, tyreal; +extern int tylog, tylogical; /* TY____ of the implementation of logical. + This will be LONG unless '-2' is given + on the command line */ +extern int type_choice[]; +extern char *Typename[]; + +extern int typesize[]; /* size (in bytes) of an object of each + type. Indexed by TY___ macros */ +extern int typealign[]; +extern int proctype; /* Type of return value in this procedure */ +extern char * procname; /* External name of the procedure, or last ENTRY name */ +extern int rtvlabel[ ]; /* Return value labels, indexed by TY___ macros */ +extern Addrp retslot; +extern Addrp xretslot[]; +extern int cxslot; /* Complex return argument slot (frame pointer offset)*/ +extern int chslot; /* Character return argument slot (fp offset) */ +extern int chlgslot; /* Argument slot for length of character buffer */ +extern int procclass; /* Class of the current procedure: either CLPROC, + CLMAIN, CLBLOCK or CLUNKNOWN */ +extern ftnint procleng; /* Length of function return value (e.g. char + string length). If this is -1, then the length is + not known at compile time */ +extern int nentry; /* Number of entry points (other than the original + function call) into this procedure */ +extern flag multitype; /* YES iff there is more than one return value + possible */ +extern int blklevel; +extern long lastiolabno; +extern long lastlabno; +extern int lastvarno; +extern int lastargslot; /* integer offset pointing to the next free + location for an argument to the current routine */ +extern int argloc; +extern int autonum[]; /* for numbering + automatic variables, e.g. temporaries */ +extern int retlabel; +extern int ret0label; +extern int dorange; /* Number of the label which terminates + the innermost DO loop */ +extern int regnum[ ]; /* Numbers of DO indicies named in + regnamep (below) */ +extern Namep regnamep[ ]; /* List of DO indicies in registers */ +extern int maxregvar; /* number of elts in regnamep */ +extern int highregvar; /* keeps track of the highest register + number used by DO index allocator */ +extern int nregvar; /* count of DO indicies in registers */ + +extern chainp templist[]; +extern int maxdim; +extern chainp earlylabs; +extern chainp holdtemps; +extern struct Entrypoint *entries; +extern struct Rplblock *rpllist; +extern struct Chain *curdtp; +extern ftnint curdtelt; +extern chainp allargs; /* union of args in entries */ +extern int nallargs; /* total number of args */ +extern int nallchargs; /* total number of character args */ +extern flag toomanyinit; /* True iff too many initializers in a + DATA statement */ + +extern flag inioctl; +extern int iostmt; +extern Addrp ioblkp; +extern int nioctl; +extern int nequiv; +extern int eqvstart; /* offset to eqv number to guarantee uniqueness + and prevent from going negative */ +extern int nintnames; + +/* Chain of tagged blocks */ + +struct Chain + { + chainp nextp; + char * datap; /* Tagged block */ + }; + +extern chainp chains; + +/* Recall that field is intended to hold four-bit characters */ + +/* This structure exists only to defeat the type checking */ + +struct Headblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* Expression for length of char string - + this may be a constant, or an argument + generated by mkarg() */ + } ; + +/* Control construct info (for do loops, else, etc) */ + +struct Ctlframe + { + unsigned ctltype:8; + unsigned dostepsign:8; /* 0 - variable, 1 - pos, 2 - neg */ + unsigned dowhile:1; + int ctlabels[4]; /* Control labels, defined below */ + int dolabel; /* label marking end of this DO loop */ + Namep donamep; /* DO index variable */ + expptr doinit; /* for use with -onetrip */ + expptr domax; /* constant or temp variable holding MAX + loop value; or expr of while(expr) */ + expptr dostep; /* expression */ + Namep loopname; + }; +#define endlabel ctlabels[0] +#define elselabel ctlabels[1] +#define dobodylabel ctlabels[1] +#define doposlabel ctlabels[2] +#define doneglabel ctlabels[3] +extern struct Ctlframe *ctls; /* Keeps info on DO and BLOCK IF + structures - this is the stack + bottom */ +extern struct Ctlframe *ctlstack; /* Pointer to current nesting + level */ +extern struct Ctlframe *lastctl; /* Point to end of + dynamically-allocated array */ + +typedef struct { + int type; + chainp cp; + } Atype; + +typedef struct { + int defined, dnargs, nargs, changes; + Atype atypes[1]; + } Argtypes; + +/* External Symbols */ + +struct Extsym + { + char *fextname; /* Fortran version of external name */ + char *cextname; /* C version of external name */ + field extstg; /* STG -- should be COMMON, UNKNOWN or EXT + */ + unsigned extype:4; /* for transmitting type to output routines */ + unsigned used_here:1; /* Boolean - true on the second pass + through a function if the block has + been referenced */ + unsigned exused:1; /* Has been used (for help with error msgs + about externals typed differently in + different modules) */ + unsigned exproto:1; /* type specified in a .P file */ + unsigned extinit:1; /* Procedure has been defined, + or COMMON has DATA */ + unsigned extseen:1; /* True if previously referenced */ + chainp extp; /* List of identifiers in the common + block for this function, stored as + Namep (hash table pointers) */ + chainp allextp; /* List of lists of identifiers; we keep one + list for each layout of this common block */ + int curno; /* current number for this common block, + used for constructing appending _nnn + to the common block name */ + int maxno; /* highest curno value for this common block */ + ftnint extleng; + ftnint maxleng; + Argtypes *arginfo; + }; +typedef struct Extsym Extsym; + +extern Extsym *extsymtab; /* External symbol table */ +extern Extsym *nextext; +extern Extsym *lastext; +extern int complex_seen, dcomplex_seen; + +/* Statement labels */ + +struct Labelblock + { + int labelno; /* Internal label */ + unsigned blklevel:8; /* level of nesting, for branch-in-loop + checking */ + unsigned labused:1; + unsigned fmtlabused:1; + unsigned labinacc:1; /* inaccessible? (i.e. has its scope + vanished) */ + unsigned labdefined:1; /* YES or NO */ + unsigned labtype:2; /* LAB{FORMAT,EXEC,etc} */ + ftnint stateno; /* Original label */ + char *fmtstring; /* format string */ + }; + +extern struct Labelblock *labeltab; /* Label table - keeps track of + all labels, including undefined */ +extern struct Labelblock *labtabend; +extern struct Labelblock *highlabtab; + +/* Entry point list */ + +struct Entrypoint + { + struct Entrypoint *entnextp; + Extsym *entryname; /* Name of this ENTRY */ + chainp arglist; + int typelabel; /* Label for function exit; this + will return the proper type of + object */ + Namep enamep; /* External name */ + }; + +/* Primitive block, or Primary block. This is a general template returned + by the parser, which will be interpreted in context. It is a template + for an identifier (variable name, function name), parenthesized + arguments (array subscripts, function parameters) and substring + specifications. */ + +struct Primblock + { + field tag; + field vtype; + unsigned parenused:1; /* distinguish (a) from a */ + Namep namep; /* Pointer to structure Nameblock */ + struct Listblock *argsp; + expptr fcharp; /* first-char-index-pointer (in + substring) */ + expptr lcharp; /* last-char-index-pointer (in + substring) */ + }; + + +struct Hashentry + { + int hashval; + Namep varp; + }; +extern struct Hashentry *hashtab; /* Hash table */ +extern struct Hashentry *lasthash; + +struct Intrpacked /* bits for intrinsic function description */ + { + unsigned f1:4; + unsigned f2:4; + unsigned f3:7; + unsigned f4:1; + }; + +struct Nameblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* length of character string, if applicable */ + char *fvarname; /* name in the Fortran source */ + char *cvarname; /* name in the resulting C */ + chainp vlastdim; /* datap points to new_vars entry for the */ + /* system variable, if any, storing the final */ + /* dimension; we zero the datap if this */ + /* variable is needed */ + unsigned vprocclass:3; /* P____ macros - selects the varxptr + field below */ + unsigned vdovar:1; /* "is it a DO variable?" for register + and multi-level loop checking */ + unsigned vdcldone:1; /* "do I think I'm done?" - set when the + context is sufficient to determine its + status */ + unsigned vadjdim:1; /* "adjustable dimension?" - needed for + information about copies */ + unsigned vsave:1; + unsigned vimpldovar:1; /* used to prevent erroneous error messages + for variables used only in DATA stmt + implicit DOs */ + unsigned vis_assigned:1;/* True if this variable has had some + label ASSIGNED to it; hence + varxptr.assigned_values is valid */ + unsigned vimplstg:1; /* True if storage type is assigned implicitly; + this allows a COMMON variable to participate + in a DIMENSION before the COMMON declaration. + */ + unsigned vcommequiv:1; /* True if EQUIVALENCEd onto STGCOMMON */ + unsigned vfmt_asg:1; /* True if char *var_fmt needed */ + unsigned vpassed:1; /* True if passed as a character-variable arg */ + unsigned vknownarg:1; /* True if seen in a previous entry point */ + unsigned visused:1; /* True if variable is referenced -- so we */ + /* can omit variables that only appear in DATA */ + unsigned vnamelist:1; /* Appears in a NAMELIST */ + unsigned vimpltype:1; /* True if implicitly typed and not + invoked as a function or subroutine + (so we can consistently type procedures + declared external and passed as args + but never invoked). + */ + unsigned vtypewarned:1; /* so we complain just once about + changed types of external procedures */ + unsigned vinftype:1; /* so we can restore implicit type to a + procedure if it is invoked as a function + after being given a different type by -it */ + unsigned vinfproc:1; /* True if -it infers this to be a procedure */ + unsigned vcalled:1; /* has been invoked */ + unsigned vdimfinish:1; /* need to invoke dim_finish() */ + unsigned vrefused:1; /* Need to #define name_ref (for -s) */ + unsigned vsubscrused:1; /* Need to #define name_subscr (for -2) */ + unsigned veqvadjust:1; /* voffset has been adjusted for equivalence */ + +/* The vardesc union below is used to store the number of an intrinsic + function (when vstg == STGINTR and vprocclass == PINTRINSIC), or to + store the index of this external symbol in extsymtab (when vstg == + STGEXT and vprocclass == PEXTERNAL) */ + + union { + int varno; /* Return variable for a function. + This is used when a function is + assigned a return value. Also + used to point to the COMMON + block, when this is a field of + that block. Also points to + EQUIV block when STGEQUIV */ + struct Intrpacked intrdesc; /* bits for intrinsic function*/ + } vardesc; + struct Dimblock *vdim; /* points to the dimensions if they exist */ + ftnint voffset; /* offset in a storage block (the variable + name will be "v.%d", voffset in a + common blck on the vax). Also holds + pointers for automatic variables. When + STGEQUIV, this is -(offset from array + base) */ + union { + chainp namelist; /* points to names in the NAMELIST, + if this is a NAMELIST name */ + chainp vstfdesc; /* points to (formals, expr) pair */ + chainp assigned_values; /* list of integers, each being a + statement label assigned to + this variable in the current function */ + } varxptr; + int argno; /* for multiple entries */ + Argtypes *arginfo; + }; + + +/* PARAMETER statements */ + +struct Paramblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; + char *fvarname; + char *cvarname; + expptr paramval; + } ; + + +/* Expression block */ + +struct Exprblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* in the case of a character expression, this + value is inherited from the children */ + unsigned int opcode; + expptr leftp; + expptr rightp; + int typefixed; + }; + + +union Constant + { + struct { + char *ccp0; + ftnint blanks; + } ccp1; + ftnint ci; /* Constant integer */ +#ifndef NO_LONG_LONG + Llong cq; /* for TYQUAD integer */ + ULlong ucq; +#endif + double cd[2]; + char *cds[2]; + }; +#define ccp ccp1.ccp0 + +struct Constblock + { + field tag; + field vtype; + field vclass; + field vstg; /* vstg = 1 when using Const.cds */ + expptr vleng; + union Constant Const; + }; + + +struct Listblock + { + field tag; + field vtype; + chainp listp; + }; + + + +/* Address block - this is the FINAL form of identifiers before being + sent to pass 2. We'll want to add the original identifier here so that it can + be preserved in the translation. + + An example identifier is q.7. The "q" refers to the storage class + (field vstg), the 7 to the variable number (int memno). */ + +struct Addrblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; + /* put union...user here so the beginning of an Addrblock + * is the same as a Constblock. + */ + union { + Namep name; /* contains a pointer into the hash table */ + char ident[IDENT_LEN + 1]; /* C string form of identifier */ + char *Charp; + union Constant Const; /* Constant value */ + struct { + double dfill[2]; + field vstg1; + } kludge; /* so we can distinguish string vs binary + * floating-point constants */ + } user; + long memno; /* when vstg == STGCONST, this is the + numeric part of the assembler label + where the constant value is stored */ + expptr memoffset; /* used in subscript computations, usually */ + unsigned istemp:1; /* used in stack management of temporary + variables */ + unsigned isarray:1; /* used to show that memoffset is + meaningful, even if zero */ + unsigned ntempelt:10; /* for representing temporary arrays, as + in concatenation */ + unsigned dbl_builtin:1; /* builtin to be declared double */ + unsigned charleng:1; /* so saveargtypes can get i/o calls right */ + unsigned cmplx_sub:1; /* used in complex arithmetic under -s */ + unsigned skip_offset:1; /* used in complex arithmetic under -s */ + unsigned parenused:1; /* distinguish (a) from a */ + ftnint varleng; /* holds a copy of a constant length which + is stored in the vleng field (e.g. + a double is 8 bytes) */ + int uname_tag; /* Tag describing which of the unions() + below to use */ + char *Field; /* field name when dereferencing a struct */ +}; /* struct Addrblock */ + + +/* Errorbock - placeholder for errors, to allow the compilation to + continue */ + +struct Errorblock + { + field tag; + field vtype; + }; + + +/* Implicit DO block, especially related to DATA statements. This block + keeps track of the compiler's location in the implicit DO while it's + running. In particular, the isactive and isbusy flags tell where + it is */ + +struct Impldoblock + { + field tag; + unsigned isactive:1; + unsigned isbusy:1; + Namep varnp; + Constp varvp; + chainp impdospec; + expptr implb; + expptr impub; + expptr impstep; + ftnint impdiff; + ftnint implim; + struct Chain *datalist; + }; + + +/* Each of these components has a first field called tag. This union + exists just for allocation simplicity */ + +union Expression + { + field tag; + struct Addrblock addrblock; + struct Constblock constblock; + struct Errorblock errorblock; + struct Exprblock exprblock; + struct Headblock headblock; + struct Impldoblock impldoblock; + struct Listblock listblock; + struct Nameblock nameblock; + struct Paramblock paramblock; + struct Primblock primblock; + } ; + + + +struct Dimblock + { + int ndim; + expptr nelt; /* This is NULL if the array is unbounded */ + expptr baseoffset; /* a constant or local variable holding + the offset in this procedure */ + expptr basexpr; /* expression for comuting the offset, if + it's not constant. If this is + non-null, the register named in + baseoffset will get initialized to this + value in the procedure's prolog */ + struct + { + expptr dimsize; /* constant or register holding the size + of this dimension */ + expptr dimexpr; /* as above in basexpr, this is an + expression for computing a variable + dimension */ + } dims[1]; /* Dimblocks are allocated with enough + space for this to become dims[ndim] */ + }; + + +/* Statement function identifier stack - this holds the name and value of + the parameters in a statement function invocation. For example, + + f(x,y,z)=x+y+z + . + . + y = f(1,2,3) + + generates a stack of depth 3, with , , AT THE INVOCATION, NOT + at the definition */ + +struct Rplblock /* name replacement block */ + { + struct Rplblock *rplnextp; + Namep rplnp; /* Name of the formal parameter */ + expptr rplvp; /* Value of the actual parameter */ + expptr rplxp; /* Initialization of temporary variable, + if required; else null */ + int rpltag; /* Tag on the value of the actual param */ + }; + + + +/* Equivalence block */ + +struct Equivblock + { + struct Eqvchain *equivs; /* List (Eqvchain) of primblocks + holding variable identifiers */ + flag eqvinit; + long eqvtop; + long eqvbottom; + int eqvtype; + } ; +#define eqvleng eqvtop + +extern struct Equivblock *eqvclass; + + +struct Eqvchain + { + struct Eqvchain *eqvnextp; + union + { + struct Primblock *eqvlhs; + Namep eqvname; + } eqvitem; + long eqvoffset; + } ; + + + +/* For allocation purposes only, and to keep lint quiet. In particular, + don't count on the tag being able to tell you which structure is used */ + + +/* There is a tradition in Fortran that the compiler not generate the same + bit pattern more than is necessary. This structure is used to do just + that; if two integer constants have the same bit pattern, just generate + it once. This could be expanded to optimize without regard to type, by + removing the type check in putconst() */ + +struct Literal + { + short littype; + short lituse; /* usage count */ + long litnum; /* numeric part of the assembler + label for this constant value */ + union { + ftnint litival; + double litdval[2]; + ftnint litival2[2]; /* length, nblanks for strings */ +#ifndef NO_LONG_LONG + Llong litqval; +#endif + } litval; + char *cds[2]; + }; + +extern struct Literal *litpool; +extern int maxliterals, nliterals; +extern unsigned char Letters[]; +#define letter(x) Letters[x] + +struct Dims { expptr lb, ub; }; + +extern int forcedouble; /* force real functions to double */ +extern int doin_setbound; /* special handling for array bounds */ +extern int Ansi; +extern unsigned char hextoi_tab[]; +#define hextoi(x) hextoi_tab[(x) & 0xff] +extern char *casttypes[], *ftn_types[], *protorettypes[], *usedcasts[]; +extern int Castargs, infertypes; +extern FILE *protofile; +extern char binread[], binwrite[], textread[], textwrite[]; +extern char *ei_first, *ei_last, *ei_next; +extern char *wh_first, *wh_last, *wh_next; +extern char *halign, *outbuf, *outbtail; +extern flag keepsubs; +#ifdef TYQUAD +extern flag use_tyquad; +extern unsigned long ff; +#ifndef NO_LONG_LONG +extern flag allow_i8c; +#endif +#endif /*TYQUAD*/ +extern int n_keywords; +extern char *c_keywords[]; + +#ifdef KR_headers +#define Argdcl(x) () +#define Void /* void */ +#else +#define Argdcl(x) x +#define Void void +#endif + +char* Alloc Argdcl((int)); +char* Argtype Argdcl((int, char*)); +void Fatal Argdcl((char*)); +struct Impldoblock* mkiodo Argdcl((chainp, chainp)); +tagptr Inline Argdcl((int, int, chainp)); +struct Labelblock* execlab Argdcl((long)); +struct Labelblock* mklabel Argdcl((long)); +struct Listblock* mklist Argdcl((chainp)); +void Un_link_all Argdcl((int)); +void add_extern_to_list Argdcl((Addrp, chainp*)); +int addressable Argdcl((tagptr)); +tagptr addrof Argdcl((tagptr)); +char* addunder Argdcl((char*)); +void argkludge Argdcl((int*, char***)); +Addrp autovar Argdcl((int, int, tagptr, char*)); +void backup Argdcl((char*, char*)); +void bad_atypes Argdcl((Argtypes*, char*, int, int, int, char*, char*)); +int badchleng Argdcl((tagptr)); +void badop Argdcl((char*, int)); +void badstg Argdcl((char*, int)); +void badtag Argdcl((char*, int)); +void badthing Argdcl((char*, char*, int)); +void badtype Argdcl((char*, int)); +Addrp builtin Argdcl((int, char*, int)); +char* c_name Argdcl((char*, int)); +tagptr call0 Argdcl((int, char*)); +tagptr call1 Argdcl((int, char*, tagptr)); +tagptr call2 Argdcl((int, char*, tagptr, tagptr)); +tagptr call3 Argdcl((int, char*, tagptr, tagptr, tagptr)); +tagptr call4 Argdcl((int, char*, tagptr, tagptr, tagptr, tagptr)); +tagptr callk Argdcl((int, char*, chainp)); +void cast_args Argdcl((int, chainp)); +char* cds Argdcl((char*, char*)); +void changedtype Argdcl((Namep)); +ptr ckalloc Argdcl((int)); +int cktype Argdcl((int, int, int)); +void clf Argdcl((FILEP*, char*, int)); +int cmpstr Argdcl((char*, char*, long, long)); +char* c_type_decl Argdcl((int, int)); +Extsym* comblock Argdcl((char*)); +char* comm_union_name Argdcl((int)); +void consconv Argdcl((int, Constp, Constp)); +void consnegop Argdcl((Constp)); +int conssgn Argdcl((tagptr)); +char* convic Argdcl((long)); +void copy_data Argdcl((chainp)); +char* copyn Argdcl((int, char*)); +char* copys Argdcl((char*)); +tagptr cpblock Argdcl((int, char*)); +tagptr cpexpr Argdcl((tagptr)); +void cpn Argdcl((int, char*, char*)); +char* cpstring Argdcl((char*)); +void dataline Argdcl((char*, long, int)); +char* dataname Argdcl((int, long)); +void dataval Argdcl((tagptr, tagptr)); +void dclerr Argdcl((const char*, Namep)); +void def_commons Argdcl((FILEP)); +void def_start Argdcl((FILEP, char*, char*, char*)); +void deregister Argdcl((Namep)); +void do_uninit_equivs Argdcl((FILEP, ptr)); +void doequiv(Void); +int dofork Argdcl((char*)); +void doinclude Argdcl((char*)); +void doio Argdcl((chainp)); +void done Argdcl((int)); +void donmlist(Void); +int dsort Argdcl((char*, char*)); +char* dtos Argdcl((double)); +void elif_out Argdcl((FILEP, tagptr)); +void end_else_out Argdcl((FILEP)); +void enddcl(Void); +void enddo Argdcl((int)); +void endio(Void); +void endioctl(Void); +void endproc(Void); +void entrypt Argdcl((int, int, long, Extsym*, chainp)); +int eqn Argdcl((int, char*, char*)); +char* equiv_name Argdcl((int, char*)); +void err Argdcl((char*)); +void err66 Argdcl((char*)); +void errext Argdcl((char*)); +void erri Argdcl((char*, int)); +void errl Argdcl((char*, long)); +tagptr errnode(Void); +void errstr Argdcl((const char*, const char*)); +void exarif Argdcl((tagptr, struct Labelblock*, struct Labelblock*, struct Labelblock*)); +void exasgoto Argdcl((Namep)); +void exassign Argdcl((Namep, struct Labelblock*)); +void excall Argdcl((Namep, struct Listblock*, int, struct Labelblock**)); +void exdo Argdcl((int, Namep, chainp)); +void execerr Argdcl((char*, char*)); +void exelif Argdcl((tagptr)); +void exelse(Void); +void exenddo Argdcl((Namep)); +void exendif(Void); +void exequals Argdcl((struct Primblock*, tagptr)); +void exgoto Argdcl((struct Labelblock*)); +void exif Argdcl((tagptr)); +void exreturn Argdcl((tagptr)); +void exstop Argdcl((int, tagptr)); +void extern_out Argdcl((FILEP, Extsym*)); +void fatali Argdcl((char*, int)); +void fatalstr Argdcl((char*, char*)); +void ffilecopy Argdcl((FILEP, FILEP)); +void fileinit(Void); +int fixargs Argdcl((int, struct Listblock*)); +tagptr fixexpr Argdcl((Exprp)); +tagptr fixtype Argdcl((tagptr)); +char* flconst Argdcl((char*, char*)); +void flline(Void); +void fmt_init(Void); +void fmtname Argdcl((Namep, Addrp)); +int fmtstmt Argdcl((struct Labelblock*)); +tagptr fold Argdcl((tagptr)); +void frchain Argdcl((chainp*)); +void frdata Argdcl((chainp)); +void freetemps(Void); +void freqchain Argdcl((struct Equivblock*)); +void frexchain Argdcl((chainp*)); +void frexpr Argdcl((tagptr)); +void frrpl(Void); +void frtemp Argdcl((Addrp)); +char* gmem Argdcl((int, int)); +void hashclear(Void); +chainp hookup Argdcl((chainp, chainp)); +expptr imagpart Argdcl((Addrp)); +void impldcl Argdcl((Namep)); +int in_vector Argdcl((char*, char**, int)); +void incomm Argdcl((Extsym*, Namep)); +void inferdcl Argdcl((Namep, int)); +int inilex Argdcl((char*)); +void initkey(Void); +int inregister Argdcl((Namep)); +long int commlen Argdcl((chainp)); +long int convci Argdcl((int, char*)); +long int iarrlen Argdcl((Namep)); +long int lencat Argdcl((expptr)); +long int lmax Argdcl((long, long)); +long int lmin Argdcl((long, long)); +long int wr_char_len Argdcl((FILEP, struct Dimblock*, ftnint, int)); +Addrp intraddr Argdcl((Namep)); +tagptr intrcall Argdcl((Namep, struct Listblock*, int)); +int intrfunct Argdcl((char*)); +void ioclause Argdcl((int, expptr)); +int iocname(Void); +int is_negatable Argdcl((Constp)); +int isaddr Argdcl((tagptr)); +int isnegative_const Argdcl((Constp)); +int isstatic Argdcl((tagptr)); +chainp length_comp Argdcl((struct Entrypoint*, int)); +int lengtype Argdcl((int, long)); +char* lexline Argdcl((ptr)); +void list_arg_types Argdcl((FILEP, struct Entrypoint*, chainp, int, char*)); +void list_decls Argdcl((FILEP)); +void list_init_data Argdcl((FILE **, char *, FILE *)); +void listargs Argdcl((FILEP, struct Entrypoint*, int, chainp)); +char* lit_name Argdcl((struct Literal*)); +int log_2 Argdcl((long)); +char* lower_string Argdcl((char*, char*)); +int main Argdcl((int, char**)); +expptr make_int_expr Argdcl((expptr)); +void make_param Argdcl((struct Paramblock*, tagptr)); +void many Argdcl((char*, char, int)); +void margin_printf Argdcl((FILEP, const char*, ...)); +int maxtype Argdcl((int, int)); +char* mem Argdcl((int, int)); +void mem_init(Void); +char* memname Argdcl((int, long)); +Addrp memversion Argdcl((Namep)); +tagptr mkaddcon Argdcl((long)); +Addrp mkaddr Argdcl((Namep)); +Addrp mkarg Argdcl((int, int)); +tagptr mkbitcon Argdcl((int, int, char*)); +chainp mkchain Argdcl((char*, chainp)); +Constp mkconst Argdcl((int)); +tagptr mkconv Argdcl((int, tagptr)); +tagptr mkcxcon Argdcl((tagptr, tagptr)); +tagptr mkexpr Argdcl((int, tagptr, tagptr)); +Extsym* mkext Argdcl((char*, char*)); +Extsym* mkext1 Argdcl((char*, char*)); +Addrp mkfield Argdcl((Addrp, char*, int)); +tagptr mkfunct Argdcl((tagptr)); +tagptr mkintcon Argdcl((long)); +tagptr mkintqcon Argdcl((int, char*)); +tagptr mklhs Argdcl((struct Primblock*, int)); +tagptr mklogcon Argdcl((int)); +Namep mkname Argdcl((char*)); +Addrp mkplace Argdcl((Namep)); +tagptr mkprim Argdcl((Namep, struct Listblock*, chainp)); +tagptr mkrealcon Argdcl((int, char*)); +Addrp mkscalar Argdcl((Namep)); +void mkstfunct Argdcl((struct Primblock*, tagptr)); +tagptr mkstrcon Argdcl((int, char*)); +Addrp mktmp Argdcl((int, tagptr)); +Addrp mktmp0 Argdcl((int, tagptr)); +Addrp mktmpn Argdcl((int, int, tagptr)); +void namelist Argdcl((Namep)); +int ncat Argdcl((expptr)); +void negate_const Argdcl((Constp)); +void new_endif(Void); +Extsym* newentry Argdcl((Namep, int)); +long newlabel(Void); +void newproc(Void); +Addrp nextdata Argdcl((long*)); +void nice_printf Argdcl((FILEP, const char*, ...)); +void not_both Argdcl((char*)); +void np_init(Void); +int oneof_stg Argdcl((Namep, int, int)); +int op_assign Argdcl((int)); +tagptr opconv Argdcl((tagptr, int)); +FILEP opf Argdcl((char*, char*)); +void out_addr Argdcl((FILEP, Addrp)); +void out_asgoto Argdcl((FILEP, tagptr)); +void out_call Argdcl((FILEP, int, int, tagptr, tagptr, tagptr)); +void out_const Argdcl((FILEP, Constp)); +void out_else Argdcl((FILEP)); +void out_for Argdcl((FILEP, tagptr, tagptr, tagptr)); +void out_init(Void); +void outbuf_adjust(Void); +void p1_label Argdcl((long)); +void paren_used Argdcl((struct Primblock*)); +void prcona Argdcl((FILEP, long)); +void prconi Argdcl((FILEP, long)); +#ifndef NO_LONG_LONG +void prconq Argdcl((FILEP, Llong)); +#endif +void prconr Argdcl((FILEP, Constp, int)); +void procinit(Void); +void procode Argdcl((FILEP)); +void prolog Argdcl((FILEP, chainp)); +void protowrite Argdcl((FILEP, int, char*, struct Entrypoint*, chainp)); +expptr prune_left_conv Argdcl((expptr)); +int put_one_arg Argdcl((int, char*, char**, char*, char*)); +expptr putassign Argdcl((expptr, expptr)); +Addrp putchop Argdcl((tagptr)); +void putcmgo Argdcl((tagptr, int, struct Labelblock**)); +Addrp putconst Argdcl((Constp)); +tagptr putcxop Argdcl((tagptr)); +void puteq Argdcl((expptr, expptr)); +void putexpr Argdcl((expptr)); +void puthead Argdcl((char*, int)); +void putif Argdcl((tagptr, int)); +void putout Argdcl((tagptr)); +expptr putsteq Argdcl((Addrp, Addrp)); +void putwhile Argdcl((tagptr)); +tagptr putx Argdcl((tagptr)); +void r8fix(Void); +int rdlong Argdcl((FILEP, long*)); +int rdname Argdcl((FILEP, ptr, char*)); +void read_Pfiles Argdcl((char**)); +Addrp realpart Argdcl((Addrp)); +chainp revchain Argdcl((chainp)); +int same_expr Argdcl((tagptr, tagptr)); +int same_ident Argdcl((tagptr, tagptr)); +void save_argtypes Argdcl((chainp, Argtypes**, Argtypes**, int, char*, int, int, int, int)); +void saveargtypes Argdcl((Exprp)); +void set_externs(Void); +void set_tmp_names(Void); +void setbound Argdcl((Namep, int, struct Dims*)); +void setdata Argdcl((Addrp, Constp, long)); +void setext Argdcl((Namep)); +void setfmt Argdcl((struct Labelblock*)); +void setimpl Argdcl((int, long, int, int)); +void setintr Argdcl((Namep)); +void settype Argdcl((Namep, int, long)); +void sigcatch Argdcl((int)); +void sserr Argdcl((Namep)); +void start_formatting(Void); +void startioctl(Void); +void startproc Argdcl((Extsym*, int)); +void startrw(Void); +char* string_num Argdcl((char*, long)); +int struct_eq Argdcl((chainp, chainp)); +tagptr subcheck Argdcl((Namep, tagptr)); +tagptr suboffset Argdcl((struct Primblock*)); +int type_fixup Argdcl((Argtypes*, Atype*, int)); +void unamstring Argdcl((Addrp, char*)); +void unclassifiable(Void); +void vardcl Argdcl((Namep)); +void warn Argdcl((char*)); +void warn1 Argdcl((const char*, const char*)); +void warni Argdcl((char*, int)); +void westart Argdcl((int)); +void wr_abbrevs Argdcl((FILEP, int, chainp)); +char* wr_ardecls Argdcl((FILE*, struct Dimblock*, long)); +void wr_array_init Argdcl((FILEP, int, chainp)); +void wr_common_decls Argdcl((FILEP)); +void wr_equiv_init Argdcl((FILEP, int, chainp*, int)); +void wr_globals Argdcl((FILEP)); +void wr_nv_ident_help Argdcl((FILEP, Addrp)); +void wr_struct Argdcl((FILEP, chainp)); +void wronginf Argdcl((Namep)); +void yyerror Argdcl((char*)); +int yylex(Void); +int yyparse(Void); + +#ifdef USE_DTOA +#define atof(x) strtod(x,0) +void g_fmt Argdcl((char*, double)); +#endif diff --git a/tools/connec/src/equiv.c b/tools/connec/src/equiv.c new file mode 100644 index 0000000..bcf07e7 --- /dev/null +++ b/tools/connec/src/equiv.c @@ -0,0 +1,412 @@ +/**************************************************************** +Copyright 1990, 1993-6, 2000 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" + +static void eqvcommon Argdcl((struct Equivblock*, int, long int)); +static void eqveqv Argdcl((int, int, long int)); +static int nsubs Argdcl((struct Listblock*)); + +/* ROUTINES RELATED TO EQUIVALENCE CLASS PROCESSING */ + +/* called at end of declarations section to process chains + created by EQUIVALENCE statements + */ + void +doequiv(Void) +{ + register int i; + int inequiv; /* True if one namep occurs in + several EQUIV declarations */ + int comno; /* Index into Extsym table of the last + COMMON block seen (implicitly assuming + that only one will be given) */ + int ovarno; + ftnint comoffset; /* Index into the COMMON block */ + ftnint offset; /* Offset from array base */ + ftnint leng; + register struct Equivblock *equivdecl; + register struct Eqvchain *q; + struct Primblock *primp; + register Namep np; + int k, k1, ns, pref, t; + chainp cp; + extern int type_pref[]; + + for(i = 0 ; i < nequiv ; ++i) + { + +/* Handle each equivalence declaration */ + + equivdecl = &eqvclass[i]; + equivdecl->eqvbottom = equivdecl->eqvtop = 0; + comno = -1; + + + + for(q = equivdecl->equivs ; q ; q = q->eqvnextp) + { + offset = 0; + if (!(primp = q->eqvitem.eqvlhs)) + continue; + vardcl(np = primp->namep); + if(primp->argsp || primp->fcharp) + { + expptr offp; + +/* Pad ones onto the end of an array declaration when needed */ + + if(np->vdim!=NULL && np->vdim->ndim>1 && + nsubs(primp->argsp)==1 ) + { + if(! ftn66flag) + warni + ("1-dim subscript in EQUIVALENCE, %d-dim declared", + np -> vdim -> ndim); + cp = NULL; + ns = np->vdim->ndim; + while(--ns > 0) + cp = mkchain((char *)ICON(1), cp); + primp->argsp->listp->nextp = cp; + } + + offp = suboffset(primp); + if(ISICON(offp)) + offset = offp->constblock.Const.ci; + else { + dclerr + ("nonconstant subscript in equivalence ", + np); + np = NULL; + } + frexpr(offp); + } + +/* Free up the primblock, since we now have a hash table (Namep) entry */ + + frexpr((expptr)primp); + + if(np && (leng = iarrlen(np))<0) + { + dclerr("adjustable in equivalence", np); + np = NULL; + } + + if(np) switch(np->vstg) + { + case STGUNKNOWN: + case STGBSS: + case STGEQUIV: + break; + + case STGCOMMON: + +/* The code assumes that all COMMON references in a given EQUIVALENCE will + be to the same COMMON block, and will all be consistent */ + + comno = np->vardesc.varno; + comoffset = np->voffset + offset; + break; + + default: + dclerr("bad storage class in equivalence", np); + np = NULL; + break; + } + + if(np) + { + q->eqvoffset = offset; + +/* eqvbottom gets the largest difference between the array base address + and the address specified in the EQUIV declaration */ + + equivdecl->eqvbottom = + lmin(equivdecl->eqvbottom, -offset); + +/* eqvtop gets the largest difference between the end of the array and + the address given in the EQUIVALENCE */ + + equivdecl->eqvtop = + lmax(equivdecl->eqvtop, leng-offset); + } + q->eqvitem.eqvname = np; + } + +/* Now all equivalenced variables are in the hash table with the proper + offset, and eqvtop and eqvbottom are set. */ + + if(comno >= 0) + +/* Get rid of all STGEQUIVS, they will be mapped onto STGCOMMON variables + */ + + eqvcommon(equivdecl, comno, comoffset); + else for(q = equivdecl->equivs ; q ; q = q->eqvnextp) + { + if(np = q->eqvitem.eqvname) + { + inequiv = NO; + if(np->vstg==STGEQUIV) + if( (ovarno = np->vardesc.varno) == i) + { + +/* Can't EQUIV different elements of the same array */ + + if(np->voffset + q->eqvoffset != 0) + dclerr + ("inconsistent equivalence", np); + } + else { + offset = np->voffset; + inequiv = YES; + } + + np->vstg = STGEQUIV; + np->vardesc.varno = i; + np->voffset = - q->eqvoffset; + + if(inequiv) + +/* Combine 2 equivalence declarations */ + + eqveqv(i, ovarno, q->eqvoffset + offset); + } + } + } + +/* Now each equivalence declaration is distinct (all connections have been + merged in eqveqv()), and some may be empty. */ + + for(i = 0 ; i < nequiv ; ++i) + { + equivdecl = & eqvclass[i]; + if(equivdecl->eqvbottom!=0 || equivdecl->eqvtop!=0) { + +/* a live chain */ + + k = TYCHAR; + pref = 1; + for(q = equivdecl->equivs ; q; q = q->eqvnextp) + if ((np = q->eqvitem.eqvname) + && !np->veqvadjust) { + np->veqvadjust = 1; + np->voffset -= equivdecl->eqvbottom; + t = typealign[k1 = np->vtype]; + if (pref < type_pref[k1]) { + k = k1; + pref = type_pref[k1]; + } + if(np->voffset % t != 0) { + dclerr("bad alignment forced by equivalence", np); + --nerr; /* don't give bad return code for this */ + } + } + equivdecl->eqvtype = k; + } + freqchain(equivdecl); + } +} + + + + + +/* put equivalence chain p at common block comno + comoffset */ + + LOCAL void +#ifdef KR_headers +eqvcommon(p, comno, comoffset) + struct Equivblock *p; + int comno; + ftnint comoffset; +#else +eqvcommon(struct Equivblock *p, int comno, ftnint comoffset) +#endif +{ + int ovarno; + ftnint k, offq; + register Namep np; + register struct Eqvchain *q; + + if(comoffset + p->eqvbottom < 0) + { + errstr("attempt to extend common %s backward", + extsymtab[comno].fextname); + freqchain(p); + return; + } + + if( (k = comoffset + p->eqvtop) > extsymtab[comno].extleng) + extsymtab[comno].extleng = k; + + + for(q = p->equivs ; q ; q = q->eqvnextp) + if(np = q->eqvitem.eqvname) + { + switch(np->vstg) + { + case STGUNKNOWN: + case STGBSS: + np->vstg = STGCOMMON; + np->vcommequiv = 1; + np->vardesc.varno = comno; + +/* np -> voffset will point to the base of the array */ + + np->voffset = comoffset - q->eqvoffset; + break; + + case STGEQUIV: + ovarno = np->vardesc.varno; + +/* offq will point to the current element, even if it's in an array */ + + offq = comoffset - q->eqvoffset - np->voffset; + np->vstg = STGCOMMON; + np->vcommequiv = 1; + np->vardesc.varno = comno; + +/* np -> voffset will point to the base of the array */ + + np->voffset += offq; + if(ovarno != (p - eqvclass)) + eqvcommon(&eqvclass[ovarno], comno, offq); + break; + + case STGCOMMON: + if(comno != np->vardesc.varno || + comoffset != np->voffset+q->eqvoffset) + dclerr("inconsistent common usage", np); + break; + + + default: + badstg("eqvcommon", np->vstg); + } + } + + freqchain(p); + p->eqvbottom = p->eqvtop = 0; +} + + +/* Move all items on ovarno chain to the front of nvarno chain. + * adjust offsets of ovarno elements and top and bottom of nvarno chain + */ + + LOCAL void +#ifdef KR_headers +eqveqv(nvarno, ovarno, delta) + int nvarno; + int ovarno; + ftnint delta; +#else +eqveqv(int nvarno, int ovarno, ftnint delta) +#endif +{ + register struct Equivblock *neweqv, *oldeqv; + register Namep np; + struct Eqvchain *q, *q1; + + neweqv = eqvclass + nvarno; + oldeqv = eqvclass + ovarno; + neweqv->eqvbottom = lmin(neweqv->eqvbottom, oldeqv->eqvbottom - delta); + neweqv->eqvtop = lmax(neweqv->eqvtop, oldeqv->eqvtop - delta); + oldeqv->eqvbottom = oldeqv->eqvtop = 0; + + for(q = oldeqv->equivs ; q ; q = q1) + { + q1 = q->eqvnextp; + if( (np = q->eqvitem.eqvname) && np->vardesc.varno==ovarno) + { + q->eqvnextp = neweqv->equivs; + neweqv->equivs = q; + q->eqvoffset += delta; + np->vardesc.varno = nvarno; + np->voffset -= delta; + } + else free( (charptr) q); + } + oldeqv->equivs = NULL; +} + + + + void +#ifdef KR_headers +freqchain(p) + register struct Equivblock *p; +#else +freqchain(register struct Equivblock *p) +#endif +{ + register struct Eqvchain *q, *oq; + + for(q = p->equivs ; q ; q = oq) + { + oq = q->eqvnextp; + free( (charptr) q); + } + p->equivs = NULL; +} + + + + + +/* nsubs -- number of subscripts in this arglist (just the length of the + list) */ + + LOCAL int +#ifdef KR_headers +nsubs(p) + register struct Listblock *p; +#else +nsubs(register struct Listblock *p) +#endif +{ + register int n; + register chainp q; + + n = 0; + if(p) + for(q = p->listp ; q ; q = q->nextp) + ++n; + + return(n); +} + + struct Primblock * +#ifdef KR_headers +primchk(e) expptr e; +#else +primchk(expptr e) +#endif +{ + if (e->headblock.tag != TPRIM) { + err("Invalid name in EQUIVALENCE."); + return 0; + } + return &e->primblock; + } diff --git a/tools/connec/src/equiv.o b/tools/connec/src/equiv.o new file mode 100644 index 0000000000000000000000000000000000000000..6bcbd25012a4cb319439f2f080d65e2df518258b GIT binary patch literal 5968 zcmbtYe{@q<9lz;oAwWq2!$Ta7#TmBNmYA{usnpTeCgnyS1%(2-)siMD4Q-N=yvK^H zU0oXV`Ic^S6m;sr9gl~d;~)HihwV6pLOF#gIOJ?o&pfCbW6jD29<{*H5x?J;cgrPB z{6oJz@7;Sp_xtO9zxRIcOP}&dEoCMXVPqnYk~<@Y5^~|5JN-tz+ej>AK55%TQ&-JY z{fKI7X*ws{sCNGZ&QtZzH2s!xou2XO>@;=S{8;;#xJ7IeH-nV=k*NNIsu!rR&feeP zSKpw*RvQhD(@fB+wcRLBczZkqWVsxVx+rnlL50T~{Z7g =jSIEkGBYOhFYu3y=qsjq)yP9W*b#o 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, s); + err(buff); + } + else + errstr("Declaration error %s", s); +} + + + void +#ifdef KR_headers +execerr(s, n) + char *s; + char *n; +#else +execerr(char *s, char *n) +#endif +{ + char buf1[100], buf2[100]; + + sprintf(buf1, "Execution error %s", s); + sprintf(buf2, buf1, n); + err(buf2); +} + + + void +#ifdef KR_headers +Fatal(t) + char *t; +#else +Fatal(char *t) +#endif +{ + fprintf(diagfile, "Compiler error line %ld", lineno); + if (infname) + fprintf(diagfile, " of %s", infname); + fprintf(diagfile, ": %s\n", t); + done(3); +} + + + + void +#ifdef KR_headers +fatalstr(t, s) + char *t; + char *s; +#else +fatalstr(char *t, char *s) +#endif +{ + char buff[100]; + sprintf(buff, t, s); + Fatal(buff); +} + + + void +#ifdef KR_headers +fatali(t, d) + char *t; + int d; +#else +fatali(char *t, int d) +#endif +{ + char buff[100]; + sprintf(buff, t, d); + Fatal(buff); +} + + + void +#ifdef KR_headers +badthing(thing, r, t) + char *thing; + char *r; + int t; +#else +badthing(char *thing, char *r, int t) +#endif +{ + char buff[50]; + sprintf(buff, "Impossible %s %d in routine %s", thing, t, r); + Fatal(buff); +} + + + void +#ifdef KR_headers +badop(r, t) + char *r; + int t; +#else +badop(char *r, int t) +#endif +{ + badthing("opcode", r, t); +} + + + void +#ifdef KR_headers +badtag(r, t) + char *r; + int t; +#else +badtag(char *r, int t) +#endif +{ + badthing("tag", r, t); +} + + + + + void +#ifdef KR_headers +badstg(r, t) + char *r; + int t; +#else +badstg(char *r, int t) +#endif +{ + badthing("storage class", r, t); +} + + + + void +#ifdef KR_headers +badtype(r, t) + char *r; + int t; +#else +badtype(char *r, int t) +#endif +{ + badthing("type", r, t); +} + + void +#ifdef KR_headers +many(s, c, n) + char *s; + char c; + int n; +#else +many(char *s, char c, int n) +#endif +{ + char buff[250]; + + sprintf(buff, + "Too many %s.\nTable limit now %d.\nTry rerunning with the -N%c%d option.\n", + s, n, c, 2*n); + Fatal(buff); +} + + void +#ifdef KR_headers +err66(s) + char *s; +#else +err66(char *s) +#endif +{ + errstr("Fortran 77 feature used: %s", s); + --nerr; +} + + + void +#ifdef KR_headers +errext(s) + char *s; +#else +errext(char *s) +#endif +{ + errstr("f2c extension used: %s", s); + --nerr; +} diff --git a/tools/connec/src/error.o b/tools/connec/src/error.o new file mode 100644 index 0000000000000000000000000000000000000000..5adbc683a6c18a745cc5c3ee753a6e3dcac6ffe5 GIT binary patch literal 8680 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 if, not elseif */ +} + + + void +#ifdef KR_headers +exelif(p) + expptr p; +#else +exelif(expptr p) +#endif +{ + if (ctlstack->ctltype == CTLIF || ctlstack->ctltype == CTLIFX) + putif(p, 1); /* 1 ==> elseif */ + else + execerr("elseif out of place", CNULL); +} + + + + + void +exelse(Void) +{ + register struct Ctlframe *c; + + for(c = ctlstack; c->ctltype == CTLIFX; --c); + if(c->ctltype == CTLIF) { + p1_else (); + c->ctltype = CTLELSE; + } + else + execerr("else out of place", CNULL); + } + + void +#ifdef KR_headers +exendif() +#else +exendif() +#endif +{ + while(ctlstack->ctltype == CTLIFX) { + popctl(); + p1else_end(); + } + if(ctlstack->ctltype == CTLIF) { + popctl(); + p1_endif (); + } + else if(ctlstack->ctltype == CTLELSE) { + popctl(); + p1else_end (); + } + else + execerr("endif out of place", CNULL); + } + + + void +#ifdef KR_headers +new_endif() +#else +new_endif() +#endif +{ + if (ctlstack->ctltype == CTLIF || ctlstack->ctltype == CTLIFX) + pushctl(CTLIFX); + else + err("new_endif bug"); + } + +/* pushctl -- Start a new control construct, initialize the labels (to + zero) */ + + LOCAL void +#ifdef KR_headers +pushctl(code) + int code; +#else +pushctl(int code) +#endif +{ + register int i; + + if(++ctlstack >= lastctl) + many("loops or if-then-elses", 'c', maxctl); + ctlstack->ctltype = code; + for(i = 0 ; i < 4 ; ++i) + ctlstack->ctlabels[i] = 0; + ctlstack->dowhile = 0; + ctlstack->domax = ctlstack->dostep = 0; /* in case of errors */ + ++blklevel; +} + + + LOCAL void +popctl(Void) +{ + if( ctlstack-- < ctls ) + Fatal("control stack empty"); + --blklevel; +} + + + +/* poplab -- update the flags in labeltab */ + + LOCAL void +poplab(Void) +{ + register struct Labelblock *lp; + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if(lp->labdefined) + { + /* mark all labels in inner blocks unreachable */ + if(lp->blklevel > blklevel) + lp->labinacc = YES; + } + else if(lp->blklevel > blklevel) + { + /* move all labels referred to in inner blocks out a level */ + lp->blklevel = blklevel; + } +} + + +/* BRANCHING CODE +*/ + void +#ifdef KR_headers +exgoto(lab) + struct Labelblock *lab; +#else +exgoto(struct Labelblock *lab) +#endif +{ + lab->labused = 1; + p1_goto (lab -> stateno); +} + + + static expptr +#ifdef KR_headers +cktype1(p) expptr p; +#else +cktype1(expptr p) +#endif +{ + /* Do things omitted because we might have been parsing a */ + /* statement function... Check types and fold constants. */ + + chainp c; + tagptr t; + + if(p == 0) + return(0); + + switch(p->tag) { + case TCONST: + case TADDR: + case TERROR: + break; + +/* This case means that fixexpr can't call fixtype with any expr, + only a subexpr of its parameter. */ + + case TEXPR: + t = mkexpr(p->exprblock.opcode, cktype1(p->exprblock.leftp), + cktype1(p->exprblock.rightp)); + free((charptr)p); + p = (expptr) t; + break; + + case TLIST: + for(c = p->listblock.listp; c; c = c->nextp) + c->datap = (char*)cktype1((expptr)c->datap); + break; + + case TPRIM: + p->primblock.argsp = (struct Listblock*) + cktype1((expptr)p->primblock.argsp); + p->primblock.fcharp = cktype1(p->primblock.fcharp); + p->primblock.lcharp = cktype1(p->primblock.lcharp); + break; + + default: + badtag("cktype1", p->tag); + } + return p; + } + + + void +#ifdef KR_headers +exequals(lp, rp) + register struct Primblock *lp; + register expptr rp; +#else +exequals(register struct Primblock *lp, register expptr rp) +#endif +{ + if(lp->tag != TPRIM) + { + err("assignment to a non-variable"); + frexpr((expptr)lp); + frexpr(rp); + } + else if(lp->namep->vclass!=CLVAR && lp->argsp) + { + if(parstate >= INEXEC) + errstr("statement function %.62s amid executables.", + lp->namep->fvarname); + mkstfunct(lp, rp); + } + else if (lp->vtype == TYSUBR) + err("illegal use of subroutine name"); + else + { + expptr new_lp, new_rp; + + if(parstate < INDATA) { + enddcl(); + lp = (struct Primblock *)cktype1((expptr)lp); + rp = cktype1(rp); + } + new_lp = mklhs (lp, keepsubs); + new_rp = fixtype (rp); + puteq(new_lp, new_rp); + } +} + + + +/* Make Statement Function */ + +long laststfcn = -1, thisstno; +int doing_stmtfcn; + + void +#ifdef KR_headers +mkstfunct(lp, rp) + struct Primblock *lp; + expptr rp; +#else +mkstfunct(struct Primblock *lp, expptr rp) +#endif +{ + register struct Primblock *p; + register Namep np; + chainp args; + + laststfcn = thisstno; + np = lp->namep; + if(np->vclass == CLUNKNOWN) + np->vclass = CLPROC; + else + { + dclerr("redeclaration of statement function", np); + return; + } + np->vprocclass = PSTFUNCT; + np->vstg = STGSTFUNCT; + +/* Set the type of the function */ + + impldcl(np); + if (np->vtype == TYCHAR && !np->vleng) + err("character statement function with length (*)"); + args = (lp->argsp ? lp->argsp->listp : CHNULL); + np->varxptr.vstfdesc = mkchain((char *)args, (chainp)rp); + + for(doing_stmtfcn = 1 ; args ; args = args->nextp) + +/* It is an error for the formal parameters to have arguments or + subscripts */ + + if( ((tagptr)(args->datap))->tag!=TPRIM || + (p = (struct Primblock *)(args->datap) )->argsp || + p->fcharp || p->lcharp ) { + err("non-variable argument in statement function definition"); + args->datap = 0; + } + else + { + +/* Replace the name on the left-hand side */ + + args->datap = (char *)p->namep; + vardcl(p -> namep); + free((char *)p); + } + doing_stmtfcn = 0; +} + + static void +#ifdef KR_headers +mixed_type(np) + Namep np; +#else +mixed_type(Namep np) +#endif +{ + char buf[128]; + sprintf(buf, "%s function %.90s invoked as subroutine", + ftn_types[np->vtype], np->fvarname); + warn(buf); + } + + void +#ifdef KR_headers +excall(name, args, nstars, labels) + Namep name; + struct Listblock *args; + int nstars; + struct Labelblock **labels; +#else +excall(Namep name, struct Listblock *args, int nstars, struct Labelblock **labels) +#endif +{ + register expptr p; + + if (name->vtype != TYSUBR) { + if (name->vinfproc && !name->vcalled) { + name->vtype = TYSUBR; + frexpr(name->vleng); + name->vleng = 0; + } + else if (!name->vimpltype && name->vtype != TYUNKNOWN) + mixed_type(name); + else + settype(name, TYSUBR, (ftnint)0); + } + p = mkfunct( mkprim(name, args, CHNULL) ); + if (p->tag == TERROR) + return; + +/* Subroutines and their identifiers acquire the type INT */ + + p->exprblock.vtype = p->exprblock.leftp->headblock.vtype = TYINT; + +/* Handle the alternate return mechanism */ + + if(nstars > 0) + putcmgo(putx(fixtype(p)), nstars, labels); + else + putexpr(p); +} + + + void +#ifdef KR_headers +exstop(stop, p) + int stop; + register expptr p; +#else +exstop(int stop, register expptr p) +#endif +{ + char *str; + int n; + + if(p) + { + if( ! ISCONST(p) ) + { + execerr("pause/stop argument must be constant", CNULL); + frexpr(p); + p = mkstrcon(0, CNULL); + } + else if( ISINT(p->constblock.vtype) ) + { + str = convic(p->constblock.Const.ci); + n = strlen(str); + if(n > 0) + { + p->constblock.Const.ccp = copyn(n, str); + p->constblock.Const.ccp1.blanks = 0; + p->constblock.vtype = TYCHAR; + p->constblock.vleng = (expptr) ICON(n); + } + else + p = (expptr) mkstrcon(0, CNULL); + } + else if(p->constblock.vtype != TYCHAR) + { + execerr("pause/stop argument must be integer or string", CNULL); + p = (expptr) mkstrcon(0, CNULL); + } + } + else p = (expptr) mkstrcon(0, CNULL); + + { + expptr subr_call; + + subr_call = call1(TYSUBR, (char*)(stop ? "s_stop" : "s_paus"), p); + putexpr( subr_call ); + } +} + +/* DO LOOP CODE */ + +#define DOINIT par[0] +#define DOLIMIT par[1] +#define DOINCR par[2] + + +/* Macros for ctlstack -> dostepsign */ + +#define VARSTEP 0 +#define POSSTEP 1 +#define NEGSTEP 2 + + +/* exdo -- generate DO loop code. In the case of a variable increment, + positive increment tests are placed above the body, negative increment + tests are placed below (see enddo() ) */ + + void +#ifdef KR_headers +exdo(range, loopname, spec) + int range; + Namep loopname; + chainp spec; +#else +exdo(int range, Namep loopname, chainp spec) +#endif + /* range = end label */ + /* input spec must have at least 2 exprs */ +{ + register expptr p; + register Namep np; + chainp cp; /* loops over the fields in spec */ + register int i; + int dotype; /* type of the index variable */ + int incsign; /* sign of the increment, if it's constant + */ + Addrp dovarp; /* loop index variable */ + expptr doinit; /* constant or register for init param */ + expptr par[3]; /* local specification parameters */ + + expptr init, test, inc; /* Expressions in the resulting FOR loop */ + + + test = ENULL; + + pushctl(CTLDO); + dorange = ctlstack->dolabel = range; + ctlstack->loopname = loopname; + +/* Declare the loop index */ + + np = (Namep)spec->datap; + ctlstack->donamep = NULL; + if (!np) { /* do while */ + ctlstack->dowhile = 1; +#if 0 + if (loopname) { + if (loopname->vtype == TYUNKNOWN) { + loopname->vdcldone = 1; + loopname->vclass = CLLABEL; + loopname->vprocclass = PLABEL; + loopname->vtype = TYLABEL; + } + if (loopname->vtype == TYLABEL) + if (loopname->vdovar) + dclerr("already in use as a loop name", + loopname); + else + loopname->vdovar = 1; + else + dclerr("already declared; cannot be a loop name", + loopname); + } +#endif + putwhile((expptr)spec->nextp); + NOEXT("do while"); + spec->nextp = 0; + frchain(&spec); + return; + } + if(np->vdovar) + { + errstr("nested loops with variable %s", np->fvarname); + ctlstack->donamep = NULL; + return; + } + +/* Create a memory-resident version of the index variable */ + + dovarp = mkplace(np); + if( ! ONEOF(dovarp->vtype, MSKINT|MSKREAL) ) + { + err("bad type on do variable"); + return; + } + ctlstack->donamep = np; + + np->vdovar = YES; + +/* Now dovarp points to the index to be used within the loop, dostgp + points to the one which may need to be stored */ + + dotype = dovarp->vtype; + +/* Count the input specifications and type-check each one independently; + this just eliminates non-numeric values from the specification */ + + for(i=0 , cp = spec->nextp ; cp!=NULL && i<3 ; cp = cp->nextp) + { + p = par[i++] = fixtype((tagptr)cp->datap); + if( ! ONEOF(p->headblock.vtype, MSKINT|MSKREAL) ) + { + err("bad type on DO parameter"); + return; + } + } + + frchain(&spec); + switch(i) + { + case 0: + case 1: + err("too few DO parameters"); + return; + + default: + err("too many DO parameters"); + return; + + case 2: + DOINCR = (expptr) ICON(1); + + case 3: + break; + } + + +/* Now all of the local specification fields are set, but their types are + not yet consistent */ + +/* Declare the loop initialization value, casting it properly and declaring a + register if need be */ + + ctlstack->doinit = 0; + if (ISCONST (DOINIT) || !onetripflag) +/* putx added 6-29-89 (mwm), not sure if fixtype is required, but I doubt it + since mkconv is called just before */ + doinit = putx (mkconv (dotype, DOINIT)); + else { + if (onetripflag) + ctlstack->doinit = doinit = (expptr) mktmp0(dotype, ENULL); + else + doinit = (expptr) mktmp(dotype, ENULL); + puteq (cpexpr (doinit), DOINIT); + } /* else */ + +/* Declare the loop ending value, casting it to the type of the index + variable */ + + if( ISCONST(DOLIMIT) ) + ctlstack->domax = mkconv(dotype, DOLIMIT); + else { + ctlstack->domax = (expptr) mktmp0(dotype, ENULL); + puteq (cpexpr (ctlstack -> domax), DOLIMIT); + } /* else */ + +/* Declare the loop increment value, casting it to the type of the index + variable */ + + incsign = 0; + if( ISCONST(DOINCR) ) + { + ctlstack->dostep = mkconv(dotype, DOINCR); + if( (incsign = conssgn(ctlstack->dostep)) == 0) + err("zero DO increment"); + ctlstack->dostepsign = (incsign > 0 ? POSSTEP : NEGSTEP); + } + else + { + ctlstack->dostep = (expptr) mktmp0(dotype, ENULL); + ctlstack->dostepsign = VARSTEP; + puteq (cpexpr (ctlstack -> dostep), DOINCR); + } + +/* All data is now properly typed and in the ctlstack, except for the + initial value. Assignments of temps have been generated already */ + + switch (ctlstack -> dostepsign) { + case VARSTEP: + test = mkexpr (OPQUEST, mkexpr (OPLT, + cpexpr (ctlstack -> dostep), ICON(0)), + mkexpr (OPCOLON, + mkexpr (OPGE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)), + mkexpr (OPLE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)))); + break; + case POSSTEP: + test = mkexpr (OPLE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)); + break; + case NEGSTEP: + test = mkexpr (OPGE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)); + break; + default: + erri ("exdo: bad dostepsign '%d'", ctlstack -> dostepsign); + break; + } /* switch (ctlstack -> dostepsign) */ + + if (onetripflag) + test = mkexpr (OPOR, test, + mkexpr (OPEQ, cpexpr((expptr)dovarp), cpexpr (doinit))); + init = mkexpr (OPASSIGN, cpexpr((expptr)dovarp), + ctlstack->doinit ? cpexpr(doinit) : doinit); + inc = mkexpr (OPPLUSEQ, (expptr)dovarp, cpexpr (ctlstack -> dostep)); + + if (!onetripflag && ISCONST (ctlstack -> domax) && ISCONST (doinit) + && ctlstack -> dostepsign != VARSTEP) { + expptr tester; + + tester = mkexpr (OPMINUS, cpexpr (doinit), + cpexpr (ctlstack -> domax)); + if (incsign == conssgn (tester)) + warn ("DO range never executed"); + frexpr (tester); + } /* if !onetripflag && */ + + p1_for (init, test, inc); +} + + void +#ifdef KR_headers +exenddo(np) + Namep np; +#else +exenddo(Namep np) +#endif +{ + Namep np1; + int here; + struct Ctlframe *cf; + + if( ctlstack < ctls ) + goto misplaced; + here = ctlstack->dolabel; + if (ctlstack->ctltype != CTLDO + || here >= 0 && (!thislabel || thislabel->labelno != here)) { + misplaced: + err("misplaced ENDDO"); + return; + } + if (np != ctlstack->loopname) { + if (np1 = ctlstack->loopname) + errstr("expected \"enddo %s\"", np1->fvarname); + else + err("expected unnamed ENDDO"); + for(cf = ctls; cf < ctlstack; cf++) + if (cf->ctltype == CTLDO && cf->loopname == np) { + here = cf->dolabel; + break; + } + } + enddo(here); + } + + void +#ifdef KR_headers +enddo(here) + int here; +#else +enddo(int here) +#endif +{ + register struct Ctlframe *q; + Namep np; /* name of the current DO index */ + Addrp ap; + register int i; + register expptr e; + +/* Many DO's can end at the same statement, so keep looping over all + nested indicies */ + + while(here == dorange) + { + if(np = ctlstack->donamep) + { + p1for_end (); + +/* Now we're done with all of the tests, and the loop has terminated. + Store the index value back in long-term memory */ + + if(ap = memversion(np)) + puteq((expptr)ap, (expptr)mkplace(np)); + for(i = 0 ; i < 4 ; ++i) + ctlstack->ctlabels[i] = 0; + deregister(ctlstack->donamep); + ctlstack->donamep->vdovar = NO; + /* ctlstack->dostep and ctlstack->domax can be zero */ + /* with sufficiently bizarre (erroneous) syntax */ + if (e = ctlstack->dostep) + if (e->tag == TADDR && e->addrblock.istemp) + frtemp((Addrp)e); + else + frexpr(e); + if (e = ctlstack->domax) + if (e->tag == TADDR && e->addrblock.istemp) + frtemp((Addrp)e); + else + frexpr(e); + if (e = ctlstack->doinit) + frtemp((Addrp)e); + } + else if (ctlstack->dowhile) + p1for_end (); + +/* Set dorange to the closing label of the next most enclosing DO loop + */ + + popctl(); + poplab(); + dorange = 0; + for(q = ctlstack ; q>=ctls ; --q) + if(q->ctltype == CTLDO) + { + dorange = q->dolabel; + break; + } + } +} + + void +#ifdef KR_headers +exassign(vname, labelval) + register Namep vname; + struct Labelblock *labelval; +#else +exassign(register Namep vname, struct Labelblock *labelval) +#endif +{ + Addrp p; + register Addrp q; + char *fs; + register chainp cp, cpprev; + register ftnint k, stno; + + p = mkplace(vname); + if( ! ONEOF(p->vtype, MSKINT|MSKADDR) ) { + err("noninteger assign variable"); + return; + } + + /* If the label hasn't been defined, then we do things twice: + * once for an executable stmt label, once for a format + */ + + /* code for executable label... */ + +/* Now store the assigned value in a list associated with this variable. + This will be used later to generate a switch() statement in the C output */ + + fs = labelval->fmtstring; + if (!labelval->labdefined || !fs) { + + if (vname -> vis_assigned == 0) { + vname -> varxptr.assigned_values = CHNULL; + vname -> vis_assigned = 1; + } + + /* don't duplicate labels... */ + + stno = labelval->stateno; + cpprev = 0; + for(k = 0, cp = vname->varxptr.assigned_values; + cp; cpprev = cp, cp = cp->nextp, k++) + if ((ftnint)(Addr)cp->datap == stno) + break; + if (!cp) { + cp = mkchain((char *)(Addr)stno, CHNULL); + if (cpprev) + cpprev->nextp = cp; + else + vname->varxptr.assigned_values = cp; + labelval->labused = 1; + } + putout(mkexpr(OPASSIGN, (expptr)p, mkintcon(k))); + } + + /* Code for FORMAT label... */ + + if (!labelval->labdefined || fs) { + + labelval->fmtlabused = 1; + p = ALLOC(Addrblock); + p->tag = TADDR; + p->vtype = TYCHAR; + p->vstg = STGAUTO; + p->memoffset = ICON(0); + fmtname(vname, p); + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = TYCHAR; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->memoffset = ICON(0); + q->uname_tag = UNAM_IDENT; + sprintf(q->user.ident, "fmt_%ld", labelval->stateno); + putout(mkexpr(OPASSIGN, (expptr)p, (expptr)q)); + } + +} /* exassign */ + + + void +#ifdef KR_headers +exarif(expr, neglab, zerlab, poslab) + expptr expr; + struct Labelblock *neglab; + struct Labelblock *zerlab; + struct Labelblock *poslab; +#else +exarif(expptr expr, struct Labelblock *neglab, struct Labelblock *zerlab, struct Labelblock *poslab) +#endif +{ + ftnint lm, lz, lp; + + lm = neglab->stateno; + lz = zerlab->stateno; + lp = poslab->stateno; + expr = fixtype(expr); + + if( ! ONEOF(expr->headblock.vtype, MSKINT|MSKREAL) ) + { + err("invalid type of arithmetic if expression"); + frexpr(expr); + } + else + { + if (lm == lz && lz == lp) + exgoto (neglab); + else if(lm == lz) + exar2(OPLE, expr, neglab, poslab); + else if(lm == lp) + exar2(OPNE, expr, neglab, zerlab); + else if(lz == lp) + exar2(OPGE, expr, zerlab, neglab); + else { + expptr t; + + if (!addressable (expr)) { + t = (expptr) mktmp(expr -> headblock.vtype, ENULL); + expr = mkexpr (OPASSIGN, cpexpr (t), expr); + } else + t = (expptr) cpexpr (expr); + + p1_if(putx(fixtype(mkexpr (OPLT, expr, ICON (0))))); + exgoto(neglab); + p1_elif (mkexpr (OPEQ, t, ICON (0))); + exgoto(zerlab); + p1_else (); + exgoto(poslab); + p1else_end (); + } /* else */ + } +} + + + +/* exar2 -- Do arithmetic IF for only 2 distinct labels; if !(e.op.0) + goto l2 else goto l1. If this seems backwards, that's because it is, + in order to make the 1 pass algorithm work. */ + + LOCAL void +#ifdef KR_headers +exar2(op, e, l1, l2) + int op; + expptr e; + struct Labelblock *l1; + struct Labelblock *l2; +#else +exar2(int op, expptr e, struct Labelblock *l1, struct Labelblock *l2) +#endif +{ + expptr comp; + + comp = mkexpr (op, e, ICON (0)); + p1_if(putx(fixtype(comp))); + exgoto(l1); + p1_else (); + exgoto(l2); + p1else_end (); +} + + +/* exreturn -- return the value in p from a SUBROUTINE call -- used to + implement the alternate return mechanism */ + + void +#ifdef KR_headers +exreturn(p) + register expptr p; +#else +exreturn(register expptr p) +#endif +{ + if(procclass != CLPROC) + warn("RETURN statement in main or block data"); + if(p && (proctype!=TYSUBR || procclass!=CLPROC) ) + { + err("alternate return in nonsubroutine"); + p = 0; + } + + if (p || proctype == TYSUBR) { + if (p == ENULL) p = ICON (0); + p = mkconv (TYLONG, fixtype (p)); + p1_subr_ret (p); + } /* if p || proctype == TYSUBR */ + else + p1_subr_ret((expptr)retslot); +} + + + void +#ifdef KR_headers +exasgoto(labvar) + Namep labvar; +#else +exasgoto(Namep labvar) +#endif +{ + register Addrp p; + + p = mkplace(labvar); + if( ! ISINT(p->vtype) ) + err("assigned goto variable must be integer"); + else { + p1_asgoto (p); + } /* else */ +} diff --git a/tools/connec/src/exec.o b/tools/connec/src/exec.o new file mode 100644 index 0000000000000000000000000000000000000000..ce1d658f3239c25d0092a3d54dc4b2b9090d5cc6 GIT binary patch literal 20960 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 C-nx?j literal 0 HcmV?d00001 diff --git a/tools/connec/src/expr.c b/tools/connec/src/expr.c new file mode 100644 index 0000000..d9f86c0 --- /dev/null +++ b/tools/connec/src/expr.c @@ -0,0 +1,3738 @@ +/**************************************************************** +Copyright 1990 - 1996, 2000-2001 by AT&T, Lucent Technologies and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T, Bell Laboratories, +Lucent or Bellcore or any of their entities not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +AT&T, Lucent and Bellcore disclaim all warranties with regard to +this software, including all implied warranties of +merchantability and fitness. In no event shall AT&T, Lucent or +Bellcore be liable for any special, indirect or consequential +damages or any damages whatsoever resulting from loss of use, +data or profits, whether in an action of contract, negligence or +other tortious action, arising out of or in connection with the +use or performance of this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" + +typedef struct { double dreal, dimag; } dcomplex; + +static void consbinop Argdcl((int, int, Constp, Constp, Constp)); +static void conspower Argdcl((Constp, Constp, long int)); +static void zdiv Argdcl((dcomplex*, dcomplex*, dcomplex*)); +static tagptr mkpower Argdcl((tagptr)); +static tagptr stfcall Argdcl((Namep, struct Listblock*)); + +extern char dflttype[26]; +extern int htype; + +/* little routines to create constant blocks */ + + Constp +#ifdef KR_headers +mkconst(t) + int t; +#else +mkconst(int t) +#endif +{ + Constp p; + + p = ALLOC(Constblock); + p->tag = TCONST; + p->vtype = t; + return(p); +} + + +/* mklogcon -- Make Logical Constant */ + + expptr +#ifdef KR_headers +mklogcon(l) + int l; +#else +mklogcon(int l) +#endif +{ + Constp p; + + p = mkconst(tylog); + p->Const.ci = l; + return( (expptr) p ); +} + + + +/* mkintcon -- Make Integer Constant */ + + expptr +#ifdef KR_headers +mkintcon(l) + ftnint l; +#else +mkintcon(ftnint l) +#endif +{ + Constp p; + + p = mkconst(tyint); + p->Const.ci = l; + return( (expptr) p ); +} + + + + +/* mkaddcon -- Make Address Constant, given integer value */ + + expptr +#ifdef KR_headers +mkaddcon(l) + long l; +#else +mkaddcon(long l) +#endif +{ + Constp p; + + p = mkconst(TYADDR); + p->Const.ci = l; + return( (expptr) p ); +} + + + +/* mkrealcon -- Make Real Constant. The type t is assumed + to be TYREAL or TYDREAL */ + + expptr +#ifdef KR_headers +mkrealcon(t, d) + int t; + char *d; +#else +mkrealcon(int t, char *d) +#endif +{ + Constp p; + + p = mkconst(t); + p->Const.cds[0] = cds(d,CNULL); + p->vstg = 1; + return( (expptr) p ); +} + + +/* mkbitcon -- Make bit constant. Reads the input string, which is + assumed to correctly specify a number in base 2^shift (where shift + is the input parameter). shift may not exceed 4, i.e. only binary, + quad, octal and hex bases may be input. */ + + expptr +#ifdef KR_headers +mkbitcon(shift, leng, s) + int shift; + int leng; + char *s; +#else +mkbitcon(int shift, int leng, char *s) +#endif +{ + Constp p; + unsigned long m, ovfl, x, y, z; + int L32, len; + char buff[100], *s0 = s; +#ifndef NO_LONG_LONG + ULlong u; +#endif + static char *kind[3] = { "Binary", "Hex", "Octal" }; + + p = mkconst(TYLONG); + /* Song and dance to convert to TYQUAD only if ftnint is too small. */ + m = x = y = ovfl = 0; + /* Older C compilers may not know about */ + /* UL suffixes on hex constants... */ + while(--leng >= 0) + if(*s != ' ') { + if (!m) { + z = x; + x = ((x << shift) | hextoi(*s++)) & ff; + if (!((x >> shift) - z)) + continue; + m = (ff << (L32 = 32 - shift)) & ff; + --s; + x = z; + } + ovfl |= y & m; + y = y << shift | (x >> L32); + x = ((x << shift) | hextoi(*s++)) & ff; + } + /* Don't change the type to short for short constants, as + * that is dangerous -- there is no syntax for long constants + * with small values. + */ + p->Const.ci = (ftnint)x; +#ifndef NO_LONG_LONG + if (m) { + if (allow_i8c) { + u = y; + p->Const.ucq = (u << 32) | x; + p->vtype = TYQUAD; + } + else + ovfl = 1; + } +#else + ovfl |= m; +#endif + if (ovfl) { + if (--shift == 3) + shift = 1; + if ((len = (int)leng) > 60) + sprintf(buff, "%s constant '%.60s' truncated.", + kind[shift], s0); + else + sprintf(buff, "%s constant '%.*s' truncated.", + kind[shift], len, s0); + err(buff); + } + return( (expptr) p ); +} + + + + + +/* mkstrcon -- Make string constant. Allocates storage and initializes + the memory for a copy of the input Fortran-string. */ + + expptr +#ifdef KR_headers +mkstrcon(l, v) + int l; + char *v; +#else +mkstrcon(int l, char *v) +#endif +{ + Constp p; + char *s; + + p = mkconst(TYCHAR); + p->vleng = ICON(l); + p->Const.ccp = s = (char *) ckalloc(l+1); + p->Const.ccp1.blanks = 0; + while(--l >= 0) + *s++ = *v++; + *s = '\0'; + return( (expptr) p ); +} + + + +/* mkcxcon -- Make complex contsant. A complex number is a pair of + values, each of which may be integer, real or double. */ + + expptr +#ifdef KR_headers +mkcxcon(realp, imagp) + expptr realp; + expptr imagp; +#else +mkcxcon(expptr realp, expptr imagp) +#endif +{ + int rtype, itype; + Constp p; + + rtype = realp->headblock.vtype; + itype = imagp->headblock.vtype; + + if( ISCONST(realp) && ISNUMERIC(rtype) && ISCONST(imagp) && ISNUMERIC(itype) ) + { + p = mkconst( (rtype==TYDREAL||itype==TYDREAL) + ? TYDCOMPLEX : tycomplex); + if (realp->constblock.vstg || imagp->constblock.vstg) { + p->vstg = 1; + p->Const.cds[0] = ISINT(rtype) + ? string_num("", realp->constblock.Const.ci) + : realp->constblock.vstg + ? realp->constblock.Const.cds[0] + : dtos(realp->constblock.Const.cd[0]); + p->Const.cds[1] = ISINT(itype) + ? string_num("", imagp->constblock.Const.ci) + : imagp->constblock.vstg + ? imagp->constblock.Const.cds[0] + : dtos(imagp->constblock.Const.cd[0]); + } + else { + p->Const.cd[0] = ISINT(rtype) + ? realp->constblock.Const.ci + : realp->constblock.Const.cd[0]; + p->Const.cd[1] = ISINT(itype) + ? imagp->constblock.Const.ci + : imagp->constblock.Const.cd[0]; + } + } + else + { + err("invalid complex constant"); + p = (Constp)errnode(); + } + + frexpr(realp); + frexpr(imagp); + return( (expptr) p ); +} + + +/* errnode -- Allocate a new error block */ + + expptr +errnode(Void) +{ + struct Errorblock *p; + p = ALLOC(Errorblock); + p->tag = TERROR; + p->vtype = TYERROR; + return( (expptr) p ); +} + + + + + +/* mkconv -- Make type conversion. Cast expression p into type t. + Note that casting to a character copies only the first sizeof(char) + bytes. */ + + expptr +#ifdef KR_headers +mkconv(t, p) + int t; + expptr p; +#else +mkconv(int t, expptr p) +#endif +{ + expptr q; + int pt, charwarn = 1; + + if (t >= 100) { + t -= 100; + charwarn = 0; + } + if(t==TYUNKNOWN || t==TYERROR) + badtype("mkconv", t); + pt = p->headblock.vtype; + +/* Casting to the same type is a no-op */ + + if(t == pt) + return(p); + +/* If we're casting a constant which is not in the literal table ... */ + + else if( ISCONST(p) && pt!=TYADDR && pt != TYCHAR + || p->tag == TADDR && p->addrblock.uname_tag == UNAM_CONST) + { +#ifndef NO_LONG_LONG + if (t != TYQUAD && pt != TYQUAD) /*20010820*/ +#endif + if (ISINT(t) && ISINT(pt) || ISREAL(t) && ISREAL(pt)) { + /* avoid trouble with -i2 */ + p->headblock.vtype = t; + return p; + } + q = (expptr) mkconst(t); + consconv(t, &q->constblock, &p->constblock ); + if (p->tag == TADDR) + q->constblock.vstg = p->addrblock.user.kludge.vstg1; + frexpr(p); + } + else { + if (pt == TYCHAR && t != TYADDR && charwarn + && (!halign || p->tag != TADDR + || p->addrblock.uname_tag != UNAM_CONST)) + warn( + "ichar([first char. of] char. string) assumed for conversion to numeric"); + q = opconv(p, t); + } + + if(t == TYCHAR) + q->constblock.vleng = ICON(1); + return(q); +} + + + +/* opconv -- Convert expression p to type t using the main + expression evaluator; returns an OPCONV expression, I think 14-jun-88 mwm */ + + expptr +#ifdef KR_headers +opconv(p, t) + expptr p; + int t; +#else +opconv(expptr p, int t) +#endif +{ + expptr q; + + if (t == TYSUBR) + err("illegal use of subroutine name"); + q = mkexpr(OPCONV, p, ENULL); + q->headblock.vtype = t; + return(q); +} + + + +/* addrof -- Create an ADDR expression operation */ + + expptr +#ifdef KR_headers +addrof(p) + expptr p; +#else +addrof(expptr p) +#endif +{ + return( mkexpr(OPADDR, p, ENULL) ); +} + + + +/* cpexpr - Returns a new copy of input expression p */ + + tagptr +#ifdef KR_headers +cpexpr(p) + tagptr p; +#else +cpexpr(tagptr p) +#endif +{ + tagptr e; + int tag; + chainp ep, pp; + +/* This table depends on the ordering of the T macros, e.g. TNAME */ + + static int blksize[ ] = + { + 0, + sizeof(struct Nameblock), + sizeof(struct Constblock), + sizeof(struct Exprblock), + sizeof(struct Addrblock), + sizeof(struct Primblock), + sizeof(struct Listblock), + sizeof(struct Impldoblock), + sizeof(struct Errorblock) + }; + + if(p == NULL) + return(NULL); + +/* TNAMEs are special, and don't get copied. Each name in the current + symbol table has a unique TNAME structure. */ + + if( (tag = p->tag) == TNAME) + return(p); + + e = cpblock(blksize[p->tag], (char *)p); + + switch(tag) + { + case TCONST: + if(e->constblock.vtype == TYCHAR) + { + e->constblock.Const.ccp = + copyn((int)e->constblock.vleng->constblock.Const.ci+1, + e->constblock.Const.ccp); + e->constblock.vleng = + (expptr) cpexpr(e->constblock.vleng); + } + case TERROR: + break; + + case TEXPR: + e->exprblock.leftp = (expptr) cpexpr(p->exprblock.leftp); + e->exprblock.rightp = (expptr) cpexpr(p->exprblock.rightp); + break; + + case TLIST: + if(pp = p->listblock.listp) + { + ep = e->listblock.listp = + mkchain((char *)cpexpr((tagptr)pp->datap), CHNULL); + for(pp = pp->nextp ; pp ; pp = pp->nextp) + ep = ep->nextp = + mkchain((char *)cpexpr((tagptr)pp->datap), + CHNULL); + } + break; + + case TADDR: + e->addrblock.vleng = (expptr) cpexpr(e->addrblock.vleng); + e->addrblock.memoffset = (expptr)cpexpr(e->addrblock.memoffset); + e->addrblock.istemp = NO; + break; + + case TPRIM: + e->primblock.argsp = (struct Listblock *) + cpexpr((expptr)e->primblock.argsp); + e->primblock.fcharp = (expptr) cpexpr(e->primblock.fcharp); + e->primblock.lcharp = (expptr) cpexpr(e->primblock.lcharp); + break; + + default: + badtag("cpexpr", tag); + } + + return(e); +} + +/* frexpr -- Free expression -- frees up memory used by expression p */ + + void +#ifdef KR_headers +frexpr(p) + tagptr p; +#else +frexpr(tagptr p) +#endif +{ + chainp q; + + if(p == NULL) + return; + + switch(p->tag) + { + case TCONST: + if( ISCHAR(p) ) + { + free( (charptr) (p->constblock.Const.ccp) ); + frexpr(p->constblock.vleng); + } + break; + + case TADDR: + if (p->addrblock.vtype > TYERROR) /* i/o block */ + break; + frexpr(p->addrblock.vleng); + frexpr(p->addrblock.memoffset); + break; + + case TERROR: + break; + +/* TNAME blocks don't get free'd - probably because they're pointed to in + the hash table. 14-Jun-88 -- mwm */ + + case TNAME: + return; + + case TPRIM: + frexpr((expptr)p->primblock.argsp); + frexpr(p->primblock.fcharp); + frexpr(p->primblock.lcharp); + break; + + case TEXPR: + frexpr(p->exprblock.leftp); + if(p->exprblock.rightp) + frexpr(p->exprblock.rightp); + break; + + case TLIST: + for(q = p->listblock.listp ; q ; q = q->nextp) + frexpr((tagptr)q->datap); + frchain( &(p->listblock.listp) ); + break; + + default: + badtag("frexpr", p->tag); + } + + free( (charptr) p ); +} + + void +#ifdef KR_headers +wronginf(np) + Namep np; +#else +wronginf(Namep np) +#endif +{ + int c; + ftnint k; + warn1("fixing wrong type inferred for %.65s", np->fvarname); + np->vinftype = 0; + c = letter(np->fvarname[0]); + if ((np->vtype = impltype[c]) == TYCHAR + && (k = implleng[c])) + np->vleng = ICON(k); + } + +/* fix up types in expression; replace subtrees and convert + names to address blocks */ + + expptr +#ifdef KR_headers +fixtype(p) + tagptr p; +#else +fixtype(tagptr p) +#endif +{ + + if(p == 0) + return(0); + + switch(p->tag) + { + case TCONST: + if(ONEOF(p->constblock.vtype,MSKINT|MSKLOGICAL|MSKADDR| + MSKREAL) ) + return( (expptr) p); + + return( (expptr) putconst((Constp)p) ); + + case TADDR: + p->addrblock.memoffset = fixtype(p->addrblock.memoffset); + return( (expptr) p); + + case TERROR: + return( (expptr) p); + + default: + badtag("fixtype", p->tag); + +/* This case means that fixexpr can't call fixtype with any expr, + only a subexpr of its parameter. */ + + case TEXPR: + if (((Exprp)p)->typefixed) + return (expptr)p; + return( fixexpr((Exprp)p) ); + + case TLIST: + return( (expptr) p ); + + case TPRIM: + if(p->primblock.argsp && p->primblock.namep->vclass!=CLVAR) + { + if(p->primblock.namep->vtype == TYSUBR) + { + err("function invocation of subroutine"); + return( errnode() ); + } + else { + if (p->primblock.namep->vinftype) + wronginf(p->primblock.namep); + return( mkfunct(p) ); + } + } + +/* The lack of args makes p a function name, substring reference + or variable name. */ + + else return mklhs((struct Primblock *) p, keepsubs); + } +} + + + int +#ifdef KR_headers +badchleng(p) + expptr p; +#else +badchleng(expptr p) +#endif +{ + if (!p->headblock.vleng) { + if (p->headblock.tag == TADDR + && p->addrblock.uname_tag == UNAM_NAME) + errstr("bad use of character*(*) variable %.60s", + p->addrblock.user.name->fvarname); + else + err("Bad use of character*(*)"); + return 1; + } + return 0; + } + + + static expptr +#ifdef KR_headers +cplenexpr(p) + expptr p; +#else +cplenexpr(expptr p) +#endif +{ + expptr rv; + + if (badchleng(p)) + return ICON(1); + rv = cpexpr(p->headblock.vleng); + if (ISCONST(p) && p->constblock.vtype == TYCHAR) + rv->constblock.Const.ci += p->constblock.Const.ccp1.blanks; + return rv; + } + + +/* special case tree transformations and cleanups of expression trees. + Parameter p should have a TEXPR tag at its root, else an error is + returned */ + + expptr +#ifdef KR_headers +fixexpr(p) + Exprp p; +#else +fixexpr(Exprp p) +#endif +{ + expptr lp, rp, q; + char *hsave; + int opcode, ltype, rtype, ptype, mtype; + + if( ISERROR(p) || p->typefixed ) + return( (expptr) p ); + else if(p->tag != TEXPR) + badtag("fixexpr", p->tag); + opcode = p->opcode; + +/* First set the types of the left and right subexpressions */ + + lp = p->leftp; + if (!ISCONST(lp) || lp->constblock.vtype != TYCHAR) + lp = p->leftp = fixtype(lp); + ltype = lp->headblock.vtype; + + if(opcode==OPASSIGN && lp->tag!=TADDR) + { + err("left side of assignment must be variable"); + eret: + frexpr((expptr)p); + return( errnode() ); + } + + if(rp = p->rightp) + { + if (!ISCONST(rp) || rp->constblock.vtype != TYCHAR) + rp = p->rightp = fixtype(rp); + rtype = rp->headblock.vtype; + } + else + rtype = 0; + + if(ltype==TYERROR || rtype==TYERROR) + goto eret; + +/* Now work on the whole expression */ + + /* force folding if possible */ + + if( ISCONST(lp) && (rp==NULL || ISCONST(rp)) ) + { + q = opcode == OPCONV && lp->constblock.vtype == p->vtype + ? lp : mkexpr(opcode, lp, rp); + +/* mkexpr is expected to reduce constant expressions */ + + if( ISCONST(q) ) { + p->leftp = p->rightp = 0; + frexpr((expptr)p); + return(q); + } + free( (charptr) q ); /* constants did not fold */ + } + + if( (ptype = cktype(opcode, ltype, rtype)) == TYERROR) + goto eret; + + if (ltype == TYCHAR && ISCONST(lp)) { + if (opcode == OPCONV) { + hsave = halign; + halign = 0; + lp = (expptr)putconst((Constp)lp); + halign = hsave; + } + else + lp = (expptr)putconst((Constp)lp); + p->leftp = lp; + } + if (rtype == TYCHAR && ISCONST(rp)) + p->rightp = rp = (expptr)putconst((Constp)rp); + + switch(opcode) + { + case OPCONCAT: + if(p->vleng == NULL) + p->vleng = mkexpr(OPPLUS, cplenexpr(lp), + cplenexpr(rp) ); + break; + + case OPASSIGN: + if (rtype == TYREAL || ISLOGICAL(ptype) + || rtype == TYDREAL && ltype == TYREAL && !ISCONST(rp)) + break; + case OPPLUSEQ: + case OPSTAREQ: + if(ltype == rtype) + break; + if( ! ISCONST(rp) && ISREAL(ltype) && ISREAL(rtype) ) + break; + if( ISCOMPLEX(ltype) || ISCOMPLEX(rtype) ) + break; + if( ONEOF(ltype, MSKADDR|MSKINT) && ONEOF(rtype, MSKADDR|MSKINT) + && typesize[ltype]>=typesize[rtype] ) + break; + +/* Cast the right hand side to match the type of the expression */ + + p->rightp = fixtype( mkconv(ptype, rp) ); + break; + + case OPSLASH: + if( ISCOMPLEX(rtype) ) + { + p = (Exprp) call2(ptype, + +/* Handle double precision complex variables */ + + (char*)(ptype == TYCOMPLEX ? "c_div" : "z_div"), + mkconv(ptype, lp), mkconv(ptype, rp) ); + break; + } + case OPPLUS: + case OPMINUS: + case OPSTAR: + case OPMOD: + if(ptype==TYDREAL && ( (ltype==TYREAL && ! ISCONST(lp) ) || + (rtype==TYREAL && ! ISCONST(rp) ) )) + break; + if( ISCOMPLEX(ptype) ) + break; + +/* Cast both sides of the expression to match the type of the whole + expression. */ + + if(ltype != ptype && (ltype < TYINT1 || ptype > TYDREAL)) + p->leftp = fixtype(mkconv(ptype,lp)); + if(rtype != ptype && (rtype < TYINT1 || ptype > TYDREAL)) + p->rightp = fixtype(mkconv(ptype,rp)); + break; + + case OPPOWER: + rp = mkpower((expptr)p); + if (rp->tag == TEXPR) + rp->exprblock.typefixed = 1; + return rp; + + case OPLT: + case OPLE: + case OPGT: + case OPGE: + case OPEQ: + case OPNE: + if(ltype == rtype) + break; + if (htype) { + if (ltype == TYCHAR) { + p->leftp = fixtype(mkconv(rtype,lp)); + break; + } + if (rtype == TYCHAR) { + p->rightp = fixtype(mkconv(ltype,rp)); + break; + } + } + mtype = cktype(OPMINUS, ltype, rtype); + if(mtype==TYDREAL && (ltype==TYREAL || rtype==TYREAL)) + break; + if( ISCOMPLEX(mtype) ) + break; + if(ltype != mtype) + p->leftp = fixtype(mkconv(mtype,lp)); + if(rtype != mtype) + p->rightp = fixtype(mkconv(mtype,rp)); + break; + + case OPCONV: + ptype = cktype(OPCONV, p->vtype, ltype); + if(lp->tag==TEXPR && lp->exprblock.opcode==OPCOMMA + && !ISCOMPLEX(ptype)) + { + lp->exprblock.rightp = + fixtype( mkconv(ptype, lp->exprblock.rightp) ); + free( (charptr) p ); + p = (Exprp) lp; + } + break; + + case OPADDR: + if(lp->tag==TEXPR && lp->exprblock.opcode==OPADDR) + Fatal("addr of addr"); + break; + + case OPCOMMA: + case OPQUEST: + case OPCOLON: + break; + + case OPMIN: + case OPMAX: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: + case OPABS: + case OPDABS: + ptype = p->vtype; + break; + + default: + break; + } + + p->vtype = ptype; + p->typefixed = 1; + return((expptr) p); +} + + +/* fix an argument list, taking due care for special first level cases */ + + int +#ifdef KR_headers +fixargs(doput, p0) + int doput; + struct Listblock *p0; +#else +fixargs(int doput, struct Listblock *p0) +#endif + /* doput is true if constants need to be passed by reference */ +{ + chainp p; + tagptr q, t; + int qtag, nargs; + + nargs = 0; + if(p0) + for(p = p0->listp ; p ; p = p->nextp) + { + ++nargs; + q = (tagptr)p->datap; + qtag = q->tag; + if(qtag == TCONST) + { + +/* Call putconst() to store values in a constant table. Since even + constants must be passed by reference, this can optimize on the storage + required */ + + p->datap = doput ? (char *)putconst((Constp)q) + : (char *)q; + continue; + } + +/* Take a function name and turn it into an Addr. This only happens when + nothing else has figured out the function beforehand */ + + if (qtag == TPRIM && q->primblock.argsp == 0) { + if (q->primblock.namep->vclass==CLPROC + && q->primblock.namep->vprocclass != PTHISPROC) { + p->datap = (char *)mkaddr(q->primblock.namep); + continue; + } + + if (q->primblock.namep->vdim != NULL) { + p->datap = (char *)mkscalar(q->primblock.namep); + if ((q->primblock.fcharp||q->primblock.lcharp) + && (q->primblock.namep->vtype != TYCHAR + || q->primblock.namep->vdim)) + sserr(q->primblock.namep); + continue; + } + + if (q->primblock.namep->vdovar + && (t = (tagptr) memversion(q->primblock.namep))) { + p->datap = (char *)fixtype(t); + continue; + } + } + p->datap = (char *)fixtype(q); + } + return(nargs); +} + + + +/* mkscalar -- only called by fixargs above, and by some routines in + io.c */ + + Addrp +#ifdef KR_headers +mkscalar(np) + Namep np; +#else +mkscalar(Namep np) +#endif +{ + Addrp ap; + + vardcl(np); + ap = mkaddr(np); + + /* The prolog causes array arguments to point to the + * (0,...,0) element, unless subscript checking is on. + */ + if( !checksubs && np->vstg==STGARG) + { + struct Dimblock *dp; + dp = np->vdim; + frexpr(ap->memoffset); + ap->memoffset = mkexpr(OPSTAR, + (np->vtype==TYCHAR ? + cpexpr(np->vleng) : + (tagptr)ICON(typesize[np->vtype]) ), + cpexpr(dp->baseoffset) ); + } + return(ap); +} + + + static void +#ifdef KR_headers +adjust_arginfo(np) + Namep np; +#else +adjust_arginfo(Namep np) +#endif + /* adjust arginfo to omit the length arg for the + arg that we now know to be a character-valued + function */ +{ + struct Entrypoint *ep; + chainp args; + Argtypes *at; + + for(ep = entries; ep; ep = ep->entnextp) + for(args = ep->arglist; args; args = args->nextp) + if (np == (Namep)args->datap + && (at = ep->entryname->arginfo)) + --at->nargs; + } + + + expptr +#ifdef KR_headers +mkfunct(p0) + expptr p0; +#else +mkfunct(expptr p0) +#endif +{ + struct Primblock *p = (struct Primblock *)p0; + struct Entrypoint *ep; + Addrp ap; + Extsym *extp; + Namep np; + expptr q; + extern chainp new_procs; + int k, nargs; + int vclass; + + if(p->tag != TPRIM) + return( errnode() ); + + np = p->namep; + vclass = np->vclass; + + + if(vclass == CLUNKNOWN) + { + np->vclass = vclass = CLPROC; + if(np->vstg == STGUNKNOWN) + { + if(np->vtype!=TYSUBR && (k = intrfunct(np->fvarname)) + && (zflag || !(*(struct Intrpacked *)&k).f4 + || dcomplex_seen)) + { + np->vstg = STGINTR; + np->vardesc.varno = k; + np->vprocclass = PINTRINSIC; + } + else + { + extp = mkext(np->fvarname, + addunder(np->cvarname)); + extp->extstg = STGEXT; + np->vstg = STGEXT; + np->vardesc.varno = extp - extsymtab; + np->vprocclass = PEXTERNAL; + } + } + else if(np->vstg==STGARG) + { + if(np->vtype == TYCHAR) { + adjust_arginfo(np); + if (np->vpassed) { + char wbuf[160], *who; + who = np->fvarname; + sprintf(wbuf, "%s%s%s\n\t%s%s%s", + "Character-valued dummy procedure ", + who, " not declared EXTERNAL.", + "Code may be wrong for previous function calls having ", + who, " as a parameter."); + warn(wbuf); + } + } + np->vprocclass = PEXTERNAL; + } + } + + if(vclass != CLPROC) { + if (np->vstg == STGCOMMON) + fatalstr( + "Cannot invoke common variable %.50s as a function.", + np->fvarname); + errstr("%.80s cannot be called.", np->fvarname); + goto error; + } + +/* F77 doesn't allow subscripting of function calls */ + + if(p->fcharp || p->lcharp) + { + err("no substring of function call"); + goto error; + } + impldcl(np); + np->vimpltype = 0; /* invoking as function ==> inferred type */ + np->vcalled = 1; + nargs = fixargs( np->vprocclass!=PINTRINSIC, p->argsp); + + switch(np->vprocclass) + { + case PEXTERNAL: + if(np->vtype == TYUNKNOWN) + { + dclerr("attempt to use untyped function", np); + np->vtype = dflttype[letter(np->fvarname[0])]; + } + ap = mkaddr(np); + if (!extsymtab[np->vardesc.varno].extseen) { + new_procs = mkchain((char *)np, new_procs); + extsymtab[np->vardesc.varno].extseen = 1; + } +call: + q = mkexpr(OPCALL, (expptr)ap, (expptr)p->argsp); + q->exprblock.vtype = np->vtype; + if(np->vleng) + q->exprblock.vleng = (expptr) cpexpr(np->vleng); + break; + + case PINTRINSIC: + q = intrcall(np, p->argsp, nargs); + break; + + case PSTFUNCT: + q = stfcall(np, p->argsp); + break; + + case PTHISPROC: + warn("recursive call"); + +/* entries is the list of multiple entry points */ + + for(ep = entries ; ep ; ep = ep->entnextp) + if(ep->enamep == np) + break; + if(ep == NULL) + Fatal("mkfunct: impossible recursion"); + + ap = builtin(np->vtype, ep->entryname->cextname, -2); + /* the negative last arg prevents adding */ + /* this name to the list of used builtins */ + goto call; + + default: + fatali("mkfunct: impossible vprocclass %d", + (int) (np->vprocclass) ); + } + free( (charptr) p ); + return(q); + +error: + frexpr((expptr)p); + return( errnode() ); +} + + + + static expptr +#ifdef KR_headers +stfcall(np, actlist) + Namep np; + struct Listblock *actlist; +#else +stfcall(Namep np, struct Listblock *actlist) +#endif +{ + chainp actuals; + int nargs; + chainp oactp, formals; + int type; + expptr Ln, Lq, q, q1, rhs, ap; + Namep tnp; + struct Rplblock *rp; + struct Rplblock *tlist; + + if (np->arginfo) { + errstr("statement function %.66s calls itself.", + np->fvarname); + return ICON(0); + } + np->arginfo = (Argtypes *)np; /* arbitrary nonzero value */ + if(actlist) + { + actuals = actlist->listp; + free( (charptr) actlist); + } + else + actuals = NULL; + oactp = actuals; + + nargs = 0; + tlist = NULL; + if( (type = np->vtype) == TYUNKNOWN) + { + dclerr("attempt to use untyped statement function", np); + type = np->vtype = dflttype[letter(np->fvarname[0])]; + } + formals = (chainp) np->varxptr.vstfdesc->datap; + rhs = (expptr) (np->varxptr.vstfdesc->nextp); + + /* copy actual arguments into temporaries */ + while(actuals!=NULL && formals!=NULL) + { + if (!(tnp = (Namep) formals->datap)) { + /* buggy statement function declaration */ + q = ICON(1); + goto done; + } + rp = ALLOC(Rplblock); + rp->rplnp = tnp; + ap = fixtype((tagptr)actuals->datap); + if(tnp->vtype==ap->headblock.vtype && tnp->vtype!=TYCHAR + && (ap->tag==TCONST || ap->tag==TADDR) ) + { + +/* If actuals are constants or variable names, no temporaries are required */ + rp->rplvp = (expptr) ap; + rp->rplxp = NULL; + rp->rpltag = ap->tag; + } + else { + rp->rplvp = (expptr) mktmp(tnp->vtype, tnp->vleng); + rp -> rplxp = NULL; + putexpr ( mkexpr(OPASSIGN, cpexpr(rp->rplvp), ap)); + if((rp->rpltag = rp->rplvp->tag) == TERROR) + err("disagreement of argument types in statement function call"); + } + rp->rplnextp = tlist; + tlist = rp; + actuals = actuals->nextp; + formals = formals->nextp; + ++nargs; + } + + if(actuals!=NULL || formals!=NULL) + err("statement function definition and argument list differ"); + + /* + now push down names involved in formal argument list, then + evaluate rhs of statement function definition in this environment +*/ + + if(tlist) /* put tlist in front of the rpllist */ + { + for(rp = tlist; rp->rplnextp; rp = rp->rplnextp) + ; + rp->rplnextp = rpllist; + rpllist = tlist; + } + +/* So when the expression finally gets evaled, that evaluator must read + from the globl rpllist 14-jun-88 mwm */ + + q = (expptr) mkconv(type, fixtype(cpexpr(rhs)) ); + + /* get length right of character-valued statement functions... */ + if (type == TYCHAR + && (Ln = np->vleng) + && q->tag != TERROR + && (Lq = q->exprblock.vleng) + && (Lq->tag != TCONST + || Ln->constblock.Const.ci != Lq->constblock.Const.ci)) { + q1 = (expptr) mktmp(type, Ln); + putexpr ( mkexpr(OPASSIGN, cpexpr(q1), q)); + q = q1; + } + + /* now generate the tree ( t1=a1, (t2=a2,... , f))))) */ + while(--nargs >= 0) + { + if(rpllist->rplxp) + q = mkexpr(OPCOMMA, rpllist->rplxp, q); + rp = rpllist->rplnextp; + frexpr(rpllist->rplvp); + free((char *)rpllist); + rpllist = rp; + } + done: + frchain( &oactp ); + np->arginfo = 0; + return(q); +} + + +static int replaced; + +/* mkplace -- Figure out the proper storage class for the input name and + return an addrp with the appropriate stuff */ + + Addrp +#ifdef KR_headers +mkplace(np) + Namep np; +#else +mkplace(Namep np) +#endif +{ + Addrp s; + struct Rplblock *rp; + int regn; + + /* is name on the replace list? */ + + for(rp = rpllist ; rp ; rp = rp->rplnextp) + { + if(np == rp->rplnp) + { + replaced = 1; + if(rp->rpltag == TNAME) + { + np = (Namep) (rp->rplvp); + break; + } + else return( (Addrp) cpexpr(rp->rplvp) ); + } + } + + /* is variable a DO index in a register ? */ + + if(np->vdovar && ( (regn = inregister(np)) >= 0) ) + if(np->vtype == TYERROR) + return((Addrp) errnode() ); + else + { + s = ALLOC(Addrblock); + s->tag = TADDR; + s->vstg = STGREG; + s->vtype = TYIREG; + s->memno = regn; + s->memoffset = ICON(0); + s -> uname_tag = UNAM_NAME; + s -> user.name = np; + return(s); + } + + if (np->vclass == CLPROC && np->vprocclass != PTHISPROC) + errstr("external %.60s used as a variable", np->fvarname); + vardcl(np); + return(mkaddr(np)); +} + + static expptr +#ifdef KR_headers +subskept(p, a) + struct Primblock *p; + Addrp a; +#else +subskept(struct Primblock *p, Addrp a) +#endif +{ + expptr ep; + struct Listblock *Lb; + chainp cp; + + if (a->uname_tag != UNAM_NAME) + erri("subskept: uname_tag %d", a->uname_tag); + a->user.name->vrefused = 1; + a->user.name->visused = 1; + a->uname_tag = UNAM_REF; + Lb = (struct Listblock *)cpexpr((tagptr)p->argsp); + for(cp = Lb->listp; cp; cp = cp->nextp) + cp->datap = (char *)putx(fixtype((tagptr)cp->datap)); + if (a->vtype == TYCHAR) { + ep = p->fcharp ? mkexpr(OPMINUS, cpexpr(p->fcharp), ICON(1)) + : ICON(0); + Lb->listp = mkchain((char *)ep, Lb->listp); + } + return (expptr)Lb; + } + + static void +#ifdef KR_headers +substrerr(np) Namep np; +#else +substrerr(Namep np) +#endif +{ + void (*f) Argdcl((const char*, const char*)); + f = checksubs ? errstr : warn1; + (*f)("substring of %.65s is out of bounds.", np->fvarname); + } + + static int doing_vleng; + +/* mklhs -- Compute the actual address of the given expression; account + for array subscripts, stack offset, and substring offsets. The f -> C + translator will need this only to worry about the subscript stuff */ + + expptr +#ifdef KR_headers +mklhs(p, subkeep) + struct Primblock *p; + int subkeep; +#else +mklhs(struct Primblock *p, int subkeep) +#endif +{ + Addrp s; + Namep np; + + if(p->tag != TPRIM) + return( (expptr) p ); + np = p->namep; + + replaced = 0; + s = mkplace(np); + if(s->tag!=TADDR || s->vstg==STGREG) + { + free( (charptr) p ); + return( (expptr) s ); + } + s->parenused = p->parenused; + + /* compute the address modified by subscripts */ + + if (!replaced) + s->memoffset = (subkeep && np->vdim && p->argsp + && (np->vdim->ndim > 1 || np->vtype == TYCHAR + && (!ISCONST(np->vleng) + || np->vleng->constblock.Const.ci != 1))) + ? subskept(p,s) + : mkexpr(OPPLUS, s->memoffset, suboffset(p) ); + frexpr((expptr)p->argsp); + p->argsp = NULL; + + /* now do substring part */ + + if(p->fcharp || p->lcharp) + { + if(np->vtype != TYCHAR) + sserr(np); + else { + if(p->lcharp == NULL) + p->lcharp = (expptr)( + /* s->vleng == 0 only with errors */ + s->vleng ? cpexpr(s->vleng) : ICON(1)); + else if (ISCONST(p->lcharp) + && ISCONST(np->vleng) + && p->lcharp->constblock.Const.ci + > np->vleng->constblock.Const.ci) + substrerr(np); + if(p->fcharp) { + doing_vleng = 1; + s->vleng = fixtype(mkexpr(OPMINUS, + p->lcharp, + mkexpr(OPMINUS, p->fcharp, ICON(1) ))); + doing_vleng = 0; + } + else { + frexpr(s->vleng); + s->vleng = p->lcharp; + } + if (s->memoffset + && ISCONST(s->memoffset) + && s->memoffset->constblock.Const.ci < 0) + substrerr(np); + } + } + + s->vleng = fixtype( s->vleng ); + s->memoffset = fixtype( s->memoffset ); + free( (charptr) p ); + return( (expptr) s ); +} + + + + + +/* deregister -- remove a register allocation from the list; assumes that + names are deregistered in stack order (LIFO order - Last In First Out) */ + + void +#ifdef KR_headers +deregister(np) + Namep np; +#else +deregister(Namep np) +#endif +{ + if(nregvar>0 && regnamep[nregvar-1]==np) + { + --nregvar; + } +} + + + + +/* memversion -- moves a DO index REGISTER into a memory location; other + objects are passed through untouched */ + + Addrp +#ifdef KR_headers +memversion(np) + Namep np; +#else +memversion(Namep np) +#endif +{ + Addrp s; + + if(np->vdovar==NO || (inregister(np)<0) ) + return(NULL); + np->vdovar = NO; + s = mkplace(np); + np->vdovar = YES; + return(s); +} + + + +/* inregister -- looks for the input name in the global list regnamep */ + + int +#ifdef KR_headers +inregister(np) + Namep np; +#else +inregister(Namep np) +#endif +{ + int i; + + for(i = 0 ; i < nregvar ; ++i) + if(regnamep[i] == np) + return( regnum[i] ); + return(-1); +} + + + +/* suboffset -- Compute the offset from the start of the array, given the + subscripts as arguments */ + + expptr +#ifdef KR_headers +suboffset(p) + struct Primblock *p; +#else +suboffset(struct Primblock *p) +#endif +{ + int n; + expptr si, size; + chainp cp; + expptr e, e1, offp, prod; + struct Dimblock *dimp; + expptr sub[MAXDIM+1]; + Namep np; + + np = p->namep; + offp = ICON(0); + n = 0; + if(p->argsp) + for(cp = p->argsp->listp ; cp ; cp = cp->nextp) + { + si = fixtype(cpexpr((tagptr)cp->datap)); + if (!ISINT(si->headblock.vtype)) { + NOEXT("non-integer subscript"); + si = mkconv(TYLONG, si); + } + sub[n++] = si; + if(n > maxdim) + { + erri("more than %d subscripts", maxdim); + break; + } + } + + dimp = np->vdim; + if(n>0 && dimp==NULL) + errstr("subscripts on scalar variable %.68s", np->fvarname); + else if(dimp && dimp->ndim!=n) + errstr("wrong number of subscripts on %.68s", np->fvarname); + else if(n > 0) + { + prod = sub[--n]; + while( --n >= 0) + prod = mkexpr(OPPLUS, sub[n], + mkexpr(OPSTAR, prod, cpexpr(dimp->dims[n].dimsize)) ); + if(checksubs || np->vstg!=STGARG) + prod = mkexpr(OPMINUS, prod, cpexpr(dimp->baseoffset)); + +/* Add in the run-time bounds check */ + + if(checksubs) + prod = subcheck(np, prod); + size = np->vtype == TYCHAR ? + (expptr) cpexpr(np->vleng) : ICON(typesize[np->vtype]); + prod = mkexpr(OPSTAR, prod, size); + offp = mkexpr(OPPLUS, offp, prod); + } + +/* Check for substring indicator */ + + if(p->fcharp && np->vtype==TYCHAR) { + e = p->fcharp; + e1 = mkexpr(OPMINUS, cpexpr(e), ICON(1)); + if (!ISCONST(e) && (e->tag != TPRIM || e->primblock.argsp)) { + e = (expptr)mktmp(TYLONG, ENULL); + putout(putassign(cpexpr(e), e1)); + p->fcharp = mkexpr(OPPLUS, cpexpr(e), ICON(1)); + e1 = e; + } + offp = mkexpr(OPPLUS, offp, e1); + } + return(offp); +} + + + + + expptr +#ifdef KR_headers +subcheck(np, p) + Namep np; + expptr p; +#else +subcheck(Namep np, expptr p) +#endif +{ + struct Dimblock *dimp; + expptr t, checkvar, checkcond, badcall; + + dimp = np->vdim; + if(dimp->nelt == NULL) + return(p); /* don't check arrays with * bounds */ + np->vlastdim = 0; + if( ISICON(p) ) + { + +/* check for negative (constant) offset */ + + if(p->constblock.Const.ci < 0) + goto badsub; + if( ISICON(dimp->nelt) ) + +/* see if constant offset exceeds the array declaration */ + + if(p->constblock.Const.ci < dimp->nelt->constblock.Const.ci) + return(p); + else + goto badsub; + } + +/* We know that the subscript offset p or dimp -> nelt is not a constant. + Now find a register to use for run-time bounds checking */ + + if(p->tag==TADDR && p->addrblock.vstg==STGREG) + { + checkvar = (expptr) cpexpr(p); + t = p; + } + else { + checkvar = (expptr) mktmp(TYLONG, ENULL); + t = mkexpr(OPASSIGN, cpexpr(checkvar), p); + } + checkcond = mkexpr(OPLT, t, cpexpr(dimp->nelt) ); + if( ! ISICON(p) ) + checkcond = mkexpr(OPAND, checkcond, + mkexpr(OPLE, ICON(0), cpexpr(checkvar)) ); + +/* Construct the actual test */ + + badcall = call4(p->headblock.vtype, "s_rnge", + mkstrcon(strlen(np->fvarname), np->fvarname), + mkconv(TYLONG, cpexpr(checkvar)), + mkstrcon(strlen(procname), procname), + ICON(lineno) ); + badcall->exprblock.opcode = OPCCALL; + p = mkexpr(OPQUEST, checkcond, + mkexpr(OPCOLON, checkvar, badcall)); + + return(p); + +badsub: + frexpr(p); + errstr("subscript on variable %s out of range", np->fvarname); + return ( ICON(0) ); +} + + + + + Addrp +#ifdef KR_headers +mkaddr(p) + Namep p; +#else +mkaddr(Namep p) +#endif +{ + Extsym *extp; + Addrp t; + int k; + + switch( p->vstg) + { + case STGAUTO: + if(p->vclass == CLPROC && p->vprocclass == PTHISPROC) + return (Addrp) cpexpr((expptr)xretslot[p->vtype]); + goto other; + + case STGUNKNOWN: + if(p->vclass != CLPROC) + break; /* Error */ + extp = mkext(p->fvarname, addunder(p->cvarname)); + extp->extstg = STGEXT; + p->vstg = STGEXT; + p->vardesc.varno = extp - extsymtab; + p->vprocclass = PEXTERNAL; + if ((extp->exproto || infertypes) + && (p->vtype == TYUNKNOWN || p->vimpltype) + && (k = extp->extype)) + inferdcl(p, k); + + + case STGCOMMON: + case STGEXT: + case STGBSS: + case STGINIT: + case STGEQUIV: + case STGARG: + case STGLENG: + other: + t = ALLOC(Addrblock); + t->tag = TADDR; + + t->vclass = p->vclass; + t->vtype = p->vtype; + t->vstg = p->vstg; + t->memno = p->vardesc.varno; + t->memoffset = ICON(p->voffset); + if (p->vdim) + t->isarray = 1; + if(p->vleng) + { + t->vleng = (expptr) cpexpr(p->vleng); + if( ISICON(t->vleng) ) + t->varleng = t->vleng->constblock.Const.ci; + } + +/* Keep the original name around for the C code generation */ + + t -> uname_tag = UNAM_NAME; + t -> user.name = p; + return(t); + + case STGINTR: + + return ( intraddr (p)); + + case STGSTFUNCT: + + errstr("invalid use of statement function %.64s.", p->fvarname); + return putconst((Constp)ICON(0)); + } + badstg("mkaddr", p->vstg); + /* NOT REACHED */ return 0; +} + + + + +/* mkarg -- create storage for a new parameter. This is called when a + function returns a string (for the return value, which is the first + parameter), or when a variable-length string is passed to a function. */ + + Addrp +#ifdef KR_headers +mkarg(type, argno) + int type; + int argno; +#else +mkarg(int type, int argno) +#endif +{ + Addrp p; + + p = ALLOC(Addrblock); + p->tag = TADDR; + p->vtype = type; + p->vclass = CLVAR; + +/* TYLENG is the type of the field holding the length of a character string */ + + p->vstg = (type==TYLENG ? STGLENG : STGARG); + p->memno = argno; + return(p); +} + + + + +/* mkprim -- Create a PRIM (primary/primitive) block consisting of a + Nameblock (or Paramblock), arguments (actual params or array + subscripts) and substring bounds. Requires that v have lots of + extra (uninitialized) storage, since it could be a paramblock or + nameblock */ + + expptr +#ifdef KR_headers +mkprim(v0, args, substr) + Namep v0; + struct Listblock *args; + chainp substr; +#else +mkprim(Namep v0, struct Listblock *args, chainp substr) +#endif +{ + typedef union { + struct Paramblock paramblock; + struct Nameblock nameblock; + struct Headblock headblock; + } *Primu; + Primu v = (Primu)v0; + struct Primblock *p; + + if(v->headblock.vclass == CLPARAM) + { + +/* v is to be a Paramblock */ + + if(args || substr) + { + errstr("no qualifiers on parameter name %s", + v->paramblock.fvarname); + frexpr((expptr)args); + if(substr) + { + frexpr((tagptr)substr->datap); + frexpr((tagptr)substr->nextp->datap); + frchain(&substr); + } + frexpr((expptr)v); + return( errnode() ); + } + return( (expptr) cpexpr(v->paramblock.paramval) ); + } + + p = ALLOC(Primblock); + p->tag = TPRIM; + p->vtype = v->nameblock.vtype; + +/* v is to be a Nameblock */ + + p->namep = (Namep) v; + p->argsp = args; + if(substr) + { + p->fcharp = (expptr) substr->datap; + p->lcharp = (expptr) substr->nextp->datap; + frchain(&substr); + } + return( (expptr) p); +} + + + +/* vardcl -- attempt to fill out the Name template for variable v. + This function is called on identifiers known to be variables or + recursive references to the same function */ + + void +#ifdef KR_headers +vardcl(v) + Namep v; +#else +vardcl(Namep v) +#endif +{ + struct Dimblock *t; + expptr neltp; + extern int doing_stmtfcn; + + if(v->vclass == CLUNKNOWN) { + v->vclass = CLVAR; + if (v->vinftype) { + v->vtype = TYUNKNOWN; + if (v->vdcldone) { + v->vdcldone = 0; + impldcl(v); + } + } + } + if(v->vdcldone) + return; + if(v->vclass == CLNAMELIST) + return; + + if(v->vtype == TYUNKNOWN) + impldcl(v); + else if(v->vclass!=CLVAR && v->vprocclass!=PTHISPROC) + { + dclerr("used as variable", v); + return; + } + if(v->vstg==STGUNKNOWN) { + if (doing_stmtfcn) { + /* neither declare this variable if its only use */ + /* is in defining a stmt function, nor complain */ + /* that it is never used */ + v->vimpldovar = 1; + return; + } + v->vstg = implstg[ letter(v->fvarname[0]) ]; + v->vimplstg = 1; + } + +/* Compute the actual storage location, i.e. offsets from base addresses, + possibly the stack pointer */ + + switch(v->vstg) + { + case STGBSS: + v->vardesc.varno = ++lastvarno; + break; + case STGAUTO: + if(v->vclass==CLPROC && v->vprocclass==PTHISPROC) + break; + if(t = v->vdim) + if( (neltp = t->nelt) && ISCONST(neltp) ) ; + else + dclerr("adjustable automatic array", v); + break; + + default: + break; + } + v->vdcldone = YES; +} + + + +/* Set the implicit type declaration of parameter p based on its first + letter */ + + void +#ifdef KR_headers +impldcl(p) + Namep p; +#else +impldcl(Namep p) +#endif +{ + int k; + int type; + ftnint leng; + + if(p->vdcldone || (p->vclass==CLPROC && p->vprocclass==PINTRINSIC) ) + return; + if(p->vtype == TYUNKNOWN) + { + k = letter(p->fvarname[0]); + type = impltype[ k ]; + leng = implleng[ k ]; + if(type == TYUNKNOWN) + { + if(p->vclass == CLPROC) + return; + dclerr("attempt to use undefined variable", p); + type = dflttype[k]; + leng = 0; + } + settype(p, type, leng); + p->vimpltype = 1; + } +} + + void +#ifdef KR_headers +inferdcl(np, type) + Namep np; + int type; +#else +inferdcl(Namep np, int type) +#endif +{ + int k = impltype[letter(np->fvarname[0])]; + if (k != type) { + np->vinftype = 1; + np->vtype = type; + frexpr(np->vleng); + np->vleng = 0; + } + np->vimpltype = 0; + np->vinfproc = 1; + } + + LOCAL int +#ifdef KR_headers +zeroconst(e) + expptr e; +#else +zeroconst(expptr e) +#endif +{ + Constp c = (Constp) e; + if (c->tag == TCONST) + switch(c->vtype) { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + return c->Const.ci == 0; +#ifndef NO_LONG_LONG + case TYQUAD: + return c->Const.cq == 0; +#endif + + case TYREAL: + case TYDREAL: + if (c->vstg == 1) + return !strcmp(c->Const.cds[0],"0."); + return c->Const.cd[0] == 0.; + + case TYCOMPLEX: + case TYDCOMPLEX: + if (c->vstg == 1) + return !strcmp(c->Const.cds[0],"0.") + && !strcmp(c->Const.cds[1],"0."); + return c->Const.cd[0] == 0. && c->Const.cd[1] == 0.; + } + return 0; + } + + void +#ifdef KR_headers +paren_used(p) struct Primblock *p; +#else +paren_used(struct Primblock *p) +#endif +{ + Namep np; + + p->parenused = 1; + if (!p->argsp && (np = p->namep) && np->vdim) + warn1("inappropriate operation on unsubscripted array %.50s", + np->fvarname); + } + +#define ICONEQ(z, c) (ISICON(z) && z->constblock.Const.ci==c) +#define COMMUTE { e = lp; lp = rp; rp = e; } + +/* mkexpr -- Make expression, and simplify constant subcomponents (tree + order is not preserved). Assumes that lp is nonempty, and uses + fold() to simplify adjacent constants */ + + expptr +#ifdef KR_headers +mkexpr(opcode, lp, rp) + int opcode; + expptr lp; + expptr rp; +#else +mkexpr(int opcode, expptr lp, expptr rp) +#endif +{ + expptr e, e1; + int etype; + int ltype, rtype; + int ltag, rtag; + long L; + static long divlineno; + + if (parstate < INEXEC) { + + /* Song and dance to get statement functions right */ + /* while catching incorrect type combinations in the */ + /* first executable statement. */ + + ltype = lp->headblock.vtype; + ltag = lp->tag; + if(rp && opcode!=OPCALL && opcode!=OPCCALL) + { + rtype = rp->headblock.vtype; + rtag = rp->tag; + } + else rtype = 0; + + etype = cktype(opcode, ltype, rtype); + if(etype == TYERROR) + goto error; + goto no_fold; + } + + ltype = lp->headblock.vtype; + if (ltype == TYUNKNOWN) { + lp = fixtype(lp); + ltype = lp->headblock.vtype; + } + ltag = lp->tag; + if(rp && opcode!=OPCALL && opcode!=OPCCALL) + { + rtype = rp->headblock.vtype; + if (rtype == TYUNKNOWN) { + rp = fixtype(rp); + rtype = rp->headblock.vtype; + } + rtag = rp->tag; + } + else rtype = 0; + + etype = cktype(opcode, ltype, rtype); + if(etype == TYERROR) + goto error; + + switch(opcode) + { + /* check for multiplication by 0 and 1 and addition to 0 */ + + case OPSTAR: + if( ISCONST(lp) ) + COMMUTE + + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 0) + goto retright; + goto mulop; + } + break; + + case OPSLASH: + case OPMOD: + if( zeroconst(rp) && lineno != divlineno ) { + warn("attempted division by zero"); + divlineno = lineno; + } + if(opcode == OPMOD) + break; + +/* Handle multiplying or dividing by 1, -1 */ + +mulop: + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 1) + goto retleft; + + if(rp->constblock.Const.ci == -1) + { + frexpr(rp); + return( mkexpr(OPNEG, lp, ENULL) ); + } + } + +/* Group all constants together. In particular, + + (x * CONST1) * CONST2 ==> x * (CONST1 * CONST2) + (x * CONST1) / CONST2 ==> x * (CONST1 / CONST2) +*/ + + if (!ISINT(etype) || lp->tag != TEXPR || !lp->exprblock.rightp + || !ISICON(lp->exprblock.rightp)) + break; + + if (lp->exprblock.opcode == OPLSHIFT) { + L = 1 << lp->exprblock.rightp->constblock.Const.ci; + if (opcode == OPSTAR || ISICON(rp) && + !(L % rp->constblock.Const.ci)) { + lp->exprblock.opcode = OPSTAR; + lp->exprblock.rightp->constblock.Const.ci = L; + } + } + + if (lp->exprblock.opcode == OPSTAR) { + if(opcode == OPSTAR) + e = mkexpr(OPSTAR, lp->exprblock.rightp, rp); + else if(ISICON(rp) && + (lp->exprblock.rightp->constblock.Const.ci % + rp->constblock.Const.ci) == 0) + e = mkexpr(OPSLASH, lp->exprblock.rightp, rp); + else break; + + e1 = lp->exprblock.leftp; + free( (charptr) lp ); + return( mkexpr(OPSTAR, e1, e) ); + } + break; + + + case OPPLUS: + if( ISCONST(lp) ) + COMMUTE + goto addop; + + case OPMINUS: + if( ICONEQ(lp, 0) ) + { + frexpr(lp); + return( mkexpr(OPNEG, rp, ENULL) ); + } + + if( ISCONST(rp) && is_negatable((Constp)rp)) + { + opcode = OPPLUS; + consnegop((Constp)rp); + } + +/* Group constants in an addition expression (also subtraction, since the + subtracted value was negated above). In particular, + + (x + CONST1) + CONST2 ==> x + (CONST1 + CONST2) +*/ + +addop: + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 0) + goto retleft; + if( ISPLUSOP(lp) && ISICON(lp->exprblock.rightp) ) + { + e = mkexpr(OPPLUS, lp->exprblock.rightp, rp); + e1 = lp->exprblock.leftp; + free( (charptr) lp ); + return( mkexpr(OPPLUS, e1, e) ); + } + } + if (opcode == OPMINUS && (ISINT(etype) || doing_vleng)) { + /* check for (i [+const]) - (i [+const]) */ + if (lp->tag == TPRIM) + e = lp; + else if (lp->tag == TEXPR && lp->exprblock.opcode == OPPLUS + && lp->exprblock.rightp->tag == TCONST) { + e = lp->exprblock.leftp; + if (e->tag != TPRIM) + break; + } + else + break; + if (e->primblock.argsp) + break; + if (rp->tag == TPRIM) + e1 = rp; + else if (rp->tag == TEXPR && rp->exprblock.opcode == OPPLUS + && rp->exprblock.rightp->tag == TCONST) { + e1 = rp->exprblock.leftp; + if (e1->tag != TPRIM) + break; + } + else + break; + if (e->primblock.namep != e1->primblock.namep + || e1->primblock.argsp) + break; + L = e == lp ? 0 : lp->exprblock.rightp->constblock.Const.ci; + if (e1 != rp) + L -= rp->exprblock.rightp->constblock.Const.ci; + frexpr(lp); + frexpr(rp); + return ICON(L); + } + + break; + + + case OPPOWER: + break; + +/* Eliminate outermost double negations */ + + case OPNEG: + case OPNEG1: + if(ltag==TEXPR && lp->exprblock.opcode==OPNEG) + { + e = lp->exprblock.leftp; + free( (charptr) lp ); + return(e); + } + break; + +/* Eliminate outermost double NOTs */ + + case OPNOT: + if(ltag==TEXPR && lp->exprblock.opcode==OPNOT) + { + e = lp->exprblock.leftp; + free( (charptr) lp ); + return(e); + } + break; + + case OPCALL: + case OPCCALL: + etype = ltype; + if(rp!=NULL && rp->listblock.listp==NULL) + { + free( (charptr) rp ); + rp = NULL; + } + break; + + case OPAND: + case OPOR: + if( ISCONST(lp) ) + COMMUTE + + if( ISCONST(rp) ) + { + if(rp->constblock.Const.ci == 0) + if(opcode == OPOR) + goto retleft; + else + goto retright; + else if(opcode == OPOR) + goto retright; + else + goto retleft; + } + case OPEQV: + case OPNEQV: + + case OPBITAND: + case OPBITOR: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + case OPBITTEST: + case OPBITCLR: + case OPBITSET: +#ifdef TYQUAD + case OPQBITCLR: + case OPQBITSET: +#endif + + case OPLT: + case OPGT: + case OPLE: + case OPGE: + case OPEQ: + case OPNE: + + case OPCONCAT: + break; + case OPMIN: + case OPMAX: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: + + case OPASSIGN: + case OPASSIGNI: + case OPPLUSEQ: + case OPSTAREQ: + case OPMINUSEQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + + case OPCONV: + case OPADDR: + case OPWHATSIN: + + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: + case OPDOT: + case OPARROW: + case OPIDENTITY: + case OPCHARCAST: + case OPABS: + case OPDABS: + break; + + default: + badop("mkexpr", opcode); + } + + no_fold: + e = (expptr) ALLOC(Exprblock); + e->exprblock.tag = TEXPR; + e->exprblock.opcode = opcode; + e->exprblock.vtype = etype; + e->exprblock.leftp = lp; + e->exprblock.rightp = rp; + if(ltag==TCONST && (rp==0 || rtag==TCONST) ) + e = fold(e); + return(e); + +retleft: + frexpr(rp); + if (lp->tag == TPRIM) + paren_used(&lp->primblock); + return(lp); + +retright: + frexpr(lp); + if (rp->tag == TPRIM) + paren_used(&rp->primblock); + return(rp); + +error: + frexpr(lp); + if(rp && opcode!=OPCALL && opcode!=OPCCALL) + frexpr(rp); + return( errnode() ); +} + +#define ERR(s) { errs = s; goto error; } + +/* cktype -- Check and return the type of the expression */ + + int +#ifdef KR_headers +cktype(op, lt, rt) + int op; + int lt; + int rt; +#else +cktype(int op, int lt, int rt) +#endif +{ + char *errs; + + if(lt==TYERROR || rt==TYERROR) + goto error1; + + if(lt==TYUNKNOWN) + return(TYUNKNOWN); + if(rt==TYUNKNOWN) + +/* If not unary operation, return UNKNOWN */ + + if(!is_unary_op (op) && op != OPCALL && op != OPCCALL) + return(TYUNKNOWN); + + switch(op) + { + case OPPLUS: + case OPMINUS: + case OPSTAR: + case OPSLASH: + case OPPOWER: + case OPMOD: + if( ISNUMERIC(lt) && ISNUMERIC(rt) ) + return( maxtype(lt, rt) ); + ERR("nonarithmetic operand of arithmetic operator") + + case OPNEG: + case OPNEG1: + if( ISNUMERIC(lt) ) + return(lt); + ERR("nonarithmetic operand of negation") + + case OPNOT: + if(ISLOGICAL(lt)) + return(lt); + ERR("NOT of nonlogical") + + case OPAND: + case OPOR: + case OPEQV: + case OPNEQV: + if(ISLOGICAL(lt) && ISLOGICAL(rt)) + return( maxtype(lt, rt) ); + ERR("nonlogical operand of logical operator") + + case OPLT: + case OPGT: + case OPLE: + case OPGE: + case OPEQ: + case OPNE: + if(lt==TYCHAR || rt==TYCHAR || ISLOGICAL(lt) || ISLOGICAL(rt)) + { + if(lt != rt){ + if (htype + && (lt == TYCHAR && ISNUMERIC(rt) + || rt == TYCHAR && ISNUMERIC(lt))) + return TYLOGICAL; + ERR("illegal comparison") + } + } + + else if( ISCOMPLEX(lt) || ISCOMPLEX(rt) ) + { + if(op!=OPEQ && op!=OPNE) + ERR("order comparison of complex data") + } + + else if( ! ISNUMERIC(lt) || ! ISNUMERIC(rt) ) + ERR("comparison of nonarithmetic data") + case OPBITTEST: + return(TYLOGICAL); + + case OPCONCAT: + if(lt==TYCHAR && rt==TYCHAR) + return(TYCHAR); + ERR("concatenation of nonchar data") + + case OPCALL: + case OPCCALL: + case OPIDENTITY: + return(lt); + + case OPADDR: + case OPCHARCAST: + return(TYADDR); + + case OPCONV: + if(rt == 0) + return(0); + if(lt==TYCHAR && ISINT(rt) ) + return(TYCHAR); + if (ISLOGICAL(lt) && ISLOGICAL(rt) + || ISINT(lt) && rt == TYCHAR) + return lt; + case OPASSIGN: + case OPASSIGNI: + case OPMINUSEQ: + case OPPLUSEQ: + case OPSTAREQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + if (ISLOGICAL(lt) && ISLOGICAL(rt) && op == OPASSIGN) + return lt; + if(lt==TYCHAR || rt==TYCHAR || ISLOGICAL(lt) || ISLOGICAL(rt)) + if((op!=OPASSIGN && op != OPPLUSEQ && op != OPMINUSEQ) + || (lt!=rt)) + { + ERR("impossible conversion") + } + return(lt); + + case OPMIN: + case OPMAX: + case OPDMIN: + case OPDMAX: + case OPMIN2: + case OPMAX2: + case OPBITOR: + case OPBITAND: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + case OPWHATSIN: + case OPABS: + case OPDABS: + return(lt); + + case OPBITCLR: + case OPBITSET: +#ifdef TYQUAD0 + case OPQBITCLR: + case OPQBITSET: +#endif + if (lt < TYLONG) + lt = TYLONG; + return(lt); +#ifndef NO_LONG_LONG + case OPQBITCLR: + case OPQBITSET: + return TYQUAD; +#endif + + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: /* Only checks the rightmost type because + of C language definition (rightmost + comma-expr is the value of the expr) */ + return(rt); + + case OPDOT: + case OPARROW: + return (lt); + default: + badop("cktype", op); + } +error: + err(errs); +error1: + return(TYERROR); +} + + static void +intovfl(Void) +{ err("overflow simplifying integer constants."); } + +#ifndef NO_LONG_LONG + static void +#ifdef KR_headers +LRget(Lp, Rp, lp, rp) Llong *Lp, *Rp; expptr lp, rp; +#else +LRget(Llong *Lp, Llong *Rp, expptr lp, expptr rp) +#endif +{ + if (lp->headblock.vtype == TYQUAD) + *Lp = lp->constblock.Const.cq; + else + *Lp = lp->constblock.Const.ci; + if (rp->headblock.vtype == TYQUAD) + *Rp = rp->constblock.Const.cq; + else + *Rp = rp->constblock.Const.ci; + } +#endif /*NO_LONG_LONG*/ + +/* fold -- simplifies constant expressions; it assumes that e -> leftp and + e -> rightp are TCONST or NULL */ + + expptr +#ifdef KR_headers +fold(e) + expptr e; +#else +fold(expptr e) +#endif +{ + Constp p; + expptr lp, rp; + int etype, mtype, ltype, rtype, opcode; + ftnint i, bl, ll, lr; + char *q, *s; + struct Constblock lcon, rcon; + ftnint L; + double d; +#ifndef NO_LONG_LONG + Llong LL, LR; +#endif + + opcode = e->exprblock.opcode; + etype = e->exprblock.vtype; + + lp = e->exprblock.leftp; + ltype = lp->headblock.vtype; + rp = e->exprblock.rightp; + + if(rp == 0) + switch(opcode) + { + case OPNOT: +#ifndef NO_LONG_LONG + if (ltype == TYQUAD) + lp->constblock.Const.cq = ! lp->constblock.Const.cq; + else +#endif + lp->constblock.Const.ci = ! lp->constblock.Const.ci; + retlp: + e->exprblock.leftp = 0; + frexpr(e); + return(lp); + + case OPBITNOT: +#ifndef NO_LONG_LONG + if (ltype == TYQUAD) + lp->constblock.Const.cq = ~ lp->constblock.Const.cq; + else +#endif + lp->constblock.Const.ci = ~ lp->constblock.Const.ci; + goto retlp; + + case OPNEG: + case OPNEG1: + consnegop((Constp)lp); + goto retlp; + + case OPCONV: + case OPADDR: + return(e); + + case OPABS: + case OPDABS: + switch(ltype) { + case TYINT1: + case TYSHORT: + case TYLONG: + if ((L = lp->constblock.Const.ci) < 0) { + lp->constblock.Const.ci = -L; + if (L != -lp->constblock.Const.ci) + intovfl(); + } + goto retlp; +#ifndef NO_LONG_LONG + case TYQUAD: + if ((LL = lp->constblock.Const.cq) < 0) { + lp->constblock.Const.cq = -LL; + if (LL != -lp->constblock.Const.cq) + intovfl(); + } + goto retlp; +#endif + case TYREAL: + case TYDREAL: + if (lp->constblock.vstg) { + s = lp->constblock.Const.cds[0]; + if (*s == '-') + lp->constblock.Const.cds[0] = s + 1; + goto retlp; + } + if ((d = lp->constblock.Const.cd[0]) < 0.) + lp->constblock.Const.cd[0] = -d; + case TYCOMPLEX: + case TYDCOMPLEX: + return e; /* lazy way out */ + } + default: + badop("fold", opcode); + } + + rtype = rp->headblock.vtype; + + p = ALLOC(Constblock); + p->tag = TCONST; + p->vtype = etype; + p->vleng = e->exprblock.vleng; + + switch(opcode) + { + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: + goto ereturn; + + case OPAND: + p->Const.ci = lp->constblock.Const.ci && + rp->constblock.Const.ci; + break; + + case OPOR: + p->Const.ci = lp->constblock.Const.ci || + rp->constblock.Const.ci; + break; + + case OPEQV: + p->Const.ci = lp->constblock.Const.ci == + rp->constblock.Const.ci; + break; + + case OPNEQV: + p->Const.ci = lp->constblock.Const.ci != + rp->constblock.Const.ci; + break; + + case OPBITAND: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL & LR; + } + else +#endif + p->Const.ci = lp->constblock.Const.ci & + rp->constblock.Const.ci; + break; + + case OPBITOR: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL | LR; + } + else +#endif + p->Const.ci = lp->constblock.Const.ci | + rp->constblock.Const.ci; + break; + + case OPBITXOR: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL ^ LR; + } + else +#endif + p->Const.ci = lp->constblock.Const.ci ^ + rp->constblock.Const.ci; + break; + + case OPLSHIFT: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL << (int)LR; + if (p->Const.cq >> (int)LR != LL) + intovfl(); + break; + } +#endif + p->Const.ci = lp->constblock.Const.ci << + rp->constblock.Const.ci; + if ((((unsigned long)p->Const.ci) >> rp->constblock.Const.ci) + != lp->constblock.Const.ci) + intovfl(); + break; + + case OPRSHIFT: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL >> (int)LR; + } + else +#endif + p->Const.ci = (unsigned long)lp->constblock.Const.ci >> + rp->constblock.Const.ci; + break; + + case OPBITTEST: +#ifndef NO_LONG_LONG + if (ltype == TYQUAD) + p->Const.ci = (lp->constblock.Const.cq & + 1LL << rp->constblock.Const.ci) != 0; + else +#endif + p->Const.ci = (lp->constblock.Const.ci & + 1L << rp->constblock.Const.ci) != 0; + break; + + case OPBITCLR: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL & ~(1LL << (int)LR); + } + else +#endif + p->Const.ci = lp->constblock.Const.ci & + ~(1L << rp->constblock.Const.ci); + break; + + case OPBITSET: +#ifndef NO_LONG_LONG + if (etype == TYQUAD) { + LRget(&LL, &LR, lp, rp); + p->Const.cq = LL | (1LL << (int)LR); + } + else +#endif + p->Const.ci = lp->constblock.Const.ci | + 1L << rp->constblock.Const.ci; + break; + + case OPCONCAT: + ll = lp->constblock.vleng->constblock.Const.ci; + lr = rp->constblock.vleng->constblock.Const.ci; + bl = lp->constblock.Const.ccp1.blanks; + p->Const.ccp = q = (char *) ckalloc(ll+lr+bl); + p->Const.ccp1.blanks = rp->constblock.Const.ccp1.blanks; + p->vleng = ICON(ll+lr+bl); + s = lp->constblock.Const.ccp; + for(i = 0 ; i < ll ; ++i) + *q++ = *s++; + for(i = 0 ; i < bl ; i++) + *q++ = ' '; + s = rp->constblock.Const.ccp; + for(i = 0; i < lr; ++i) + *q++ = *s++; + break; + + + case OPPOWER: + if( !ISINT(rtype) + || rp->constblock.Const.ci < 0 && zeroconst(lp)) + goto ereturn; + conspower(p, (Constp)lp, rp->constblock.Const.ci); + break; + + case OPSLASH: + if (zeroconst(rp)) + goto ereturn; + /* no break */ + + default: + if(ltype == TYCHAR) + { + lcon.Const.ci = cmpstr(lp->constblock.Const.ccp, + rp->constblock.Const.ccp, + lp->constblock.vleng->constblock.Const.ci, + rp->constblock.vleng->constblock.Const.ci); + rcon.Const.ci = 0; + mtype = tyint; + } + else { + mtype = maxtype(ltype, rtype); + consconv(mtype, &lcon, &lp->constblock); + consconv(mtype, &rcon, &rp->constblock); + } + consbinop(opcode, mtype, p, &lcon, &rcon); + break; + } + + frexpr(e); + return( (expptr) p ); + ereturn: + free((char *)p); + return e; +} + + + +/* assign constant l = r , doing coercion */ + + void +#ifdef KR_headers +consconv(lt, lc, rc) + int lt; + Constp lc; + Constp rc; +#else +consconv(int lt, Constp lc, Constp rc) +#endif +{ + int rt = rc->vtype; + union Constant *lv = &lc->Const, *rv = &rc->Const; + + lc->vtype = lt; + if (ONEOF(lt, MSKREAL|MSKCOMPLEX) && ONEOF(rt, MSKREAL|MSKCOMPLEX)) { + memcpy((char *)lv, (char *)rv, sizeof(union Constant)); + lc->vstg = rc->vstg; + if (ISCOMPLEX(lt) && ISREAL(rt)) { + if (rc->vstg) + lv->cds[1] = cds("0",CNULL); + else + lv->cd[1] = 0.; + } + return; + } + lc->vstg = 0; + + switch(lt) + { + +/* Casting to character means just copying the first sizeof (character) + bytes into a new 1 character string. This is weird. */ + + case TYCHAR: + *(lv->ccp = (char *) ckalloc(1)) = (char)rv->ci; + lv->ccp1.blanks = 0; + break; + + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + if(rt == TYCHAR) + lv->ci = rv->ccp[0]; + else if( ISINT(rt) ) { +#ifndef NO_LONG_LONG + if (rt == TYQUAD) + lv->ci = rv->cq; + else +#endif + lv->ci = rv->ci; + } + else lv->ci = (ftnint)(rc->vstg + ? atof(rv->cds[0]) : rv->cd[0]); + + break; +#ifndef NO_LONG_LONG + case TYQUAD: + if(rt == TYCHAR) + lv->cq = rv->ccp[0]; + else if( ISINT(rt) ) { + if (rt == TYQUAD) + lv->cq = rv->cq; + else + lv->cq = rv->ci; + } + else lv->cq = (ftnint)(rc->vstg + ? atof(rv->cds[0]) : rv->cd[0]); + + break; +#endif + + case TYCOMPLEX: + case TYDCOMPLEX: + lv->cd[1] = 0.; + + case TYREAL: + case TYDREAL: +#ifndef NO_LONG_LONG + if (rt == TYQUAD) + lv->cd[0] = rv->cq; + else +#endif + lv->cd[0] = rv->ci; + break; + + case TYLOGICAL: + case TYLOGICAL1: + case TYLOGICAL2: + lv->ci = rv->ci; + break; + } +} + + + +/* Negate constant value -- changes the input node's value */ + + void +#ifdef KR_headers +consnegop(p) + Constp p; +#else +consnegop(Constp p) +#endif +{ + char *s; + ftnint L; +#ifndef NO_LONG_LONG + Llong LL; +#endif + + if (p->vstg) { + /* 20010820: comment out "*s == '0' ? s :" to preserve */ + /* the sign of zero */ + if (ISCOMPLEX(p->vtype)) { + s = p->Const.cds[1]; + p->Const.cds[1] = *s == '-' ? s+1 + : /* *s == '0' ? s : */ s-1; + } + s = p->Const.cds[0]; + p->Const.cds[0] = *s == '-' ? s+1 + : /* *s == '0' ? s : */ s-1; + return; + } + switch(p->vtype) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + p->Const.ci = -(L = p->Const.ci); + if (L != -p->Const.ci) + intovfl(); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + p->Const.cq = -(LL = p->Const.cq); + if (LL != -p->Const.cq) + intovfl(); + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + p->Const.cd[1] = - p->Const.cd[1]; + /* fall through and do the real parts */ + case TYREAL: + case TYDREAL: + p->Const.cd[0] = - p->Const.cd[0]; + break; + default: + badtype("consnegop", p->vtype); + } +} + + + +/* conspower -- Expand out an exponentiation */ + + LOCAL void +#ifdef KR_headers +conspower(p, ap, n) + Constp p; + Constp ap; + ftnint n; +#else +conspower(Constp p, Constp ap, ftnint n) +#endif +{ + union Constant *powp = &p->Const; + int type; + struct Constblock x, x0; + + if (n == 1) { + memcpy((char *)powp, (char *)&ap->Const, sizeof(ap->Const)); + return; + } + + switch(type = ap->vtype) /* pow = 1 */ + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + powp->ci = 1; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + powp->cq = 1; + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + powp->cd[1] = 0; + case TYREAL: + case TYDREAL: + powp->cd[0] = 1; + break; + default: + badtype("conspower", type); + } + + if(n == 0) + return; + switch(type) /* x0 = ap */ + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + x0.Const.ci = ap->Const.ci; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + x0.Const.cq = ap->Const.cq; + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + x0.Const.cd[1] = + ap->vstg ? atof(ap->Const.cds[1]) : ap->Const.cd[1]; + case TYREAL: + case TYDREAL: + x0.Const.cd[0] = + ap->vstg ? atof(ap->Const.cds[0]) : ap->Const.cd[0]; + break; + } + x0.vtype = type; + x0.vstg = 0; + if(n < 0) + { + n = -n; + if( ISINT(type) ) + { + switch(ap->Const.ci) { + case 0: + err("0 ** negative number"); + return; + case 1: + case -1: + goto mult; + } + err("integer ** negative number"); + return; + } + else if (!x0.Const.cd[0] + && (!ISCOMPLEX(type) || !x0.Const.cd[1])) { + err("0.0 ** negative number"); + return; + } + consbinop(OPSLASH, type, &x, p, &x0); + } + else + mult: consbinop(OPSTAR, type, &x, p, &x0); + + for( ; ; ) + { + if(n & 01) + consbinop(OPSTAR, type, p, p, &x); + if(n >>= 1) + consbinop(OPSTAR, type, &x, &x, &x); + else + break; + } +} + + + +/* do constant operation cp = a op b -- assumes that ap and bp have data + matching the input type */ + + LOCAL void +#ifdef KR_headers +consbinop(opcode, type, cpp, app, bpp) + int opcode; + int type; + Constp cpp; + Constp app; + Constp bpp; +#else +consbinop(int opcode, int type, Constp cpp, Constp app, Constp bpp) +#endif +{ + union Constant *ap = &app->Const, + *bp = &bpp->Const, + *cp = &cpp->Const; + ftnint k; + double ad[2], bd[2], temp; + ftnint a, b; +#ifndef NO_LONG_LONG + Llong aL, bL; +#endif + + cpp->vstg = 0; + + if (ONEOF(type, MSKREAL|MSKCOMPLEX)) { + ad[0] = app->vstg ? atof(ap->cds[0]) : ap->cd[0]; + bd[0] = bpp->vstg ? atof(bp->cds[0]) : bp->cd[0]; + if (ISCOMPLEX(type)) { + ad[1] = app->vstg ? atof(ap->cds[1]) : ap->cd[1]; + bd[1] = bpp->vstg ? atof(bp->cds[1]) : bp->cd[1]; + } + } + switch(opcode) + { + case OPPLUS: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = ap->ci + bp->ci; + if (ap->ci != cp->ci - bp->ci) + intovfl(); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = ap->cq + bp->cq; + if (ap->cq != cp->cq - bp->cq) + intovfl(); + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + cp->cd[1] = ad[1] + bd[1]; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] + bd[0]; + break; + } + break; + + case OPMINUS: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = ap->ci - bp->ci; + if (ap->ci != bp->ci + cp->ci) + intovfl(); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = ap->cq - bp->cq; + if (ap->cq != bp->cq + cp->cq) + intovfl(); + break; +#endif + case TYCOMPLEX: + case TYDCOMPLEX: + cp->cd[1] = ad[1] - bd[1]; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] - bd[0]; + break; + } + break; + + case OPSTAR: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = (a = ap->ci) * (b = bp->ci); + if (a && cp->ci / a != b) + intovfl(); + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = (aL = ap->cq) * (bL = bp->cq); + if (aL && cp->cq / aL != bL) + intovfl(); + break; +#endif + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] * bd[0]; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + temp = ad[0] * bd[0] - ad[1] * bd[1] ; + cp->cd[1] = ad[0] * bd[1] + ad[1] * bd[0] ; + cp->cd[0] = temp; + break; + } + break; + case OPSLASH: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = ap->ci / bp->ci; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = ap->cq / bp->cq; + break; +#endif + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] / bd[0]; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + zdiv((dcomplex*)cp, (dcomplex*)ad, (dcomplex*)bd); + break; + } + break; + + case OPMOD: + if( ISINT(type) ) + { +#ifndef NO_LONG_LONG + if (type == TYQUAD) + cp->cq = ap->cq % bp->cq; + else +#endif + cp->ci = ap->ci % bp->ci; + break; + } + else + Fatal("inline mod of noninteger"); + + case OPMIN2: + case OPDMIN: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = ap->ci <= bp->ci ? ap->ci : bp->ci; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = ap->cq <= bp->cq ? ap->cq : bp->cq; + break; +#endif + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] <= bd[0] ? ad[0] : bd[0]; + break; + default: + Fatal("inline min of exected type"); + } + break; + + case OPMAX2: + case OPDMAX: + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + cp->ci = ap->ci >= bp->ci ? ap->ci : bp->ci; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + cp->cq = ap->cq >= bp->cq ? ap->cq : bp->cq; + break; +#endif + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] >= bd[0] ? ad[0] : bd[0]; + break; + default: + Fatal("inline max of exected type"); + } + break; + + default: /* relational ops */ + switch(type) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + if(ap->ci < bp->ci) + k = -1; + else if(ap->ci == bp->ci) + k = 0; + else k = 1; + break; +#ifndef NO_LONG_LONG + case TYQUAD: + if(ap->cq < bp->cq) + k = -1; + else if(ap->cq == bp->cq) + k = 0; + else k = 1; + break; +#endif + case TYREAL: + case TYDREAL: + if(ad[0] < bd[0]) + k = -1; + else if(ad[0] == bd[0]) + k = 0; + else k = 1; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if(ad[0] == bd[0] && + ad[1] == bd[1] ) + k = 0; + else k = 1; + break; + case TYLOGICAL: + k = ap->ci - bp->ci; + } + + switch(opcode) + { + case OPEQ: + cp->ci = (k == 0); + break; + case OPNE: + cp->ci = (k != 0); + break; + case OPGT: + cp->ci = (k == 1); + break; + case OPLT: + cp->ci = (k == -1); + break; + case OPGE: + cp->ci = (k >= 0); + break; + case OPLE: + cp->ci = (k <= 0); + break; + } + break; + } +} + + + +/* conssgn - returns the sign of a Fortran constant */ + + int +#ifdef KR_headers +conssgn(p) + expptr p; +#else +conssgn(expptr p) +#endif +{ + char *s; + + if( ! ISCONST(p) ) + Fatal( "sgn(nonconstant)" ); + + switch(p->headblock.vtype) + { + case TYINT1: + case TYSHORT: + case TYLONG: +#ifdef TYQUAD0 + case TYQUAD: +#endif + if(p->constblock.Const.ci > 0) return(1); + if(p->constblock.Const.ci < 0) return(-1); + return(0); +#ifndef NO_LONG_LONG + case TYQUAD: + if(p->constblock.Const.cq > 0) return(1); + if(p->constblock.Const.cq < 0) return(-1); + return(0); +#endif + + case TYREAL: + case TYDREAL: + if (p->constblock.vstg) { + s = p->constblock.Const.cds[0]; + if (*s == '-') + return -1; + if (*s == '0') + return 0; + return 1; + } + if(p->constblock.Const.cd[0] > 0) return(1); + if(p->constblock.Const.cd[0] < 0) return(-1); + return(0); + + +/* The sign of a complex number is 0 iff the number is 0 + 0i, else it's 1 */ + + case TYCOMPLEX: + case TYDCOMPLEX: + if (p->constblock.vstg) + return *p->constblock.Const.cds[0] != '0' + && *p->constblock.Const.cds[1] != '0'; + return(p->constblock.Const.cd[0]!=0 || p->constblock.Const.cd[1]!=0); + + default: + badtype( "conssgn", p->constblock.vtype); + } + /* NOT REACHED */ return 0; +} + +char *powint[ ] = { + "pow_ii", +#ifdef TYQUAD + "pow_qq", +#endif + "pow_ri", "pow_di", "pow_ci", "pow_zi" }; + + LOCAL expptr +#ifdef KR_headers +mkpower(p) + expptr p; +#else +mkpower(expptr p) +#endif +{ + expptr q, lp, rp; + int ltype, rtype, mtype, tyi; + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + ltype = lp->headblock.vtype; + rtype = rp->headblock.vtype; + + if (lp->tag == TADDR) + lp->addrblock.parenused = 0; + + if (rp->tag == TADDR) + rp->addrblock.parenused = 0; + + if(ISICON(rp)) + { + if(rp->constblock.Const.ci == 0) + { + frexpr(p); + if( ISINT(ltype) ) + return( ICON(1) ); + else if (ISREAL (ltype)) + return mkconv (ltype, ICON (1)); + else + return( (expptr) putconst((Constp) + mkconv(ltype, ICON(1))) ); + } + if(rp->constblock.Const.ci < 0) + { + if( ISINT(ltype) ) + { + frexpr(p); + err("integer**negative"); + return( errnode() ); + } + rp->constblock.Const.ci = - rp->constblock.Const.ci; + p->exprblock.leftp = lp + = fixexpr((Exprp)mkexpr(OPSLASH, ICON(1), lp)); + } + if(rp->constblock.Const.ci == 1) + { + frexpr(rp); + free( (charptr) p ); + return(lp); + } + + if( ONEOF(ltype, MSKINT|MSKREAL) ) { + p->exprblock.vtype = ltype; + return(p); + } + } + if( ISINT(rtype) ) + { + if(ltype==TYSHORT && rtype==TYSHORT && (!ISCONST(lp) || tyint==TYSHORT) ) + q = call2(TYSHORT, "pow_hh", lp, rp); + else { + if(ONEOF(ltype,M(TYINT1)|M(TYSHORT))) + { + ltype = TYLONG; + lp = mkconv(TYLONG,lp); + } +#ifdef TYQUAD + if (ltype == TYQUAD) + rp = mkconv(TYQUAD,rp); + else +#endif + rp = mkconv(TYLONG,rp); + if (ISCONST(rp)) { + tyi = tyint; + tyint = TYLONG; + rp = (expptr)putconst((Constp)rp); + tyint = tyi; + } + q = call2(ltype, powint[ltype-TYLONG], lp, rp); + } + } + else if( ISREAL( (mtype = maxtype(ltype,rtype)) )) { + extern int callk_kludge; + callk_kludge = TYDREAL; + q = call2(mtype, "pow_dd", mkconv(TYDREAL,lp), mkconv(TYDREAL,rp)); + callk_kludge = 0; + } + else { + q = call2(TYDCOMPLEX, "pow_zz", + mkconv(TYDCOMPLEX,lp), mkconv(TYDCOMPLEX,rp)); + if(mtype == TYCOMPLEX) + q = mkconv(TYCOMPLEX, q); + } + free( (charptr) p ); + return(q); +} + + +/* Complex Division. Same code as in Runtime Library +*/ + + + LOCAL void +#ifdef KR_headers +zdiv(c, a, b) + dcomplex *c; + dcomplex *a; + dcomplex *b; +#else +zdiv(dcomplex *c, dcomplex *a, dcomplex *b) +#endif +{ + double ratio, den; + double abr, abi; + + if( (abr = b->dreal) < 0.) + abr = - abr; + if( (abi = b->dimag) < 0.) + abi = - abi; + if( abr <= abi ) + { + if(abi == 0) + Fatal("complex division by zero"); + ratio = b->dreal / b->dimag ; + den = b->dimag * (1 + ratio*ratio); + c->dreal = (a->dreal*ratio + a->dimag) / den; + c->dimag = (a->dimag*ratio - a->dreal) / den; + } + + else + { + ratio = b->dimag / b->dreal ; + den = b->dreal * (1 + ratio*ratio); + c->dreal = (a->dreal + a->dimag*ratio) / den; + c->dimag = (a->dimag - a->dreal*ratio) / den; + } +} + + + void +#ifdef KR_headers +sserr(np) Namep np; +#else +sserr(Namep np) +#endif +{ + errstr(np->vtype == TYCHAR + ? "substring of character array %.70s" + : "substring of noncharacter %.73s", np->fvarname); + } diff --git a/tools/connec/src/expr.o b/tools/connec/src/expr.o new file mode 100644 index 0000000000000000000000000000000000000000..180264bd024942d179d6fa89edd97ef47c5ab474 GIT binary patch literal 67056 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 L_bdL_jQ{@t6jYb! literal 0 HcmV?d00001 diff --git a/tools/connec/src/f2c b/tools/connec/src/f2c new file mode 100755 index 0000000000000000000000000000000000000000..fb27b79ef3ebb6b0728bbc6c9a3166c4301c821c GIT binary patch literal 321976 zcma&P3tUvy`v1QN*@`9&mK2p5B^G8FS`?_0plBPz4waT&MNvbuB%MhzO=_T+=1f_q z3!Tn6aW0izPH`?7T1W9ZbUB4xExV9i+!L8}IYwIY|2%6wYaE{6m)Gk*y>jpMUe9{g zv+mDc`@-rerBjnU9?SgtSm#?5YP(sJLXODalgww9RcPf~{qgTGYpB&1lwt}wRvx=p zwK=A+Tpt`MU4D`V@;HR$%+Xj#N1NmRuS2U#nk~y5Eh|%nDIM9`^tFy}`g*wH=D71l z6||Z*=%YzT=25!*Z*;o+Z*)3y>}12t(UgzMM*q*?^2uW{;^=3NBul@tFa7iAJo{dq zpFBRBs>CdFH0drzIZNSB?8I`1AE=J-+M4Kc4m7 zvR4PyQQW!s-?W?M$;_-NI%X2FeEd(p?4iFM^8AweqZZ7ZlXmqlkF6~DK5V*+7D)Ja zI}{z05H_c^IQhT$<-KrUFFXT<%S4>~oe1!M>Hl9Zyl*ddZtR6$+zW5)MgJqc@MC(> z^L8)t%X;B|>P64AUij!<^w_<~M|+Wfwio#idXfKEFMNG3{PAA&m-Qk)trz}WFZ`Td z`p=WS$RE{(fLf zf3($q5DJLjCiSmn{SHTxZxZrvfFENWZGGs~@*$R=06iq%BIGTs4;8c=oNL{1{XGBt z8>*}Y3l;~KRa(pZODn2wv1ZS%TDtH?|AN^SmDgLdOMWxED&ViM7A&cneY%vreD3fzdb>3VDF z{5gvkFR4J*|AF7uG{D2FWEvYCdn7v?G#he?V5oKDYQo!T|6^oZFn{VBq z^^>uxD7yT!EBv=q&7VDYHXAyB=~8RK@}&#?^U2bR%B9v#%a$yq94J_IOOI6kC5x9V zpTAV4ojtpvdd}3mW_8t3@uSEDg5C@q;ZdG^@RXCFBmeNOy*%#qV0XXnME$BxcJOV5}-d*1w|^RHXD z%s+qWjOmjXFS&94j5%``Q%=|2u;fOzW40FkKLyeElK4M5>k|)Ynk>RbmX0KE$K(6r z%>1vV$cHj#{j7c})&oNS)6WBfE^itC>DYw};gR*T-UlS+KVe~i@)$qk@B{Zf1eLb6 zkHdqNe6mIUFv%aU!YBdMQ#f!UrBAX3>g?dJ4hOX?Gj7|KtDw~^_!{P|g73VLJSq6| zf{#qoyj}2>RhqkkpK`k9oq`{@Nb@eicjjnrbqrVe8~ax*(>z7+H`tyu!6zM~1*-wYSO6rt-QWcrEj6!Rw8D=kOlwp2Fc8!8-?W zxdi{7d86RjS898j1UGt`1;6hGt-nq1EY{O5xY6SZ{=*=ypYM8>YY6K}6Wr*@5d7i{ zttVIT!K|lHaHGc&`~cfiF1XQCCAiU3E%;&9vqtdp6}p}q1vh%u3hv=?+9LSXtfx(I zqi2`k$*iYS@WtF7*7rT@-{?sZ+?u27IaBa7uIF6Ajh=kLBUfrYWrELOd&&hjdMX7! zfy-4R_&~O2jo?O4gW!ExPm|zfY)^~eMo+8Y{aH`D;H9jmQ*fiFOYniLC+&xx?c%VW zOu>zwY{9*(r%>=>)>9_9(KAc%V^~j>;DxNGMsTC2Uhs6*(m!}jl z=&2U`WG>el!O!G!H41L@tQCA1>uC|(=xGz&=-DOs)*M}~PQkO;9_xQS>)+@}5j=R0 z){`l?(UU8<(UULuDO|2H!83W@C>Px5sTAD!OErR5ak_$by>D0nCL=Q7C$>3WzY z_-NKsC3r5|QzN*sr(WT+g|J8$J1gpU-;A z1UL4S3vTpO3SPu|Y6LG^q1%0p;6_h_;Ki(`N$@nTpBBN5o>sxl^!}jl=&2Fh=&2X{64uiwcqP|! zli)^Av*6}>zfJIOxLoam8$GVzm$5z8!JhT(vYs@-jh+m_KmM&A@412-J%xfBJ&xe7 zu%A#acrveFRe~Em)qBDm4hD!8BRX%{?;?dcTU=;;!C3hPPxrDwaC`7l#(qbFPN<*cVra5K-B z32yYv68u8;532+(=KfP7xY1KD_zJeCQSegM(rW9pllSM-1mDAYG6dhp zJX7%h@jiC8;6Jl`uHff$|H&6T_XgdLg@Qj{s<|WhudKgZ@T3eaUn%$`9!FJzAI0+3 zf~PaD5!~D#sTcfYmR}?ISv;RK2tJbK8wD?7zE<#Y%$o!+VcsnGrOaCdf12yFRq*Ht zU2koIU&DHK2|nTQaJ66G-V1ko;hnwku3ot1>Dix6zA3%%v|e~dFFaH5N-l4<;4K_3 z6nqKGJAyA~UM6@g^I3vNn3oIwAoEJW|H!;b@W+`~3;uWJHG;puyk7ACFkd71cIFL& zzrnmw@b{Uo75r1?O@i-b-X{2d=DP&9J6TLfRhyjAek%-aONi}^0WBh1?c zzn{4)_`}RQ1^)x{F2VoI-0IV_A3ni6Met{srwQJ~JVWqx%rgalnR&M0o0;bdzJqz8 z;Kq-21UKt)nc%Ono>_vw!@OK@vo2Q(-pzhRmEdMwt`^)p=TIZ~$DD7y;GZ#HBlwrh z8w6kH)#Ig6aI-G275rP)(2Q5Zxh_q^Dee&_C)N`lc zrk=Y5H}z~K_w3Kc|49+N?@7A6X@Z-2&Jf(xbEe>?p0foX%=!yQ^t7jj?^~4#ewVqQ zCHQ^Js|0_Pd5z$YGhZWkxQ6?Q;KomD68ve_(;|4=D6OYWa8u9if;X|APQgE6ztK9a zXZ=jh;dT*xJ?qI7+_Yn^;IFWJq2O)I%LIRydAZ;pGp`c-bLKUI590g&YXpz6e52s+ zjn(CC65L#Ov}={tNR=!AEhvxq_Q< zT`0I2FJ*#X%l)cc@MONOtP*@{xh`*w;C-&te2w7!Sx=+jUgk}Lr!#L6d?@oa!G|+% z7u?KOoq`8fXgjU!p7o#2deQ_xi+QHt=P=I|{HZIn{zAdc^;enT<5^F+;DyYq1aD^j zHG)rL`9{IZm^TSNlX;8aS1@lA{95Mig3n{#Dfsowt&u(Jc?t70!Iv@56nr`JT)}T; zUMTo#=4FBhnU@P*%e+Q#Tzh-Xn^MGdm=R4*p zf_E`@^Lp0vLp(op3jQebF2NsTZk^jx&)=A*2>ulFG{K)^o+0>OnP&>VmU*_|e`lU6 z_&=HF3*OAUQ1JgScLd+Uyj}3Z0$u)2!E4Ub+~T8Ym&Sa}(*&!#r6F>et3eCCaUPhq}R@afE(1iyrNv*1@SZxMVp^H#yH zW8NnCjm&omzMOfx;H#Lsg5Sx!Q}Ew1?-Kk$<`%cJ=_ijePZ9iY%+myant6uc|6-mg z_y*?Lf^TDd8Lp)$h=DMZss+D+x+}S zz2F1Qa~*;YV%{M5@yr_qAHsaC;HNTg68v=L&4TAJZxMVf^H#yfF>e!mBJ*8>7c*}c z++pqtUdr6eAEsR{VV=VCis4r>PZN9&^9;ckGS3veig~u+%bDj2zM8q2kBvQ-GIxah zRm{r-pUZrf;ER}-3w{&xO2O}9UL&}Fl?U?^)hCtUp8Wht!+ImX#~`^Q_+yd;{}x!M8H67JM`FHG=<_`C7r>W!^6M4~uoV zT*14TcM6`w`(RyyAI037(6fHdVV)wm@w?IlKfv{zA-LIh$`stp+u4Gfc|KQg;|Jyo zek|KrD7f(h9l?zsSSGkxFJ=jTJnJtPdxa+1!qqg6A{O7W^IFhs+hckmd6Q zADgf1vrzC0Sl$u5lzExpU-5p?EW!JotM!))Zuapi1vmS;Rf3y+ylTPCK3k387qgx9 zf}88mHG*Hp@(qHoxL(`eDEKujzgF-$%$o#Xz`R-T#mrj-uVUUR_;TiLf}8u!y977; zf$f5u=TTk3Z)5$Pf}7`9x&$|Vmvw&6{%`!Z6v2%@mL|CI12Y6Sep;sB#!t%@-1vvN zg12-3%op5TmlX32@TBYFTdaX)ubG=+GxVg@)5!_ra z*9&g0m)8hxt_K?gH`jxWf}88XwSt@L!6w0j+^?DiH~RxEf}88>R>95nc$?ty>u$l# z^<%r>=6c^1-0Tl@3U01Xy977a>DI)a{oh=trwDHDyQK+k_Rli}H}}^v1vl5%*@Bzv z>s-OjzDmB}X8)~FaI2@n*rz^>~ZmW*?wc@Q$JE{|Iib zyLSn0uIt+cH~R*z;E!_4v&{8QG`Ah^rCQSbo!MQa7`;B~f1@ckF+`fL__AM0-s{C~__ z1wYKZP4Ir)Ub_TOW!^6M1FXjt{5Y2H6nq%-F2RR0w~Bi9e{;VqMR4<6Zoc3ftrQn}1uNM3(=JkRf?brD>2>w5oUn}@w=FNilTc-823ZBM%m*6KbcLg8D zyi4%W%u^=ytY?#NhT!M2e74}{GtU>?*y#v<0n1klUdFs$@L9|o1fRovt>7myZx(zJ z^H#x^G2bQlO6IQMLFQe8hnc5L?pdF|;r@^>_%!CT1pgiDsTBNC=GB7#m3h73&oFNg zyovc*!Phfy7W_ZVTLs_2e3#&FGIs_4fO(hTpEFM>?pbg9m}dxnfO)py-OTd^PvLrY z1Wz^fFZeOcD+SMBUM;v8@AZP8!txD*=P+L@cmeZf!A*Z|6?_uQ?-KkX=C0tUGVc<6 zH1m`xJ?sB+<{5%lGS3!#1@nBtuVd~Aehc$if`^!=UC`4Wvp?VH^yC*r^gOv%@M+AO z1fR~lS@1IEErMUlyjAean70dl6?0ecYngWnK8Jai;PaSUB|Xb~9rF~y7coy0{08P3 zf>$xm6x`Hjw&12da|Ji`nJ@TRtiMojQ_qgzrk=|LU&eZ73BH_px!|`luM~VW^D4oE z%&P^zi+PRUVdnLM-^+ZB;J;(uAo#<~8wG!q`C7prW8NhAUzs-x{v`7j!JlE?D){rv z+XVj?^Id|!$h=+fzU;5Mf?v5nkJC=UEBO9Sm*6k4ersCK{{J85DT2Sp-#17Tyo&F? zWC*^A^<)ZO!~R&d;C=XdJXi3=dAeNrf)^a4d7vDQ_T?kRn9k4@Yk7V3w{>&=Uld{W@OZBg+vo(U>%JtSD zc>Mb?f|v7i=4%Cii|ua`{2k`af|u|-)*|?OEZ-{lg**?p3H|}g?-IN$N4HD6;JaDg z72Lf4+bOttAHPd*bKlk~?b-j$eZ3UHujA)w(*!r)i^ve%d{-w^aC09gTX1u~CRgyC zTo3tzXWpRer%>=Ae4XM5ev*0KRq&UGaQ_$Fyti8}xcRPErQqhh<|@I>{$aJ?=Kbp$ z!7t?Ytry&UuWyauIV|5G_I%hxvVnCc(}APqW}h^L^45!G8_w`fL?E zX!^h4AG7`KWj*`hr_5c!zhK@ec#L_M;NLR0F7B!S2j(e)cQH>B{8#1~f+z7hn<;qQ z&lf!I=L;V9^9488L4|_H{d~bMWjo6R@5gq|5_}-@a=`~NuN3?^=2e29#JpPYOy)I$ zk6>Oe_!-RC2!0mx2Eor^-Y9qh^RzTp4mah)l6+|L(0?&k|0_wxmh z`}u;${d~dWe!k#wKVR^;pD%da&lf!I=L;V9^97Il`GUv&e8J;>zTj~`U+}n}FL>O~ z7d-Cg3m*6L1&{mrg2(-Q!Q+0u;Bh}+@VK8Zc-+qyJnrWU9{2MFkNf$T_U!+0KVR^; zpD%da&lf!I=L;V9^97Il`GUv&e8J;>zTj~`U+}n}FL>O~7d-Cg3m*6L1&{mrg2(-Q z!Q+0u;Bh}+@VK8Zc-+qyJnrWU9{2MFkNf$8$NhZ4<9@#2aX(-1xSub0+|L(0?&k|0 z_wxmh`}u;${d~dWe*TP}{Xg#K3m*6L1&{mrg2(-Q!Q+0u;Bh}+@VK8Zc-+qyJnrWU z9{2MFkNf$8$NhZ4<9@#2aX(-1xSub0+|L(0?&k|0_wxmh`}u;${d~dWe!k#wKVR^; zpD%da&lf!I=L;V9^97Il`LlZVLv!E3e9zCkzhHQ$ke_G#9Kn|`x31`^{}$#cg4Z!m z6FkB^L+}RXnS%e7dA8usGS3zK1?DaLhpX=i(cjZZ{CjP!2|Qg%=zrQ0_|OEtD}j$r z;Oz-KH-VeKb3=L3-wHE7^Y?6so4+4Mapv#V5FbZ?e}&&_`}-k`Kh+WcISHKqM2Cti zOW^tnQ74&|z?0)zEUP?$C;r{G$^=e%n_pD|H+_iWsuMW=a7g@DlfVbWsb$qCaQYie z=C>w+4>SAzPmIR*ocavHZIQ>m4 z^J`1s^ta{AZ&w08&OjX76Zr87+)dya3A{6bpOC=25;*;>xA>3yC$-^8afrX;lE4%H zSY28IAC@4Wk-$$*;F$?LGl6F(@KX|aZUR3wf#)Z1-Q#s+VFK4Pj^<7RACaJ^EPK?HY z|9Vd@#2JMvDP^p^8@~}tDNIvVtWAX%QJAKxSc?kJr7%rVu_hJ1lEO4K#Tr%k5(?9F z7+a&l(Xg^!^yO*OGJ6&^rgnqp#>3MWyRrj}UeVSo__Z$X%*lvuk8e@|hWN@8s) z{56GX3W>F-@E!`&)Dde^;SVWHQ%0;&h2NquElsgCD*P&iY3hj8sPGmF)07dbQsE60 zrl}%UuEPJMFijD$G8KNB!ZbC+3RU_)6yTaR5*#kG(=;azfk!p{em?JtKXP?C83?y zI-xyI@Qco}8Kn_>MMIM1L{j^xgYO6Q^zQUGs)t)YdQUF45aYXj&v0v|6R~f>(JAP1 zLSOn%z|i{(WN7H6Uen#aV6^w-TBZM*tu*S6gpt08(na#dDK#SxBfYcva33es>1=i< zI-VWQ&cpr;C|t-22a>|x^ws#rK#vtT%L)1>A^|LeJp-Mv?@EN+RFv3t@XrprKjb`Q zP7N9M!&az7c}V=4*aAot%`BQR^HQ2e!uAsvH-}P>RzgXh zS3;@%)M-m7HA%Bj>aP$Ar60n-*SDM)vJc=S=)3+il+k}o*uIcr?TgjFlT}pBazuIS zI+R6K2=u{O*uGhblp~Bb`|Ke!ZpiLiNA?$krC=rk->vz^yOq?3I+Tl0&^O^~tCwZFI-1;sD+H~bT} zA3=(cy&5p+d)ZRPo`LoZ`ktYH|CFe`6%xsi4f<9pw6-G){qPm^a5wK^50z2j`@;4g zAsOsS_SX57hF?ELPX3Wmy9ff*)TpZ0cB(4;d?*#f{so6-(jCi33Vr5LX}_bi-n!{3 z@VXA%rHuGIKryuqTHn$KmA+#`s_H9ssIHz$^F0X$21M;Wbb??&9swfm68_{9PUqPDg^jM|!mKYtpv9f+$US5s6$hyQep*4Ktm_UB|c z!L2E+)6C6kT0(&DKp+rS1m@ySw$k zb3(tm&miQ4w$e;8zzOZr(p#O-x3J+lvSE9J$Ljd<($Jv|WF97x(g$e5@{Kz+%W|h+ z;WON)`K!cp68M>#zePM9JoKsiODM@YYN+)II?|_Z2`nhOyy&v{gpeItnKi@-`Loh6 zt-SOx+9~AwCJV)l>1ATZ()$f0Gub+^GQ2@f3$`MTZSy62E2=sOu9%RdMmA@m_s262|4@>x^#1+mV&S~kaqfhVbL!sm z*1m(ZFtRB0NlA1&rikv2Yk=$SK$gKS545gdLzR;L0v#~>BZF&@yyK5fXeV$1YKZ=P zH)TQA1qAn^N=iXBd9@Qx{wn>`(WpHlE6O<%qt$jE*Ef8E_v zX#S+X(mTE40DA3@$7fm7qRE|P1A<>7=me`%(3wt!jGj}cg(tMTUt$VD^`!^5!bJN& zkSneDd|Gg2dx{nKBs8@10~$H@Rn&LaIXcG9277ccPV5F|ULg^pay*N!+(_ z7p9kXH6z+dv_eMm4n|eXN{ZQ`V^R>~_N!DC_RDdQq8Wzzdd)=GnSqm_?<(Z)39Kv) z=gdXQpfC8d8WI1bVnyv~VDt<6D!@J7drn6pWER$${q#OEI|h{ldv~i0TD*11BofZs zjX2D{Q}0FRIOBI%KE8n-J+WIzp=&612yMTy0x@pqU8+ZYM9IRweKZOGX%$U5+k?KZ zx>V-ZqRVV7gD?cnM0W1WI!zVQ#ENLmiR68^L#2O^EUW&JEZdGH!&^6wqQiNsNPQ^p z+jP`M)V>}e`oYe~J+SkR`(Y+X)tMG1A(8;B|mk2o0?Ovg-JdxL7bp-V6ul!o)xU*=@ zKDqhynp@NQ2flNHw`N-YubuFP`A+!Kl+w`Q($HRQ_mW#7-xl6b|(GXU2l4nWFIVXvGz@R2o%TP*oC)rj-_~%t~4Q38GJY zAtBmEv=dIwA|>7jTfFO9JjkM>?}5pKyn$-A*n4Lf%3*ciz&0)@OiLrxSk4PmoXzdY zr5;@K6lbNxE`^dK>He9RZWhwTDiI%CnU!G$N-^~3zKgC^U_W|n7CO#qY#0Q6TLzt>&wm1;K;; zy|uN}*@7)j#}`GRH-o-^ARP>S05s_9qCXqxt$k7jqKl{x)pnA6IDKw4tc>J68K&{M zUt8r-MeQC04gPb2zK4*2hSbWtArrCt{SOCkaU0g#J1JEpZwIX~Ch@jvs;99!`@g9i zi%0=^9F@wBy5}hCNZwRR9rmrkI-~OqAt}IW0C&;1sF_gCGMq!TTl;4Wd$bwVxc@jO zgi(^W_boErmk;LtRH008Z~6n|B6;U;p}O~d2?@7lKWVZ@k|w&wxfv@nIl5urag@=d zpvS85ouM6_>k$|9J-$%Y&@%|2>bn2AeaWhCzw%qQ{6d2%^A>}Zm=NRC{hs%ykTD?L%54dEX~SWKhIUupH)$)Y;8X)Y*l)icLVm zm(U}vqK))#$2qDShbLsYpJ5@I9_lO&eddI=KzArH?aN4u=>jgoA+P_s&=6b;<~@!) zO2b*7V0QF>KE3Wh;NL-CK6ZUPrIEa&>#1mY$vBjHix1%R;Y3q!fV$v>EGuw(Y3RFB zY@|f;qKWa-5#Mod(6{e8>go?{^{(4p8W}MP>t#nWnGyOhc&N|ntBSlElZQAJtw>(! z&9Z7H9BujAoe+f&L7jKwz+rW7!J5ZtEsUi95eHade;e0q=4g$ z_ccI=f1-N|WU-=*rd}3F--6_38hsc7dg2(0lGN=B42#;2f%SoLxV&>uM@lD3A&ZRM zx`|HRku>GfHg?orff=q5WyEO|cGE9vKaP^>vy*7D!7pmB;#d^$7-WFid_BfvJAy$xznhK?lQ-{3q zIC$5+5^CMtp5ocOAe1^5AZ+{nq@``)TcjkEo~oo;LR&WPN%6ETKwgx(IgNkLhWHt- zE2$+y=?B%pKBPmx=+Lh^bXbSFb;v@&VV6f8(vx(kj}9g4kgY>~b*P^XrRY$99U7oR zN9oW&9ZJ=qqjkuuLuooRNQaKmp<{Juunwi`&~Z9+ybfjHpf(?xbI~{$4qmc9k~$yD z3EY+X!F`?J7LRvb@}Sz5z_;sZj~^YU5V6fgI>9Hp8tVu44Q|H#M8df64}7Dw&e1{z zXkiS5Z?Wh_oOY+;mHNR)I}Ol|8DtzK!ez);%~-B!ahW%eTI=o#Y(`dlHt+50PF$|~ z!UV-v5TDSpd2b*0bj`0u8N&7g#cPOrHJ@=5xbJ-M&3lvGgEuQB=b?OIdyEn;B;h@p zN2#OPsfH)JuWJ6J;``=OrrS{%%l(Irn2PDw&0U27cq4X3-1lz6#1c+#K%P!yQXz^F zq0>(NME2+U4oQImHrs%3fb9^*}+i{`$o9Z%0L#S<8yYx=%tsM*=TDC_D)jVu`c!UnUyM`V*OIKGu*TIeeOeljQYBe|`2;k4k@)mOj=`vVPyinqM$ z&P*%zuG@#+>0LJ@1*eDLuY_)g;FN-2S6@*aI#fKegO)!vPZpABB=s>g;ZL7Bkr}oX zns6U{MvqglE3m)g3@7w?QRtPT5V>~0$9UN=4~lrr_|(nVOI`g_cOmU|VGpNro^!S~ z*Ib2dt2Wh-#lStP3NAxvN3bi^KOLLB%7RkwlyM4=bm#Bbb zVR7i3he|_P*lo~ee%%p7)!(uKL$i*SlHE1%z|?xw@q|0`3pACSh}fTES#cs|juX`+ z*plKDv;{h&_Pa6kYW%R?#Lvb+2UZWT@vJRs|IE2X?b%1H`9nO(*m(3xX6O?4U~>b7 zy#)0awaeqO4C3#u5kj-s_tmX3gn zJ+8&L;fr6?K0AIkg3nNmQ{#mxgEn12T2ttU#!%}+IQ?(b+68UP2076}HS*BR830T7 zyC>o{8X9?v3l~29CUm)o?>Rc}ug`x^=R2wtA2tB<+6I08A#!t{!+F#m4iV1o4|>+x zP6fk#r@lA@-9l8?RyvL3_@M#rVhl!?MqXHpR2@TUQ++-Z74ep?6WpFs65N(tQt+++ zZcpH7sN6^02hL&A50q(2QK$=3#{f(V8)((nGgrj-A~Ml_;>wiyd_AiZ+z&w&UmmBlz>Y<)xige-5f>7aW%l5QMvd9rFPN zt^Q$kuLQp9Xo21nl-}Ah3-|9ko`GN!1jCb3Ivz_{RBr#K8F!o#8lyIAEr4o|W^_ii z!-9(Z1D~gb?fFoHU7WBzi%yEOlB4!TIHMotNj`HTS7#NLMiyt~s%yGam1*fQ-^8( zS#101?sNd;~Icf+P7dtaQCya1b5!yNCXmXd;~ zKivs#2K5l^Pq4J0E70NHRFqWL;tlOV2CBEkCc(Ji!9L!)2u@1W{=q?HRSJJ3qvLWX z*pcQGyym^*I4VQM