home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl560.zip / opcode.pl < prev    next >
Perl Script  |  2000-03-18  |  21KB  |  826 lines

  1. #!/usr/bin/perl
  2.  
  3. unlink "opcode.h", "opnames.h";
  4. open(OC, ">opcode.h") || die "Can't create opcode.h: $!\n";
  5. open(ON, ">opnames.h") || die "Can't create opnames.h: $!\n";
  6. select OC;
  7.  
  8. # Read data.
  9.  
  10. while (<DATA>) {
  11.     chop;
  12.     next unless $_;
  13.     next if /^#/;
  14.     ($key, $desc, $check, $flags, $args) = split(/\t+/, $_, 5);
  15.  
  16.     warn qq[Description "$desc" duplicates $seen{$desc}\n] if $seen{$desc};
  17.     die qq[Opcode "$key" duplicates $seen{$key}\n] if $seen{$key};
  18.     $seen{$desc} = qq[description of opcode "$key"];
  19.     $seen{$key} = qq[opcode "$key"];
  20.  
  21.     push(@ops, $key);
  22.     $desc{$key} = $desc;
  23.     $check{$key} = $check;
  24.     $ckname{$check}++;
  25.     $flags{$key} = $flags;
  26.     $args{$key} = $args;
  27. }
  28.  
  29. # Emit defines.
  30.  
  31. $i = 0;
  32. print <<"END";
  33. /* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
  34.    This file is built by opcode.pl from its data.  Any changes made here
  35.    will be lost!
  36. */
  37.  
  38. #define Perl_pp_i_preinc Perl_pp_preinc
  39. #define Perl_pp_i_predec Perl_pp_predec
  40. #define Perl_pp_i_postinc Perl_pp_postinc
  41. #define Perl_pp_i_postdec Perl_pp_postdec
  42.  
  43. END
  44.  
  45. print ON <<"END";
  46. /* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
  47.    This file is built by opcode.pl from its data.  Any changes made here
  48.    will be lost!
  49. */
  50.  
  51. typedef enum opcode {
  52. END
  53.  
  54. for (@ops) {
  55.     print ON "\t", &tab(3,"OP_\U$_,"), "/* ", $i++, " */\n";
  56. }
  57. print ON "\t", &tab(3,"OP_max"), "\n";
  58. print ON "} opcode;\n";
  59. print ON "\n#define MAXO ", scalar @ops, "\n\n"; 
  60.  
  61. # Emit op names and descriptions.
  62.  
  63. print <<END;
  64.  
  65. START_EXTERN_C
  66.  
  67. #ifndef DOINIT
  68. EXT char *PL_op_name[];
  69. #else
  70. EXT char *PL_op_name[] = {
  71. END
  72.  
  73. for (@ops) {
  74.     print qq(\t"$_",\n);
  75. }
  76.  
  77. print <<END;
  78. };
  79. #endif
  80.  
  81. END
  82.  
  83. print <<END;
  84. #ifndef DOINIT
  85. EXT char *PL_op_desc[];
  86. #else
  87. EXT char *PL_op_desc[] = {
  88. END
  89.  
  90. for (@ops) {
  91.     my($safe_desc) = $desc{$_};
  92.  
  93.     # Have to escape double quotes and escape characters.    
  94.     $safe_desc =~ s/(^|[^\\])([\\"])/$1\\$2/g;
  95.  
  96.     print qq(\t"$safe_desc",\n);
  97. }
  98.  
  99. print <<END;
  100. };
  101. #endif
  102.  
  103. END_EXTERN_C
  104.  
  105. END
  106.  
  107. # Emit function declarations.
  108.  
  109. #for (sort keys %ckname) {
  110. #    print "OP *\t", &tab(3,$_),"(pTHX_ OP* o);\n";
  111. #}
  112. #
  113. #print "\n";
  114. #
  115. #for (@ops) {
  116. #    print "OP *\t", &tab(3, "pp_$_"), "(pTHX);\n";
  117. #}
  118.  
  119. # Emit ppcode switch array.
  120.  
  121. print <<END;
  122.  
  123. START_EXTERN_C
  124.  
  125. #ifndef DOINIT
  126. EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX);
  127. #else
  128. EXT OP * (CPERLscope(*PL_ppaddr)[])(pTHX) = {
  129. END
  130.  
  131. for (@ops) {
  132.     print "\tMEMBER_TO_FPTR(Perl_pp_$_),\n";
  133. }
  134.  
  135. print <<END;
  136. };
  137. #endif
  138.  
  139. END
  140.  
  141. # Emit check routines.
  142.  
  143. print <<END;
  144. #ifndef DOINIT
  145. EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op);
  146. #else
  147. EXT OP * (CPERLscope(*PL_check)[]) (pTHX_ OP *op) = {
  148. END
  149.  
  150. for (@ops) {
  151.     print "\t", &tab(3, "MEMBER_TO_FPTR(Perl_$check{$_}),"), "\t/* $_ */\n";
  152. }
  153.  
  154. print <<END;
  155. };
  156. #endif
  157.  
  158. END
  159.  
  160. # Emit allowed argument types.
  161.  
  162. print <<END;
  163. #ifndef DOINIT
  164. EXT U32 PL_opargs[];
  165. #else
  166. EXT U32 PL_opargs[] = {
  167. END
  168.  
  169. %argnum = (
  170.     S,    1,        # scalar
  171.     L,    2,        # list
  172.     A,    3,        # array value
  173.     H,    4,        # hash value
  174.     C,    5,        # code value
  175.     F,    6,        # file value
  176.     R,    7,        # scalar reference
  177. );
  178.  
  179. %opclass = (
  180.     '0',  0,        # baseop
  181.     '1',  1,        # unop
  182.     '2',  2,        # binop
  183.     '|',  3,        # logop
  184.     '@',  4,        # listop
  185.     '/',  5,        # pmop
  186.     '$',  6,        # svop_or_padop
  187.     '#',  7,        # padop
  188.     '"',  8,        # pvop_or_svop
  189.     '{',  9,        # loop
  190.     ';',  10,        # cop
  191.     '%',  11,        # baseop_or_unop
  192.     '-',  12,        # filestatop
  193.     '}',  13,        # loopexop
  194. );
  195.  
  196. for (@ops) {
  197.     $argsum = 0;
  198.     $flags = $flags{$_};
  199.     $argsum |= 1 if $flags =~ /m/;        # needs stack mark
  200.     $argsum |= 2 if $flags =~ /f/;        # fold constants
  201.     $argsum |= 4 if $flags =~ /s/;        # always produces scalar
  202.     $argsum |= 8 if $flags =~ /t/;        # needs target scalar
  203.     $argsum |= (8|256) if $flags =~ /T/;    # ... which may be lexical
  204.     $argsum |= 16 if $flags =~ /i/;        # always produces integer
  205.     $argsum |= 32 if $flags =~ /I/;        # has corresponding int op
  206.     $argsum |= 64 if $flags =~ /d/;        # danger, unknown side effects
  207.     $argsum |= 128 if $flags =~ /u/;        # defaults to $_
  208.  
  209.     $flags =~ /([\W\d_])/ or die qq[Opcode "$_" has no class indicator];
  210.     $argsum |= $opclass{$1} << 9;
  211.     $mul = 0x2000;                # 2 ^ OASHIFT
  212.     for $arg (split(' ',$args{$_})) {
  213.     $argnum = ($arg =~ s/\?//) ? 8 : 0;
  214.     $argnum += $argnum{$arg};
  215.     warn "# Conflicting bit 32 for '$_'.\n"
  216.         if $argnum & 8 and $mul == 0x10000000;
  217.     $argsum += $argnum * $mul;
  218.     $mul <<= 4;
  219.     }
  220.     $argsum = sprintf("0x%08x", $argsum);
  221.     print "\t", &tab(3, "$argsum,"), "/* $_ */\n";
  222. }
  223.  
  224. print <<END;
  225. };
  226. #endif
  227.  
  228. END_EXTERN_C
  229. END
  230.  
  231. close OC or die "Error closing opcode.h: $!";
  232. close ON or die "Error closing opnames.h: $!";
  233.  
  234. unlink "pp_proto.h";
  235. unlink "pp.sym";
  236. open PP, '>pp_proto.h' or die "Error creating pp_proto.h: $!";
  237. open PPSYM, '>pp.sym' or die "Error creating pp.sym: $!";
  238.  
  239. print PP <<"END";
  240. /* !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
  241.    This file is built by opcode.pl from its data.  Any changes made here
  242.    will be lost!
  243. */
  244.  
  245. END
  246.  
  247. print PPSYM <<"END";
  248. #
  249. # !!!!!!!   DO NOT EDIT THIS FILE   !!!!!!! 
  250. #   This file is built by opcode.pl from its data.  Any changes made here
  251. #   will be lost!
  252. #
  253.  
  254. END
  255.  
  256.  
  257. for (sort keys %ckname) {
  258.     print PP "PERL_CKDEF(Perl_$_)\n";
  259.     print PPSYM "Perl_$_\n";
  260. #OP *\t", &tab(3,$_),"(OP* o);\n";
  261. }
  262.  
  263. print PP "\n\n";
  264.  
  265. for (@ops) {
  266.     next if /^i_(pre|post)(inc|dec)$/;
  267.     print PP "PERL_PPDEF(Perl_pp_$_)\n";
  268.     print PPSYM "Perl_pp_$_\n";
  269. }
  270.  
  271. close PP or die "Error closing pp_proto.h: $!";
  272. close PPSYM or die "Error closing pp.sym: $!";
  273.  
  274. ###########################################################################
  275. sub tab {
  276.     local($l, $t) = @_;
  277.     $t .= "\t" x ($l - (length($t) + 1) / 8);
  278.     $t;
  279. }
  280. ###########################################################################
  281.  
  282. # Some comments about 'T' opcode classifier:
  283.  
  284. # Safe to set if the ppcode uses:
  285. #    tryAMAGICbin, tryAMAGICun, SETn, SETi, SETu, PUSHn, PUSHTARG, SETTARG,
  286. #    SETs(TARG), XPUSHn, XPUSHu,
  287.  
  288. # Unsafe to set if the ppcode uses dTARG or [X]RETPUSH[YES|NO|UNDEF]
  289.  
  290. # lt and friends do SETs (including ncmp, but not scmp)
  291.  
  292. # Additional mode of failure: the opcode can modify TARG before it "used"
  293. # all the arguments (or may call an external function which does the same).
  294. # If the target coincides with one of the arguments ==> kaboom.
  295.  
  296. # pp.c    pos substr each not OK (RETPUSHUNDEF)
  297. #    substr vec also not OK due to LV to target (are they???)
  298. #    ref not OK (RETPUSHNO)
  299. #    trans not OK (dTARG; TARG = sv_newmortal();)
  300. #    ucfirst etc not OK: TMP arg processed inplace
  301. #    quotemeta not OK (unsafe when TARG == arg)
  302. #    each repeat not OK too due to array context
  303. #    pack split - unknown whether they are safe
  304. #    sprintf: is calling do_sprintf(TARG,...) which can act on TARG
  305. #      before other args are processed.
  306.  
  307. #    Suspicious wrt "additional mode of failure" (and only it):
  308. #    schop, chop, postinc/dec, bit_and etc, negate, complement.
  309.  
  310. #    Also suspicious: 4-arg substr, sprintf, uc/lc (POK_only), reverse, pack.
  311.  
  312. #    substr/vec: doing TAINT_off()???
  313.  
  314. # pp_hot.c
  315. #    readline - unknown whether it is safe
  316. #    match subst not OK (dTARG)
  317. #    grepwhile not OK (not always setting)
  318. #    join not OK (unsafe when TARG == arg)
  319.  
  320. #    Suspicious wrt "additional mode of failure": concat (dealt with
  321. #    in ck_sassign()), join (same).
  322.  
  323. # pp_ctl.c
  324. #    mapwhile flip caller not OK (not always setting)
  325.  
  326. # pp_sys.c
  327. #    backtick glob warn die not OK (not always setting)
  328. #    warn not OK (RETPUSHYES)
  329. #    open fileno getc sysread syswrite ioctl accept shutdown
  330. #     ftsize(etc) readlink telldir fork alarm getlogin not OK (RETPUSHUNDEF)
  331. #    umask select not OK (XPUSHs(&PL_sv_undef);)
  332. #    fileno getc sysread syswrite tell not OK (meth("FILENO" "GETC"))
  333. #    sselect shm* sem* msg* syscall - unknown whether they are safe
  334. #    gmtime not OK (list context)
  335.  
  336. #    Suspicious wrt "additional mode of failure": warn, die, select.
  337.  
  338. __END__
  339.  
  340. # New ops always go at the very end
  341.  
  342. # Nothing.
  343.  
  344. null        null operation        ck_null        0    
  345. stub        stub            ck_null        0
  346. scalar        scalar            ck_fun        s%    S
  347.  
  348. # Pushy stuff.
  349.  
  350. pushmark    pushmark        ck_null        s0    
  351. wantarray    wantarray        ck_null        is0    
  352.  
  353. const        constant item        ck_svconst    s$    
  354.  
  355. gvsv        scalar variable        ck_null        ds$    
  356. gv        glob value        ck_null        ds$    
  357. gelem        glob elem        ck_null        d2    S S
  358. padsv        private variable    ck_null        ds0
  359. padav        private array        ck_null        d0
  360. padhv        private hash        ck_null        d0
  361. padany        private value        ck_null        d0
  362.  
  363. pushre        push regexp        ck_null        d/
  364.  
  365. # References and stuff.
  366.  
  367. rv2gv        ref-to-glob cast    ck_rvconst    ds1    
  368. rv2sv        scalar dereference    ck_rvconst    ds1    
  369. av2arylen    array length        ck_null        is1    
  370. rv2cv        subroutine dereference    ck_rvconst    d1
  371. anoncode    anonymous subroutine    ck_anoncode    $    
  372. prototype    subroutine prototype    ck_null        s%    S
  373. refgen        reference constructor    ck_spair    m1    L
  374. srefgen        single ref constructor    ck_null        fs1    S
  375. ref        reference-type operator    ck_fun        stu%    S?
  376. bless        bless            ck_fun        s@    S S?
  377.  
  378. # Pushy I/O.
  379.  
  380. backtick    quoted execution (``, qx)    ck_open        t%    
  381. # glob defaults its first arg to $_
  382. glob        glob            ck_glob        t@    S?
  383. readline    <HANDLE>        ck_null        t%    
  384. rcatline    append I/O operator    ck_null        t%    
  385.  
  386. # Bindable operators.
  387.  
  388. regcmaybe    regexp internal guard    ck_fun        s1    S
  389. regcreset    regexp internal reset    ck_fun        s1    S
  390. regcomp        regexp compilation    ck_null        s|    S
  391. match        pattern match (m//)    ck_match    d/
  392. qr        pattern quote (qr//)    ck_match    s/
  393. subst        substitution (s///)    ck_null        dis/    S
  394. substcont    substitution iterator    ck_null        dis|    
  395. trans        transliteration (tr///)    ck_null        is"    S
  396.  
  397. # Lvalue operators.
  398. # sassign is special-cased for op class
  399.  
  400. sassign        scalar assignment    ck_sassign    s0
  401. aassign        list assignment        ck_null        t2    L L
  402.  
  403. chop        chop            ck_spair    mts%    L
  404. schop        scalar chop        ck_null        stu%    S?
  405. chomp        chomp            ck_spair    mTs%    L
  406. schomp        scalar chomp        ck_null        sTu%    S?
  407. defined        defined operator    ck_defined    isu%    S?
  408. undef        undef operator        ck_lfun        s%    S?
  409. study        study            ck_fun        su%    S?
  410. pos        match position        ck_lfun        stu%    S?
  411.  
  412. preinc        preincrement (++)        ck_lfun        dIs1    S
  413. i_preinc    integer preincrement (++)    ck_lfun        dis1    S
  414. predec        predecrement (--)        ck_lfun        dIs1    S
  415. i_predec    integer predecrement (--)    ck_lfun        dis1    S
  416. postinc        postincrement (++)        ck_lfun        dIst1    S
  417. i_postinc    integer postincrement (++)    ck_lfun        disT1    S
  418. postdec        postdecrement (--)        ck_lfun        dIst1    S
  419. i_postdec    integer postdecrement (--)    ck_lfun        disT1    S
  420.  
  421. # Ordinary operators.
  422.  
  423. pow        exponentiation (**)    ck_null        fsT2    S S
  424.  
  425. multiply    multiplication (*)    ck_null        IfsT2    S S
  426. i_multiply    integer multiplication (*)    ck_null        ifsT2    S S
  427. divide        division (/)        ck_null        IfsT2    S S
  428. i_divide    integer division (/)    ck_null        ifsT2    S S
  429. modulo        modulus (%)        ck_null        IifsT2    S S
  430. i_modulo    integer modulus (%)    ck_null        ifsT2    S S
  431. repeat        repeat (x)        ck_repeat    mt2    L S
  432.  
  433. add        addition (+)        ck_null        IfsT2    S S
  434. i_add        integer addition (+)    ck_null        ifsT2    S S
  435. subtract    subtraction (-)        ck_null        IfsT2    S S
  436. i_subtract    integer subtraction (-)    ck_null        ifsT2    S S
  437. concat        concatenation (.)    ck_concat    fsT2    S S
  438. stringify    string            ck_fun        fsT@    S
  439.  
  440. left_shift    left bitshift (<<)    ck_bitop    fsT2    S S
  441. right_shift    right bitshift (>>)    ck_bitop    fsT2    S S
  442.  
  443. lt        numeric lt (<)        ck_null        Iifs2    S S
  444. i_lt        integer lt (<)        ck_null        ifs2    S S
  445. gt        numeric gt (>)        ck_null        Iifs2    S S
  446. i_gt        integer gt (>)        ck_null        ifs2    S S
  447. le        numeric le (<=)        ck_null        Iifs2    S S
  448. i_le        integer le (<=)        ck_null        ifs2    S S
  449. ge        numeric ge (>=)        ck_null        Iifs2    S S
  450. i_ge        integer ge (>=)        ck_null        ifs2    S S
  451. eq        numeric eq (==)        ck_null        Iifs2    S S
  452. i_eq        integer eq (==)        ck_null        ifs2    S S
  453. ne        numeric ne (!=)        ck_null        Iifs2    S S
  454. i_ne        integer ne (!=)        ck_null        ifs2    S S
  455. ncmp        numeric comparison (<=>)    ck_null        Iifst2    S S
  456. i_ncmp        integer comparison (<=>)    ck_null        ifst2    S S
  457.  
  458. slt        string lt        ck_scmp        ifs2    S S
  459. sgt        string gt        ck_scmp        ifs2    S S
  460. sle        string le        ck_scmp        ifs2    S S
  461. sge        string ge        ck_scmp        ifs2    S S
  462. seq        string eq        ck_null        ifs2    S S
  463. sne        string ne        ck_null        ifs2    S S
  464. scmp        string comparison (cmp)    ck_scmp        ifst2    S S
  465.  
  466. bit_and        bitwise and (&)        ck_bitop    fst2    S S
  467. bit_xor        bitwise xor (^)        ck_bitop    fst2    S S
  468. bit_or        bitwise or (|)        ck_bitop    fst2    S S
  469.  
  470. negate        negation (-)        ck_null        Ifst1    S
  471. i_negate    integer negation (-)    ck_null        ifsT1    S
  472. not        not            ck_null        ifs1    S
  473. complement    1's complement (~)    ck_bitop    fst1    S
  474.  
  475. # High falutin' math.
  476.  
  477. atan2        atan2            ck_fun        fsT@    S S
  478. sin        sin            ck_fun        fsTu%    S?
  479. cos        cos            ck_fun        fsTu%    S?
  480. rand        rand            ck_fun        sT%    S?
  481. srand        srand            ck_fun        s%    S?
  482. exp        exp            ck_fun        fsTu%    S?
  483. log        log            ck_fun        fsTu%    S?
  484. sqrt        sqrt            ck_fun        fsTu%    S?
  485.  
  486. # Lowbrow math.
  487.  
  488. int        int            ck_fun        fsTu%    S?
  489. hex        hex            ck_fun        fsTu%    S?
  490. oct        oct            ck_fun        fsTu%    S?
  491. abs        abs            ck_fun        fsTu%    S?
  492.  
  493. # String stuff.
  494.  
  495. length        length            ck_lengthconst    isTu%    S?
  496. substr        substr            ck_fun        st@    S S S? S?
  497. vec        vec            ck_fun        ist@    S S S
  498.  
  499. index        index            ck_index    isT@    S S S?
  500. rindex        rindex            ck_index    isT@    S S S?
  501.  
  502. sprintf        sprintf            ck_fun_locale    mfst@    S L
  503. formline    formline        ck_fun        ms@    S L
  504. ord        ord            ck_fun        ifsTu%    S?
  505. chr        chr            ck_fun        fsTu%    S?
  506. crypt        crypt            ck_fun        fsT@    S S
  507. ucfirst        ucfirst            ck_fun_locale    fstu%    S?
  508. lcfirst        lcfirst            ck_fun_locale    fstu%    S?
  509. uc        uc            ck_fun_locale    fstu%    S?
  510. lc        lc            ck_fun_locale    fstu%    S?
  511. quotemeta    quotemeta        ck_fun        fstu%    S?
  512.  
  513. # Arrays.
  514.  
  515. rv2av        array dereference    ck_rvconst    dt1    
  516. aelemfast    constant array element    ck_null        s$    A S
  517. aelem        array element        ck_null        s2    A S
  518. aslice        array slice        ck_null        m@    A L
  519.  
  520. # Hashes.
  521.  
  522. each        each            ck_fun        %    H
  523. values        values            ck_fun        t%    H
  524. keys        keys            ck_fun        t%    H
  525. delete        delete            ck_delete    %    S
  526. exists        exists            ck_exists    is%    S
  527. rv2hv        hash dereference    ck_rvconst    dt1    
  528. helem        hash element        ck_null        s2@    H S
  529. hslice        hash slice        ck_null        m@    H L
  530.  
  531. # Explosives and implosives.
  532.  
  533. unpack        unpack            ck_fun        @    S S
  534. pack        pack            ck_fun        mst@    S L
  535. split        split            ck_split    t@    S S S
  536. join        join            ck_join        mst@    S L
  537.  
  538. # List operators.
  539.  
  540. list        list            ck_null        m@    L
  541. lslice        list slice        ck_null        2    H L L
  542. anonlist    anonymous list ([])    ck_fun        ms@    L
  543. anonhash    anonymous hash ({})    ck_fun        ms@    L
  544.  
  545. splice        splice            ck_fun        m@    A S? S? L
  546. push        push            ck_fun        imsT@    A L
  547. pop        pop            ck_shift    s%    A
  548. shift        shift            ck_shift    s%    A
  549. unshift        unshift            ck_fun        imsT@    A L
  550. sort        sort            ck_sort        m@    C? L
  551. reverse        reverse            ck_fun        mt@    L
  552.  
  553. grepstart    grep            ck_grep        dm@    C L
  554. grepwhile    grep iterator        ck_null        dt|    
  555.  
  556. mapstart    map            ck_grep        dm@    C L
  557. mapwhile    map iterator        ck_null        dt|
  558.  
  559. # Range stuff.
  560.  
  561. range        flipflop        ck_null        |    S S
  562. flip        range (or flip)        ck_null        1    S S
  563. flop        range (or flop)        ck_null        1
  564.  
  565. # Control.
  566.  
  567. and        logical and (&&)        ck_null        |    
  568. or        logical or (||)            ck_null        |    
  569. xor        logical xor            ck_null        fs2    S S    
  570. cond_expr    conditional expression        ck_null        d|    
  571. andassign    logical and assignment (&&=)    ck_null        s|    
  572. orassign    logical or assignment (||=)    ck_null        s|    
  573.  
  574. method        method lookup        ck_method    d1
  575. entersub    subroutine entry    ck_subr        dmt1    L
  576. leavesub    subroutine exit        ck_null        1    
  577. leavesublv    lvalue subroutine exit    ck_null        1    
  578. caller        caller            ck_fun        t%    S?
  579. warn        warn            ck_fun        imst@    L
  580. die        die            ck_fun        dimst@    L
  581. reset        symbol reset        ck_fun        is%    S?
  582.  
  583. lineseq        line sequence        ck_null        @    
  584. nextstate    next statement        ck_null        s;    
  585. dbstate        debug next statement    ck_null        s;    
  586. unstack        iteration finalizer    ck_null        s0
  587. enter        block entry        ck_null        0    
  588. leave        block exit        ck_null        @    
  589. scope        block            ck_null        @    
  590. enteriter    foreach loop entry    ck_null        d{    
  591. iter        foreach loop iterator    ck_null        0    
  592. enterloop    loop entry        ck_null        d{    
  593. leaveloop    loop exit        ck_null        2    
  594. return        return            ck_null        dm@    L
  595. last        last            ck_null        ds}    
  596. next        next            ck_null        ds}    
  597. redo        redo            ck_null        ds}    
  598. dump        dump            ck_null        ds}    
  599. goto        goto            ck_null        ds}    
  600. exit        exit            ck_exit        ds%    S?
  601. # continued below
  602.  
  603. #nswitch    numeric switch        ck_null        d    
  604. #cswitch    character switch    ck_null        d    
  605.  
  606. # I/O.
  607.  
  608. open        open            ck_open        ist@    F S? L
  609. close        close            ck_fun        is%    F?
  610. pipe_op        pipe            ck_fun        is@    F F
  611.  
  612. fileno        fileno            ck_fun        ist%    F
  613. umask        umask            ck_fun        ist%    S?
  614. binmode        binmode            ck_fun        s@    F S?
  615.  
  616. tie        tie            ck_fun        idms@    R S L
  617. untie        untie            ck_fun        is%    R
  618. tied        tied            ck_fun        s%    R
  619. dbmopen        dbmopen            ck_fun        is@    H S S
  620. dbmclose    dbmclose        ck_fun        is%    H
  621.  
  622. sselect        select system call    ck_select    t@    S S S S
  623. select        select            ck_select    st@    F?
  624.  
  625. getc        getc            ck_eof        st%    F?
  626. read        read            ck_fun        imst@    F R S S?
  627. enterwrite    write            ck_fun        dis%    F?
  628. leavewrite    write exit        ck_null        1    
  629.  
  630. prtf        printf            ck_listiob    ims@    F? L
  631. print        print            ck_listiob    ims@    F? L
  632.  
  633. sysopen        sysopen            ck_fun        s@    F S S S?
  634. sysseek        sysseek            ck_fun        s@    F S S
  635. sysread        sysread            ck_fun        imst@    F R S S?
  636. syswrite    syswrite        ck_fun        imst@    F S S? S?
  637.  
  638. send        send            ck_fun        imst@    F S S S?
  639. recv        recv            ck_fun        imst@    F R S S
  640.  
  641. eof        eof            ck_eof        is%    F?
  642. tell        tell            ck_fun        st%    F?
  643. seek        seek            ck_fun        s@    F S S
  644. # truncate really behaves as if it had both "S S" and "F S"
  645. truncate    truncate        ck_trunc    is@    S S
  646.  
  647. fcntl        fcntl            ck_fun        st@    F S S
  648. ioctl        ioctl            ck_fun        st@    F S S
  649. flock        flock            ck_fun        isT@    F S
  650.  
  651. # Sockets.
  652.  
  653. socket        socket            ck_fun        is@    F S S S
  654. sockpair    socketpair        ck_fun        is@    F F S S S
  655.  
  656. bind        bind            ck_fun        is@    F S
  657. connect        connect            ck_fun        is@    F S
  658. listen        listen            ck_fun        is@    F S
  659. accept        accept            ck_fun        ist@    F F
  660. shutdown    shutdown        ck_fun        ist@    F S
  661.  
  662. gsockopt    getsockopt        ck_fun        is@    F S S
  663. ssockopt    setsockopt        ck_fun        is@    F S S S
  664.  
  665. getsockname    getsockname        ck_fun        is%    F
  666. getpeername    getpeername        ck_fun        is%    F
  667.  
  668. # Stat calls.
  669.  
  670. lstat        lstat            ck_ftst        u-    F
  671. stat        stat            ck_ftst        u-    F
  672. ftrread        -R            ck_ftst        isu-    F
  673. ftrwrite    -W            ck_ftst        isu-    F
  674. ftrexec        -X            ck_ftst        isu-    F
  675. fteread        -r            ck_ftst        isu-    F
  676. ftewrite    -w            ck_ftst        isu-    F
  677. fteexec        -x            ck_ftst        isu-    F
  678. ftis        -e            ck_ftst        isu-    F
  679. fteowned    -O            ck_ftst        isu-    F
  680. ftrowned    -o            ck_ftst        isu-    F
  681. ftzero        -z            ck_ftst        isu-    F
  682. ftsize        -s            ck_ftst        istu-    F
  683. ftmtime        -M            ck_ftst        stu-    F
  684. ftatime        -A            ck_ftst        stu-    F
  685. ftctime        -C            ck_ftst        stu-    F
  686. ftsock        -S            ck_ftst        isu-    F
  687. ftchr        -c            ck_ftst        isu-    F
  688. ftblk        -b            ck_ftst        isu-    F
  689. ftfile        -f            ck_ftst        isu-    F
  690. ftdir        -d            ck_ftst        isu-    F
  691. ftpipe        -p            ck_ftst        isu-    F
  692. ftlink        -l            ck_ftst        isu-    F
  693. ftsuid        -u            ck_ftst        isu-    F
  694. ftsgid        -g            ck_ftst        isu-    F
  695. ftsvtx        -k            ck_ftst        isu-    F
  696. fttty        -t            ck_ftst        is-    F
  697. fttext        -T            ck_ftst        isu-    F
  698. ftbinary    -B            ck_ftst        isu-    F
  699.  
  700. # File calls.
  701.  
  702. chdir        chdir            ck_fun        isT%    S?
  703. chown        chown            ck_fun        imsT@    L
  704. chroot        chroot            ck_fun        isTu%    S?
  705. unlink        unlink            ck_fun        imsTu@    L
  706. chmod        chmod            ck_fun        imsT@    L
  707. utime        utime            ck_fun        imsT@    L
  708. rename        rename            ck_fun        isT@    S S
  709. link        link            ck_fun        isT@    S S
  710. symlink        symlink            ck_fun        isT@    S S
  711. readlink    readlink        ck_fun        stu%    S?
  712. mkdir        mkdir            ck_fun        isT@    S S?
  713. rmdir        rmdir            ck_fun        isTu%    S?
  714.  
  715. # Directory calls.
  716.  
  717. open_dir    opendir            ck_fun        is@    F S
  718. readdir        readdir            ck_fun        %    F
  719. telldir        telldir            ck_fun        st%    F
  720. seekdir        seekdir            ck_fun        s@    F S
  721. rewinddir    rewinddir        ck_fun        s%    F
  722. closedir    closedir        ck_fun        is%    F
  723.  
  724. # Process control.
  725.  
  726. fork        fork            ck_null        ist0    
  727. wait        wait            ck_null        isT0    
  728. waitpid        waitpid            ck_fun        isT@    S S
  729. system        system            ck_exec        imsT@    S? L
  730. exec        exec            ck_exec        dimsT@    S? L
  731. kill        kill            ck_fun        dimsT@    L
  732. getppid        getppid            ck_null        isT0    
  733. getpgrp        getpgrp            ck_fun        isT%    S?
  734. setpgrp        setpgrp            ck_fun        isT@    S? S?
  735. getpriority    getpriority        ck_fun        isT@    S S
  736. setpriority    setpriority        ck_fun        isT@    S S S
  737.  
  738. # Time calls.
  739.  
  740. # NOTE: MacOS patches the 'i' of time() away later when the interpreter
  741. # is created because in MacOS time() is already returning times > 2**31-1,
  742. # that is, non-integers.
  743.  
  744. time        time            ck_null        isT0    
  745. tms        times            ck_null        0    
  746. localtime    localtime        ck_fun        t%    S?
  747. gmtime        gmtime            ck_fun        t%    S?
  748. alarm        alarm            ck_fun        istu%    S?
  749. sleep        sleep            ck_fun        isT%    S?
  750.  
  751. # Shared memory.
  752.  
  753. shmget        shmget            ck_fun        imst@    S S S
  754. shmctl        shmctl            ck_fun        imst@    S S S
  755. shmread        shmread            ck_fun        imst@    S S S S
  756. shmwrite    shmwrite        ck_fun        imst@    S S S S
  757.  
  758. # Message passing.
  759.  
  760. msgget        msgget            ck_fun        imst@    S S
  761. msgctl        msgctl            ck_fun        imst@    S S S
  762. msgsnd        msgsnd            ck_fun        imst@    S S S
  763. msgrcv        msgrcv            ck_fun        imst@    S S S S S
  764.  
  765. # Semaphores.
  766.  
  767. semget        semget            ck_fun        imst@    S S S
  768. semctl        semctl            ck_fun        imst@    S S S S
  769. semop        semop            ck_fun        imst@    S S
  770.  
  771. # Eval.
  772.  
  773. require        require            ck_require    du%    S?
  774. dofile        do "file"        ck_fun        d1    S
  775. entereval    eval "string"        ck_eval        d%    S
  776. leaveeval    eval "string" exit    ck_null        1    S
  777. #evalonce    eval constant string    ck_null        d1    S
  778. entertry    eval {block}        ck_null        |    
  779. leavetry    eval {block} exit    ck_null        @    
  780.  
  781. # Get system info.
  782.  
  783. ghbyname    gethostbyname        ck_fun        %    S
  784. ghbyaddr    gethostbyaddr        ck_fun        @    S S
  785. ghostent    gethostent        ck_null        0    
  786. gnbyname    getnetbyname        ck_fun        %    S
  787. gnbyaddr    getnetbyaddr        ck_fun        @    S S
  788. gnetent        getnetent        ck_null        0    
  789. gpbyname    getprotobyname        ck_fun        %    S
  790. gpbynumber    getprotobynumber    ck_fun        @    S
  791. gprotoent    getprotoent        ck_null        0    
  792. gsbyname    getservbyname        ck_fun        @    S S
  793. gsbyport    getservbyport        ck_fun        @    S S
  794. gservent    getservent        ck_null        0    
  795. shostent    sethostent        ck_fun        is%    S
  796. snetent        setnetent        ck_fun        is%    S
  797. sprotoent    setprotoent        ck_fun        is%    S
  798. sservent    setservent        ck_fun        is%    S
  799. ehostent    endhostent        ck_null        is0    
  800. enetent        endnetent        ck_null        is0    
  801. eprotoent    endprotoent        ck_null        is0    
  802. eservent    endservent        ck_null        is0    
  803. gpwnam        getpwnam        ck_fun        %    S
  804. gpwuid        getpwuid        ck_fun        %    S
  805. gpwent        getpwent        ck_null        0    
  806. spwent        setpwent        ck_null        is0    
  807. epwent        endpwent        ck_null        is0    
  808. ggrnam        getgrnam        ck_fun        %    S
  809. ggrgid        getgrgid        ck_fun        %    S
  810. ggrent        getgrent        ck_null        0    
  811. sgrent        setgrent        ck_null        is0    
  812. egrent        endgrent        ck_null        is0    
  813. getlogin    getlogin        ck_null        st0    
  814.  
  815. # Miscellaneous.
  816.  
  817. syscall        syscall            ck_fun        imst@    S L
  818.  
  819. # For multi-threading
  820. lock        lock            ck_rfun        s%    S
  821. threadsv    per-thread value    ck_null        ds0
  822.  
  823. # Control (contd.)
  824. setstate    set statement info    ck_null        s;
  825. method_named    method with known name    ck_null        d$
  826.