Re: Named-capture regex syntax
[p5sagit/p5-mst-13.2.git] / dump.c
diff --git a/dump.c b/dump.c
index f9cd28d..eefa477 100644 (file)
--- a/dump.c
+++ b/dump.c
 #include "proto.h"
 
 
+static const char* const svtypenames[SVt_LAST] = {
+    "NULL",
+    "IV",
+    "NV",
+    "RV",
+    "BIND",
+    "PV",
+    "PVIV",
+    "PVNV",
+    "PVMG",
+    "PVGV",
+    "PVLV",
+    "PVAV",
+    "PVHV",
+    "PVCV",
+    "PVFM",
+    "PVIO"
+};
+
+
+static const char* const svshorttypenames[SVt_LAST] = {
+    "UNDEF",
+    "IV",
+    "NV",
+    "RV",
+    "BIND",
+    "PV",
+    "PVIV",
+    "PVNV",
+    "PVMG",
+    "GV",
+    "PVLV",
+    "AV",
+    "HV",
+    "CV",
+    "FM",
+    "IO"
+};
+
 #define Sequence PL_op_sequence
 
 void
@@ -121,7 +160,7 @@ Perl_dump_eval(pTHX)
 
 
 /*
-=for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const U8 const *str\
+=for apidoc Apd|char*|pv_escape|NN SV *dsv|NN const char const *str\
                |const STRLEN count|const STRLEN max
                |STRLEN const *escaped, const U32 flags
 
@@ -158,28 +197,29 @@ Returns a pointer to the escaped text as held by dsv.
 =cut
 */
 #define PV_ESCAPE_OCTBUFSIZE 32
+
 char *
