1APTR T_PTR 2intArray * T_ARRAY 3UWORD T_UV 4ULONG T_UV 5WORD T_IV 6LONG T_IV 7BOOL T_IV 8TagList * T_TAGLIST 9TAGRET T_TAGRET 10STRPTR T_PV 11int32 T_IV 12uint32 T_UV 13 14############################################################################# 15INPUT 16T_TAGLIST 17 U32 ix_$var = $argoff; 18 U32 _tag_type; 19 /* allocate taglist struct, +2 as tags lists end in a TAG_DONE by tradition */ 20 /* if by some chance someone adds something after the TAG_DONE it will just*/ 21 /* result in harmless empty space */ 22 $var = $ntype((items -= $argoff) +2); 23 while(items > 0) 24 { 25 int __index = (ix_$var - $argoff)/3; 26 $var\[__index\].ti_Tag = (ULONG)SvUV(ST(ix_$var)); 27 ix_$var++; 28 items--; 29 /* the last is a tag_done and usualy has no followers so check for > 1 */ 30 if(items > 1 && ($var\[__index\].ti_Tag != TAG_DONE)) 31 { 32 _tag_type = (ULONG)SvUV(ST(ix_$var)); 33 ix_$var++; 34 switch(_tag_type) 35 { 36 case TT_APTR: 37 $var\[__index\].ti_Data = (ULONG)INT2PTR(APTR,SvIV(ST(ix_$var))); 38 break; 39 case TT_WORD: 40 $var\[__index\].ti_Data = (WORD)SvIV(ST(ix_$var)); 41 break; 42 case TT_LONG: 43 $var\[__index\].ti_Data = (LONG)SvIV(ST(ix_$var)); 44 break; 45 case TT_UWORD: 46 $var\[__index\].ti_Data = (UWORD)SvUV(ST(ix_$var)); 47 break; 48 case TT_ULONG: 49 $var\[__index\].ti_Data = (ULONG)SvUV(ST(ix_$var)); 50 break; 51 case TT_STRPTR: 52 case TT_UBYTE: 53 $var\[__index\].ti_Data = (ULONG)(STRPTR)SvPV_nolen(ST(ix_$var)); 54 break; 55 default: 56 Perl_croak(aTHX_ \"Unknown TAGTYPE \%d\",_tag_type); 57 } 58 ix_$var++; 59 items -=2; 60 } 61 } 62 63T_TAGRET 64 /* Allocate variable type according to preceding var tagtype */ 65 switch(tagtype) 66 { 67 case TT_APTR: 68 $var.tr_aptr = INT2PTR(APTR,SvIV($arg)); 69 break; 70 case TT_WORD: 71 $var.tr_word = (WORD)SvIV($arg); 72 break; 73 case TT_LONG: 74 $var.tr_long = (LONG)SvIV($arg); 75 case TT_UWORD: 76 $var.tr_uword = (UWORD)SvUV($arg); 77 break; 78 case TT_ULONG: 79 $var.tr_ulong = (ULONG)SvUV($arg); 80 break; 81 case TT_STRPTR: 82 case TT_UBYTE: 83 $var.tr_strptr = (STRPTR)SvPV_nolen($arg); 84 break; 85 default: 86 Perl_croak(aTHX_ \"Unknown TAGTYPE \%d\",tagtype); 87 } 88 89#################################################################################### 90OUTPUT 91T_TAGRET 92 /* Allocate variable type according to preceding var tagtype */ 93 switch(tagtype) 94 { 95 case TT_APTR: 96 sv_setiv($arg, PTR2IV($var.tr_aptr)); 97 break; 98 case TT_WORD: 99 sv_setiv($arg, (IV)$var.tr_word); 100 break; 101 case TT_LONG: 102 sv_setiv($arg, (IV)$var.tr_long); 103 break; 104 case TT_UWORD: 105 sv_setuv($arg, (UV)$var.tr_uword); 106 break; 107 case TT_ULONG: 108 sv_setuv($arg, (UV)$var.tr_ulong); 109 break; 110 case TT_STRPTR: 111 case TT_UBYTE: 112 sv_setpv((SV*)$arg, $var.tr_strptr); 113 break; 114 default: 115 Perl_croak(aTHX_ \"Unknown TAGTYPE \%d\",tagtype); 116 } 117 118 119