-Perl_pv_escape( pTHX_ SV *dsv, U8 const * const str, 
+Perl_pv_escape( pTHX_ SV *dsv, char const * const str, 
                 const STRLEN count, const STRLEN max, 
                 STRLEN * const escaped, const U32 flags ) 
 {
-    U8 dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : '\\';
-    U8 octbuf[PV_ESCAPE_OCTBUFSIZE] = "\\123456789ABCDF";
+    char dq = (flags & PERL_PV_ESCAPE_QUOTE) ? '"' : '\\';
+    char octbuf[PV_ESCAPE_OCTBUFSIZE] = "\\123456789ABCDF";
     STRLEN wrote = 0;    /* chars written so far */
     STRLEN chsize = 0;   /* size of data to be written */
     STRLEN readsize = 1; /* size of data just read */
     bool isuni= flags & PERL_PV_ESCAPE_UNI ? 1 : 0; /* is this unicode */
-    const U8 *pv  = str;
-    const U8 *end = pv + count; /* end of string */
+    const char *pv  = str;
+    const char *end = pv + count; /* end of string */
 
     if (!flags & PERL_PV_ESCAPE_NOCLEAR) 
            sv_setpvn(dsv, "", 0);
     
-    if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string(pv, count))
+    if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
         isuni = 1;
     
     for ( ; (pv < end && (!max || (wrote < max))) ; pv += readsize ) {
-        const UV u= (isuni) ? utf8_to_uvchr(pv, &readsize) : *pv;            
+        const UV u= (isuni) ? utf8_to_uvchr((U8*)pv, &readsize) : (U8)*pv;            
         const U8 c = (U8)u & 0xFF;
         
         if ( ( u > 255 ) || (flags & PERL_PV_ESCAPE_ALL)) {
@@ -208,7 +248,7 @@ Perl_pv_escape( pTHX_ SV *dsv, U8 const * const str,
                             chsize = 1;
                                break;
                default:
-                        if ( (pv < end) && isDIGIT(*(pv+readsize)) )
+                        if ( (pv < end) && isDIGIT((U8)*(pv+readsize)) )
                             chsize = my_snprintf( octbuf, PV_ESCAPE_OCTBUFSIZE, 
                                                   "\\%03o", c);
                            else
@@ -236,9 +276,9 @@ Perl_pv_escape( pTHX_ SV *dsv, U8 const * const str,
     return SvPVX(dsv);
 }
 /*
-=for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const U8 const *str\
+=for apidoc Apd|char *|pv_pretty|NN SV *dsv|NN const char const *str\
            |const STRLEN count|const STRLEN max\
-           |const U8 const *start_color| const U8 const *end_color\
+           |const char const *start_color| const char const *end_color\
            |const U32 flags
 
 Converts a string into something presentable, handling escaping via
@@ -264,8 +304,8 @@ Returns a pointer to the prettified text as held by dsv.
 */
 
 char *
-Perl_pv_pretty( pTHX_ SV *dsv, U8 const * const str, const STRLEN count, 
-  const STRLEN max, U8 const * const start_color, U8 const * const end_color, 
+Perl_pv_pretty( pTHX_ SV *dsv, char const * const str, const STRLEN count, 
+  const STRLEN max, char const * const start_color, char const * const end_color, 
   const U32 flags ) 
 {
     U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '\\';
@@ -279,12 +319,12 @@ Perl_pv_pretty( pTHX_ SV *dsv, U8 const * const str, const STRLEN count,
         sv_setpvn(dsv, "", 0);
         
     if ( start_color != NULL ) 
-        Perl_sv_catpvf( aTHX_ dsv, "%s", start_color);
+        Perl_sv_catpv( aTHX_ dsv, start_color);
     
     pv_escape( dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR );    
     
     if ( end_color != NULL ) 
-        Perl_sv_catpvf( aTHX_ dsv, "%s", end_color);
+        Perl_sv_catpv( aTHX_ dsv, end_color);
 
     if ( dq == '"' ) 
        sv_catpvn( dsv, "\"", 1 );
@@ -318,7 +358,7 @@ Note that the final string may be up to 7 chars longer than pvlim.
 char *
 Perl_pv_display(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
 {
-    pv_pretty( dsv, pv, cur, pvlim, 0, 0, PERL_PV_PRETTY_DUMP);
+    pv_pretty( dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
     if (len > cur && pv[cur] == '\0')
             sv_catpvn( dsv, "\\0", 2 );
     return SvPVX(dsv);
@@ -330,6 +370,7 @@ Perl_sv_peek(pTHX_ SV *sv)
     dVAR;
     SV * const t = sv_newmortal();
     int unref = 0;
+    U32 type;
 
     sv_setpvn(t, "", 0);
   retry:
@@ -411,62 +452,18 @@ Perl_sv_peek(pTHX_ SV *sv)
        sv = (SV*)SvRV(sv);
        goto retry;
     }
-    switch (SvTYPE(sv)) {
-    default:
-       sv_catpv(t, "FREED");
+    type = SvTYPE(sv);
+    if (type == SVt_PVCV) {
+       Perl_sv_catpvf(aTHX_ t, "CV(%s)", CvGV(sv) ? GvNAME(CvGV(sv)) : "");
        goto finish;
+    } else if (type < SVt_LAST) {
+       sv_catpv(t, svshorttypenames[type]);
 
-    case SVt_NULL:
-       sv_catpv(t, "UNDEF");
-       goto finish;
-    case SVt_IV:
-       sv_catpv(t, "IV");
-       break;
-    case SVt_NV:
-       sv_catpv(t, "NV");
-       break;
-    case SVt_RV:
-       sv_catpv(t, "RV");
-       break;
-    case SVt_PV:
-       sv_catpv(t, "PV");
-       break;
-    case SVt_PVIV:
-       sv_catpv(t, "PVIV");
-       break;
-    case SVt_PVNV:
-       sv_catpv(t, "PVNV");
-       break;
-    case SVt_PVMG:
-       sv_catpv(t, "PVMG");
-       break;
-    case SVt_PVLV:
-       sv_catpv(t, "PVLV");
-       break;
-    case SVt_PVAV:
-       sv_catpv(t, "AV");
-       break;
-    case SVt_PVHV:
-       sv_catpv(t, "HV");
-       break;
-    case SVt_PVCV:
-       if (CvGV(sv))
-           Perl_sv_catpvf(aTHX_ t, "CV(%s)", GvNAME(CvGV(sv)));
-       else
-           sv_catpv(t, "CV()");
+       if (type == SVt_NULL)
+           goto finish;
+    } else {
+       sv_catpv(t, "FREED");
        goto finish;
-    case SVt_PVGV:
-       sv_catpv(t, "GV");
-       break;
-    case SVt_PVBM:
-       sv_catpv(t, "BM");
-       break;
-    case SVt_PVFM:
-       sv_catpv(t, "FM");
-       break;
-    case SVt_PVIO:
-       sv_catpv(t, "IO");
-       break;
     }
 
     if (SvPOKp(sv)) {
@@ -556,9 +553,9 @@ S_pm_description(pTHX_ const PMOP *pm)
     if (pmflags & PMf_ONCE)
        sv_catpv(desc, ",ONCE");
     if (regex && regex->check_substr) {
-       if (!(regex->reganch & ROPT_NOSCAN))
+       if (!(regex->extflags & RXf_NOSCAN))
            sv_catpv(desc, ",SCANFIRST");
-       if (regex->reganch & ROPT_CHECK_ALL)
+       if (regex->extflags & RXf_CHECK_ALL)
            sv_catpv(desc, ",ALL");
     }
     if (pmflags & PMf_SKIPWHITE)
@@ -710,14 +707,14 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     level++;
     seq = sequence_num(o);
     if (seq)
-       PerlIO_printf(file, "%-4"UVf, seq);
+       PerlIO_printf(file, "%-4"UVuf, seq);
     else
        PerlIO_printf(file, "    ");
     PerlIO_printf(file,
                  "%*sTYPE = %s  ===> ",
                  (int)(PL_dumpindent*level-4), "", OP_NAME(o));
     if (o->op_next)
-       PerlIO_printf(file, seq ? "%"UVf"\n" : "(%"UVf")\n",
+       PerlIO_printf(file, seq ? "%"UVuf"\n" : "(%"UVuf")\n",
                                sequence_num(o->op_next));
     else
        PerlIO_printf(file, "DONE\n");
@@ -726,7 +723,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
            Perl_dump_indent(aTHX_ level, file, "  (was %s)\n", PL_op_name[o->op_targ]);
            if (o->op_targ == OP_NEXTSTATE) {
                if (CopLINE(cCOPo))
-                   Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n",
+                   Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
                                     (UV)CopLINE(cCOPo));
                if (CopSTASHPV(cCOPo))
                    Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
@@ -742,7 +739,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
 #ifdef DUMPADDR
     Perl_dump_indent(aTHX_ level, file, "ADDR = 0x%"UVxf" => 0x%"UVxf"\n", (UV)o, (UV)o->op_next);
 #endif
-    if (o->op_flags) {
+    if (o->op_flags || o->op_latefree || o->op_latefreed) {
        SV * const tmpsv = newSVpvs("");
        switch (o->op_flags & OPf_WANT) {
        case OPf_WANT_VOID:
@@ -770,6 +767,10 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
            sv_catpv(tmpsv, ",MOD");
        if (o->op_flags & OPf_SPECIAL)
            sv_catpv(tmpsv, ",SPECIAL");
+       if (o->op_latefree)
+           sv_catpv(tmpsv, ",LATEFREE");
+       if (o->op_latefreed)
+           sv_catpv(tmpsv, ",LATEFREED");
        Perl_dump_indent(aTHX_ level, file, "FLAGS = (%s)\n", SvCUR(tmpsv) ? SvPVX_const(tmpsv) + 1 : "");
        SvREFCNT_dec(tmpsv);
     }
@@ -1026,7 +1027,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     case OP_NEXTSTATE:
     case OP_DBSTATE:
        if (CopLINE(cCOPo))
-           Perl_dump_indent(aTHX_ level, file, "LINE = %"UVf"\n",
+           Perl_dump_indent(aTHX_ level, file, "LINE = %"UVuf"\n",
                             (UV)CopLINE(cCOPo));
        if (CopSTASHPV(cCOPo))
            Perl_dump_indent(aTHX_ level, file, "PACKAGE = \"%s\"\n",
@@ -1038,17 +1039,17 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     case OP_ENTERLOOP:
        Perl_dump_indent(aTHX_ level, file, "REDO ===> ");
        if (cLOOPo->op_redoop)
-           PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_redoop));
+           PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_redoop));
        else
            PerlIO_printf(file, "DONE\n");
        Perl_dump_indent(aTHX_ level, file, "NEXT ===> ");
        if (cLOOPo->op_nextop)
-           PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_nextop));
+           PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_nextop));
        else
            PerlIO_printf(file, "DONE\n");
        Perl_dump_indent(aTHX_ level, file, "LAST ===> ");
        if (cLOOPo->op_lastop)
-           PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOOPo->op_lastop));
+           PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOOPo->op_lastop));
        else
            PerlIO_printf(file, "DONE\n");
        break;
@@ -1060,7 +1061,7 @@ Perl_do_op_dump(pTHX_ I32 level, PerlIO *file, const OP *o)
     case OP_AND:
        Perl_dump_indent(aTHX_ level, file, "OTHER ===> ");
        if (cLOGOPo->op_other)
-           PerlIO_printf(file, "%"UVf"\n", sequence_num(cLOGOPo->op_other));
+           PerlIO_printf(file, "%"UVuf"\n", sequence_num(cLOGOPo->op_other));
        else
            PerlIO_printf(file, "DONE\n");
        break;
@@ -1126,6 +1127,7 @@ static const struct { const char type; const char *name; } magic_names[] = {
        { PERL_MAGIC_sv,             "sv(\\0)" },
        { PERL_MAGIC_arylen,         "arylen(#)" },
        { PERL_MAGIC_rhash,          "rhash(%)" },
+       { PERL_MAGIC_regdata_names,  "regdata_names(+)" },
        { PERL_MAGIC_pos,            "pos(.)" },
        { PERL_MAGIC_symtab,         "symtab(:)" },
        { PERL_MAGIC_backref,        "backref(<)" },
@@ -1355,9 +1357,13 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                   (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv),
                   (int)(PL_dumpindent*level), "");
 
-    if (flags & SVs_PADSTALE)  sv_catpv(d, "PADSTALE,");
-    if (flags & SVs_PADTMP)    sv_catpv(d, "PADTMP,");
-    if (flags & SVs_PADMY)     sv_catpv(d, "PADMY,");
+    if (!(flags & SVpad_NAME && (type == SVt_PVMG || type == SVt_PVNV))) {
+       if (flags & SVs_PADSTALE)       sv_catpv(d, "PADSTALE,");
+    }
+    if (!(flags & SVpad_NAME && type == SVt_PVMG)) {
+       if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,");
+       if (flags & SVs_PADMY)  sv_catpv(d, "PADMY,");
+    }
     if (flags & SVs_TEMP)      sv_catpv(d, "TEMP,");
     if (flags & SVs_OBJECT)    sv_catpv(d, "OBJECT,");
     if (flags & SVs_GMG)       sv_catpv(d, "GMG,");
@@ -1379,8 +1385,12 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
     if (flags & SVp_IOK)       sv_catpv(d, "pIOK,");
     if (flags & SVp_NOK)       sv_catpv(d, "pNOK,");
     if (flags & SVp_POK)       sv_catpv(d, "pPOK,");
-    if (flags & SVp_SCREAM && type != SVt_PVHV)
+    if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)) {
+       if (SvPCS_IMPORTED(sv))
+                               sv_catpv(d, "PCS_IMPORTED,");
+       else
                                sv_catpv(d, "SCREAM,");
+    }
 
     switch (type) {
     case SVt_PVCV:
@@ -1414,9 +1424,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
            if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
            if (GvIN_PAD(sv))   sv_catpv(d, "IN_PAD,");
        }
-       if (SvPAD_OUR(sv))      sv_catpv(d, "OUR,");
-       if (SvPAD_STATE(sv))    sv_catpv(d, "STATE,");
-       if (SvPAD_TYPED(sv))    sv_catpv(d, "TYPED,");
        if (isGV_with_GP(sv) && GvIMPORTED(sv)) {
            sv_catpv(d, "IMPORT");
            if (GvIMPORTED(sv) == GVf_IMPORTED)
@@ -1430,18 +1437,22 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                sv_catpv(d, " ),");
            }
        }
+       if (SvTAIL(sv))         sv_catpv(d, "TAIL,");
+       if (SvVALID(sv))        sv_catpv(d, "VALID,");
        /* FALL THROUGH */
     default:
+    evaled_or_uv:
        if (SvEVALED(sv))       sv_catpv(d, "EVALED,");
        if (SvIsUV(sv) && !(flags & SVf_ROK))   sv_catpv(d, "IsUV,");
        break;
-    case SVt_PVBM:
-       if (SvTAIL(sv))         sv_catpv(d, "TAIL,");
-       if (SvVALID(sv))        sv_catpv(d, "VALID,");
-       break;
     case SVt_PVMG:
        if (SvPAD_TYPED(sv))    sv_catpv(d, "TYPED,");
+       if (SvPAD_OUR(sv))      sv_catpv(d, "OUR,");
+       if (SvPAD_STATE(sv))    sv_catpv(d, "STATE,");
        break;
+    case SVt_PVNV:
+       if (SvPAD_STATE(sv))    sv_catpv(d, "STATE,");
+       goto evaled_or_uv;
     case SVt_PVAV:
        break;
     }
@@ -1465,57 +1476,14 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
        sv->sv_debug_cloned ? " (cloned)" : "");
 #endif
     Perl_dump_indent(aTHX_ level, file, "SV = ");
-    switch (type) {
-    case SVt_NULL:
-       PerlIO_printf(file, "NULL%s\n", s);
-       SvREFCNT_dec(d);
-       return;
-    case SVt_IV:
-       PerlIO_printf(file, "IV%s\n", s);
-       break;
-    case SVt_NV:
-       PerlIO_printf(file, "NV%s\n", s);
-       break;
-    case SVt_RV:
-       PerlIO_printf(file, "RV%s\n", s);
-       break;
-    case SVt_PV:
-       PerlIO_printf(file, "PV%s\n", s);
-       break;
-    case SVt_PVIV:
-       PerlIO_printf(file, "PVIV%s\n", s);
-       break;
-    case SVt_PVNV:
-       PerlIO_printf(file, "PVNV%s\n", s);
-       break;
-    case SVt_PVBM:
-       PerlIO_printf(file, "PVBM%s\n", s);
-       break;
-    case SVt_PVMG:
-       PerlIO_printf(file, "PVMG%s\n", s);
-       break;
-    case SVt_PVLV:
-       PerlIO_printf(file, "PVLV%s\n", s);
-       break;
-    case SVt_PVAV:
-       PerlIO_printf(file, "PVAV%s\n", s);
-       break;
-    case SVt_PVHV:
-       PerlIO_printf(file, "PVHV%s\n", s);
-       break;
-    case SVt_PVCV:
-       PerlIO_printf(file, "PVCV%s\n", s);
-       break;
-    case SVt_PVGV:
-       PerlIO_printf(file, "PVGV%s\n", s);
-       break;
-    case SVt_PVFM:
-       PerlIO_printf(file, "PVFM%s\n", s);
-       break;
-    case SVt_PVIO:
-       PerlIO_printf(file, "PVIO%s\n", s);
-       break;
-    default:
+    if (type < SVt_LAST) {
+       PerlIO_printf(file, "%s%s\n", svtypenames[type], s);
+
+       if (type ==  SVt_NULL) {
+           SvREFCNT_dec(d);
+           return;
+       }
+    } else {
        PerlIO_printf(file, "UNKNOWN(0x%"UVxf") %s\n", (UV)type, s);
        SvREFCNT_dec(d);
        return;
@@ -2379,8 +2347,8 @@ Perl_sv_xmlpeek(pTHX_ SV *sv)
     case SVt_PVGV:
        sv_catpv(t, " GV=\"");
        break;
-    case SVt_PVBM:
-       sv_catpv(t, " BM=\"");
+    case SVt_BIND:
+       sv_catpv(t, " BIND=\"");
        break;
     case SVt_PVFM:
        sv_catpv(t, " FM=\"");
@@ -2429,7 +2397,7 @@ Perl_do_pmop_xmldump(pTHX_ I32 level, PerlIO *file, const PMOP *pm)
     level++;
     if (PM_GETRE(pm)) {
        char *s = PM_GETRE(pm)->precomp;
-       SV *tmpsv = newSV(0);
+       SV *tmpsv = newSVpvn("",0);
        SvUTF8_on(tmpsv);
        sv_catxmlpvn(tmpsv, s, strlen(s), 1);
        Perl_xmldump_indent(aTHX_ level, file, "pre=\"%s\"\n",
@@ -2491,7 +2459,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
            if (o->op_targ == OP_NEXTSTATE)
            {
                if (CopLINE(cCOPo))
-                   PerlIO_printf(file, " line=\"%"UVf"\"",
+                   PerlIO_printf(file, " line=\"%"UVuf"\"",
                                     (UV)CopLINE(cCOPo));
                if (CopSTASHPV(cCOPo))
                    PerlIO_printf(file, " package=\"%s\"",
@@ -2721,7 +2689,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
 #else
        if (cSVOPo->op_sv) {
            SV *tmpsv1 = newSV(0);
-           SV *tmpsv2 = newSV(0);
+           SV *tmpsv2 = newSVpvn("",0);
            char *s;
            STRLEN len;
            SvUTF8_on(tmpsv1);
@@ -2758,7 +2726,7 @@ Perl_do_op_xmldump(pTHX_ I32 level, PerlIO *file, const OP *o)
     case OP_NEXTSTATE:
     case OP_DBSTATE:
        if (CopLINE(cCOPo))
-           S_xmldump_attr(aTHX_ level, file, "line=\"%"UVf"\"",
+           S_xmldump_attr(aTHX_ level, file, "line=\"%"UVuf"\"",
                             (UV)CopLINE(cCOPo));
        if (CopSTASHPV(cCOPo))
            S_xmldump_attr(aTHX_ level, file, "package=\"%s\"",