home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / perl / Perl / sv.c < prev    next >
C/C++ Source or Header  |  1995-06-02  |  68KB  |  3,453 lines

  1. /*    sv.c
  2.  *
  3.  *    Copyright (c) 1991-1994, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. /*
  11.  * "I wonder what the Entish is for 'yes' and 'no'," he thought.
  12.  */
  13.  
  14. #include "EXTERN.h"
  15. #include "perl.h"
  16.  
  17. /* The following is all to get DBL_DIG, in order to pick a nice
  18.    default value for printing floating point numbers in Gconvert.
  19.    (see config.h)
  20. */
  21. #ifdef I_LIMITS
  22. #include <limits.h>
  23. #endif
  24. #ifdef I_FLOAT
  25. #include <float.h>
  26. #endif
  27. #ifndef HAS_DBL_DIG
  28. #define DBL_DIG    15   /* A guess that works lots of places */
  29. #endif
  30.  
  31. static SV *more_sv _((void));
  32. static XPVIV *more_xiv _((void));
  33. static XPVNV *more_xnv _((void));
  34. static XPV *more_xpv _((void));
  35. static XRV *more_xrv _((void));
  36. static SV *new_sv _((void));
  37. static XPVIV *new_xiv _((void));
  38. static XPVNV *new_xnv _((void));
  39. static XPV *new_xpv _((void));
  40. static XRV *new_xrv _((void));
  41. static void del_xiv _((XPVIV* p));
  42. static void del_xnv _((XPVNV* p));
  43. static void del_xpv _((XPV* p));
  44. static void del_xrv _((XRV* p));
  45. static void sv_mortalgrow _((void));
  46.  
  47. static void sv_unglob _((SV* sv));
  48.  
  49. #ifdef PURIFY
  50.  
  51. #define new_SV() sv = (SV*)safemalloc(sizeof(SV))
  52. #define del_SV(p) free((char*)p)
  53.  
  54. #else
  55.  
  56. #define new_SV()            \
  57.     if (sv_root) {            \
  58.     sv = sv_root;            \
  59.     sv_root = (SV*)SvANY(sv);    \
  60.     ++sv_count;            \
  61.     }                    \
  62.     else                \
  63.     sv = more_sv();
  64.  
  65. static SV*
  66. new_sv()
  67. {
  68.     SV* sv;
  69.     if (sv_root) {
  70.     sv = sv_root;
  71.     sv_root = (SV*)SvANY(sv);
  72.     ++sv_count;
  73.     return sv;
  74.     }
  75.     return more_sv();
  76. }
  77.  
  78. #ifdef DEBUGGING
  79. #define del_SV(p)            \
  80.     if (debug & 32768)            \
  81.     del_sv(p);            \
  82.     else {                \
  83.     SvANY(p) = (void *)sv_root;    \
  84.     sv_root = p;            \
  85.     --sv_count;            \
  86.     }
  87.  
  88. static void
  89. del_sv(p)
  90. SV* p;
  91. {
  92.     if (debug & 32768) {
  93.     SV* sv;
  94.     SV* svend;
  95.     int ok = 0;
  96.     for (sv = sv_arenaroot; sv; sv = (SV *) SvANY(svend)) {
  97.         svend = &sv[1008 / sizeof(SV)];
  98.         if (p >= sv && p < svend)
  99.         ok = 1;
  100.     }
  101.     if (!ok) {
  102.         warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
  103.         return;
  104.     }
  105.     }
  106.     SvANY(p) = (void *) sv_root;
  107.     sv_root = p;
  108.     --sv_count;
  109. }
  110. #else
  111. #define del_SV(p)            \
  112.     SvANY(p) = (void *)sv_root;        \
  113.     sv_root = p;            \
  114.     --sv_count;
  115.  
  116. #endif
  117.  
  118. static SV*
  119. more_sv()
  120. {
  121.     register SV* sv;
  122.     register SV* svend;
  123.     sv_root = (SV*)safemalloc(1012);
  124.     sv = sv_root;
  125.     Zero(sv, 1012, char);
  126.     svend = &sv[1008 / sizeof(SV) - 1];
  127.     while (sv < svend) {
  128.     SvANY(sv) = (void *)(SV*)(sv + 1);
  129.     SvFLAGS(sv) = SVTYPEMASK;
  130.     sv++;
  131.     }
  132.     SvANY(sv) = 0;
  133.     sv++;
  134.     SvANY(sv) = (void *) sv_arenaroot;
  135.     sv_arenaroot = sv_root;
  136.     return new_sv();
  137. }
  138. #endif
  139.  
  140. void
  141. sv_report_used()
  142. {
  143.     SV* sv;
  144.     register SV* svend;
  145.  
  146.     for (sv = sv_arenaroot; sv; sv = (SV *) SvANY(sv)) {
  147.     svend = &sv[1008 / sizeof(SV)];
  148.     while (sv < svend) {
  149.         if (SvTYPE(sv) != SVTYPEMASK) {
  150.         fprintf(stderr, "****\n");
  151.         sv_dump(sv);
  152.         }
  153.         ++sv;
  154.     }
  155.     }
  156. }
  157.  
  158. void
  159. sv_clean_objs()
  160. {
  161.     register SV* sv;
  162.     register SV* svend;
  163.     SV* rv;
  164.  
  165.     for (sv = sv_arenaroot; sv; sv = (SV *) SvANY(sv)) {
  166.     svend = &sv[1008 / sizeof(SV)];
  167.     while (sv < svend) {
  168.         if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
  169.         DEBUG_D((fprintf(stderr, "Cleaning object ref:\n "),
  170.              sv_dump(sv));)
  171.         SvROK_off(sv);
  172.         SvRV(sv) = 0;
  173.         SvREFCNT_dec(rv);
  174.         }
  175.         /* XXX Might want to check arrays, etc. */
  176.         ++sv;
  177.     }
  178.     }
  179. }
  180.  
  181. void
  182. sv_clean_all()
  183. {
  184.     register SV* sv;
  185.     register SV* svend;
  186.  
  187.     for (sv = sv_arenaroot; sv; sv = (SV *) SvANY(sv)) {
  188.     svend = &sv[1008 / sizeof(SV)];
  189.     while (sv < svend) {
  190.         if (SvTYPE(sv) != SVTYPEMASK) {
  191.         DEBUG_D((fprintf(stderr, "Cleaning loops:\n "), sv_dump(sv));)
  192.         SvFLAGS(sv) |= SVf_BREAK;
  193.         SvREFCNT_dec(sv);
  194.         }
  195.         ++sv;
  196.     }
  197.     }
  198. }
  199.  
  200. static XPVIV*
  201. new_xiv()
  202. {
  203.     IV** xiv;
  204.     if (xiv_root) {
  205.     xiv = xiv_root;
  206.     /*
  207.      * See comment in more_xiv() -- RAM.
  208.      */
  209.     xiv_root = (IV**)*xiv;
  210.     return (XPVIV*)((char*)xiv - sizeof(XPV));
  211.     }
  212.     return more_xiv();
  213. }
  214.  
  215. static void
  216. del_xiv(p)
  217. XPVIV* p;
  218. {
  219.     IV** xiv = (IV**)((char*)(p) + sizeof(XPV));
  220.     *xiv = (IV *)xiv_root;
  221.     xiv_root = xiv;
  222. }
  223.  
  224. static XPVIV*
  225. more_xiv()
  226. {
  227.     register IV** xiv;
  228.     register IV** xivend;
  229.     XPV* ptr = (XPV*)safemalloc(1008);
  230.     ptr->xpv_pv = (char*)xiv_arenaroot;        /* linked list of xiv arenas */
  231.     xiv_arenaroot = ptr;            /* to keep Purify happy */
  232.  
  233.     xiv = (IV**) ptr;
  234.     xivend = &xiv[1008 / sizeof(IV *) - 1];
  235.     xiv += (sizeof(XPV) - 1) / sizeof(IV *) + 1;   /* fudge by size of XPV */
  236.     xiv_root = xiv;
  237.     while (xiv < xivend) {
  238.     *xiv = (IV *)(xiv + 1);
  239.     xiv++;
  240.     }
  241.     *xiv = 0;
  242.     return new_xiv();
  243. }
  244.  
  245. static XPVNV*
  246. new_xnv()
  247. {
  248.     double* xnv;
  249.     if (xnv_root) {
  250.     xnv = xnv_root;
  251.     xnv_root = *(double**)xnv;
  252.     return (XPVNV*)((char*)xnv - sizeof(XPVIV));
  253.     }
  254.     return more_xnv();
  255. }
  256.  
  257. static void
  258. del_xnv(p)
  259. XPVNV* p;
  260. {
  261.     double* xnv = (double*)((char*)(p) + sizeof(XPVIV));
  262.     *(double**)xnv = xnv_root;
  263.     xnv_root = xnv;
  264. }
  265.  
  266. static XPVNV*
  267. more_xnv()
  268. {
  269.     register double* xnv;
  270.     register double* xnvend;
  271.     xnv = (double*)safemalloc(1008);
  272.     xnvend = &xnv[1008 / sizeof(double) - 1];
  273.     xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
  274.     xnv_root = xnv;
  275.     while (xnv < xnvend) {
  276.     *(double**)xnv = (double*)(xnv + 1);
  277.     xnv++;
  278.     }
  279.     *(double**)xnv = 0;
  280.     return new_xnv();
  281. }
  282.  
  283. static XRV*
  284. new_xrv()
  285. {
  286.     XRV* xrv;
  287.     if (xrv_root) {
  288.     xrv = xrv_root;
  289.     xrv_root = (XRV*)xrv->xrv_rv;
  290.     return xrv;
  291.     }
  292.     return more_xrv();
  293. }
  294.  
  295. static void
  296. del_xrv(p)
  297. XRV* p;
  298. {
  299.     p->xrv_rv = (SV*)xrv_root;
  300.     xrv_root = p;
  301. }
  302.  
  303. static XRV*
  304. more_xrv()
  305. {
  306.     register XRV* xrv;
  307.     register XRV* xrvend;
  308.     xrv_root = (XRV*)safemalloc(1008);
  309.     xrv = xrv_root;
  310.     xrvend = &xrv[1008 / sizeof(XRV) - 1];
  311.     while (xrv < xrvend) {
  312.     xrv->xrv_rv = (SV*)(xrv + 1);
  313.     xrv++;
  314.     }
  315.     xrv->xrv_rv = 0;
  316.     return new_xrv();
  317. }
  318.  
  319. static XPV*
  320. new_xpv()
  321. {
  322.     XPV* xpv;
  323.     if (xpv_root) {
  324.     xpv = xpv_root;
  325.     xpv_root = (XPV*)xpv->xpv_pv;
  326.     return xpv;
  327.     }
  328.     return more_xpv();
  329. }
  330.  
  331. static void
  332. del_xpv(p)
  333. XPV* p;
  334. {
  335.     p->xpv_pv = (char*)xpv_root;
  336.     xpv_root = p;
  337. }
  338.  
  339. static XPV*
  340. more_xpv()
  341. {
  342.     register XPV* xpv;
  343.     register XPV* xpvend;
  344.     xpv_root = (XPV*)safemalloc(1008);
  345.     xpv = xpv_root;
  346.     xpvend = &xpv[1008 / sizeof(XPV) - 1];
  347.     while (xpv < xpvend) {
  348.     xpv->xpv_pv = (char*)(xpv + 1);
  349.     xpv++;
  350.     }
  351.     xpv->xpv_pv = 0;
  352.     return new_xpv();
  353. }
  354.  
  355. #ifdef PURIFY
  356. #define new_XIV() (void*)safemalloc(sizeof(XPVIV))
  357. #define del_XIV(p) free((char*)p)
  358. #else
  359. #define new_XIV() (void*)new_xiv()
  360. #define del_XIV(p) del_xiv(p)
  361. #endif
  362.  
  363. #ifdef PURIFY
  364. #define new_XNV() (void*)safemalloc(sizeof(XPVNV))
  365. #define del_XNV(p) free((char*)p)
  366. #else
  367. #define new_XNV() (void*)new_xnv()
  368. #define del_XNV(p) del_xnv(p)
  369. #endif
  370.  
  371. #ifdef PURIFY
  372. #define new_XRV() (void*)safemalloc(sizeof(XRV))
  373. #define del_XRV(p) free((char*)p)
  374. #else
  375. #define new_XRV() (void*)new_xrv()
  376. #define del_XRV(p) del_xrv(p)
  377. #endif
  378.  
  379. #ifdef PURIFY
  380. #define new_XPV() (void*)safemalloc(sizeof(XPV))
  381. #define del_XPV(p) free((char*)p)
  382. #else
  383. #define new_XPV() (void*)new_xpv()
  384. #define del_XPV(p) del_xpv(p)
  385. #endif
  386.  
  387. #define new_XPVIV() (void*)safemalloc(sizeof(XPVIV))
  388. #define del_XPVIV(p) free((char*)p)
  389.  
  390. #define new_XPVNV() (void*)safemalloc(sizeof(XPVNV))
  391. #define del_XPVNV(p) free((char*)p)
  392.  
  393. #define new_XPVMG() (void*)safemalloc(sizeof(XPVMG))
  394. #define del_XPVMG(p) free((char*)p)
  395.  
  396. #define new_XPVLV() (void*)safemalloc(sizeof(XPVLV))
  397. #define del_XPVLV(p) free((char*)p)
  398.  
  399. #define new_XPVAV() (void*)safemalloc(sizeof(XPVAV))
  400. #define del_XPVAV(p) free((char*)p)
  401.  
  402. #define new_XPVHV() (void*)safemalloc(sizeof(XPVHV))
  403. #define del_XPVHV(p) free((char*)p)
  404.  
  405. #define new_XPVCV() (void*)safemalloc(sizeof(XPVCV))
  406. #define del_XPVCV(p) free((char*)p)
  407.  
  408. #define new_XPVGV() (void*)safemalloc(sizeof(XPVGV))
  409. #define del_XPVGV(p) free((char*)p)
  410.  
  411. #define new_XPVBM() (void*)safemalloc(sizeof(XPVBM))
  412. #define del_XPVBM(p) free((char*)p)
  413.  
  414. #define new_XPVFM() (void*)safemalloc(sizeof(XPVFM))
  415. #define del_XPVFM(p) free((char*)p)
  416.  
  417. #define new_XPVIO() (void*)safemalloc(sizeof(XPVIO))
  418. #define del_XPVIO(p) free((char*)p)
  419.  
  420. bool
  421. sv_upgrade(sv, mt)
  422. register SV* sv;
  423. U32 mt;
  424. {
  425.     char*    pv;
  426.     U32        cur;
  427.     U32        len;
  428.     IV        iv;
  429.     double    nv;
  430.     MAGIC*    magic;
  431.     HV*        stash;
  432.  
  433.     if (SvTYPE(sv) == mt)
  434.     return TRUE;
  435.  
  436.     switch (SvTYPE(sv)) {
  437.     case SVt_NULL:
  438.     pv    = 0;
  439.     cur    = 0;
  440.     len    = 0;
  441.     iv    = 0;
  442.     nv    = 0.0;
  443.     magic    = 0;
  444.     stash    = 0;
  445.     break;
  446.     case SVt_IV:
  447.     pv    = 0;
  448.     cur    = 0;
  449.     len    = 0;
  450.     iv    = SvIVX(sv);
  451.     nv    = (double)SvIVX(sv);
  452.     del_XIV(SvANY(sv));
  453.     magic    = 0;
  454.     stash    = 0;
  455.     if (mt == SVt_NV)
  456.         mt = SVt_PVNV;
  457.     else if (mt < SVt_PVIV)
  458.         mt = SVt_PVIV;
  459.     break;
  460.     case SVt_NV:
  461.     pv    = 0;
  462.     cur    = 0;
  463.     len    = 0;
  464.     nv    = SvNVX(sv);
  465.     iv    = I_32(nv);
  466.     magic    = 0;
  467.     stash    = 0;
  468.     del_XNV(SvANY(sv));
  469.     SvANY(sv) = 0;
  470.     if (mt < SVt_PVNV)
  471.         mt = SVt_PVNV;
  472.     break;
  473.     case SVt_RV:
  474.     pv    = (char*)SvRV(sv);
  475.     cur    = 0;
  476.     len    = 0;
  477.     iv    = (IV)pv;
  478.     nv    = (double)(unsigned long)pv;
  479.     del_XRV(SvANY(sv));
  480.     magic    = 0;
  481.     stash    = 0;
  482.     break;
  483.     case SVt_PV:
  484.     nv = 0.0;
  485.     pv    = SvPVX(sv);
  486.     cur    = SvCUR(sv);
  487.     len    = SvLEN(sv);
  488.     iv    = 0;
  489.     nv    = 0.0;
  490.     magic    = 0;
  491.     stash    = 0;
  492.     del_XPV(SvANY(sv));
  493.     if (mt <= SVt_IV)
  494.         mt = SVt_PVIV;
  495.     else if (mt == SVt_NV)
  496.         mt = SVt_PVNV;
  497.     break;
  498.     case SVt_PVIV:
  499.     nv = 0.0;
  500.     pv    = SvPVX(sv);
  501.     cur    = SvCUR(sv);
  502.     len    = SvLEN(sv);
  503.     iv    = SvIVX(sv);
  504.     nv    = 0.0;
  505.     magic    = 0;
  506.     stash    = 0;
  507.     del_XPVIV(SvANY(sv));
  508.     break;
  509.     case SVt_PVNV:
  510.     nv = SvNVX(sv);
  511.     pv    = SvPVX(sv);
  512.     cur    = SvCUR(sv);
  513.     len    = SvLEN(sv);
  514.     iv    = SvIVX(sv);
  515.     nv    = SvNVX(sv);
  516.     magic    = 0;
  517.     stash    = 0;
  518.     del_XPVNV(SvANY(sv));
  519.     break;
  520.     case SVt_PVMG:
  521.     pv    = SvPVX(sv);
  522.     cur    = SvCUR(sv);
  523.     len    = SvLEN(sv);
  524.     iv    = SvIVX(sv);
  525.     nv    = SvNVX(sv);
  526.     magic    = SvMAGIC(sv);
  527.     stash    = SvSTASH(sv);
  528.     del_XPVMG(SvANY(sv));
  529.     break;
  530.     default:
  531.     croak("Can't upgrade that kind of scalar");
  532.     }
  533.  
  534.     switch (mt) {
  535.     case SVt_NULL:
  536.     croak("Can't upgrade to undef");
  537.     case SVt_IV:
  538.     SvANY(sv) = new_XIV();
  539.     SvIVX(sv)    = iv;
  540.     break;
  541.     case SVt_NV:
  542.     SvANY(sv) = new_XNV();
  543.     SvNVX(sv)    = nv;
  544.     break;
  545.     case SVt_RV:
  546.     SvANY(sv) = new_XRV();
  547.     SvRV(sv) = (SV*)pv;
  548.     break;
  549.     case SVt_PV:
  550.     SvANY(sv) = new_XPV();
  551.     SvPVX(sv)    = pv;
  552.     SvCUR(sv)    = cur;
  553.     SvLEN(sv)    = len;
  554.     break;
  555.     case SVt_PVIV:
  556.     SvANY(sv) = new_XPVIV();
  557.     SvPVX(sv)    = pv;
  558.     SvCUR(sv)    = cur;
  559.     SvLEN(sv)    = len;
  560.     SvIVX(sv)    = iv;
  561.     if (SvNIOK(sv))
  562.         (void)SvIOK_on(sv);
  563.     SvNOK_off(sv);
  564.     break;
  565.     case SVt_PVNV:
  566.     SvANY(sv) = new_XPVNV();
  567.     SvPVX(sv)    = pv;
  568.     SvCUR(sv)    = cur;
  569.     SvLEN(sv)    = len;
  570.     SvIVX(sv)    = iv;
  571.     SvNVX(sv)    = nv;
  572.     break;
  573.     case SVt_PVMG:
  574.     SvANY(sv) = new_XPVMG();
  575.     SvPVX(sv)    = pv;
  576.     SvCUR(sv)    = cur;
  577.     SvLEN(sv)    = len;
  578.     SvIVX(sv)    = iv;
  579.     SvNVX(sv)    = nv;
  580.     SvMAGIC(sv)    = magic;
  581.     SvSTASH(sv)    = stash;
  582.     break;
  583.     case SVt_PVLV:
  584.     SvANY(sv) = new_XPVLV();
  585.     SvPVX(sv)    = pv;
  586.     SvCUR(sv)    = cur;
  587.     SvLEN(sv)    = len;
  588.     SvIVX(sv)    = iv;
  589.     SvNVX(sv)    = nv;
  590.     SvMAGIC(sv)    = magic;
  591.     SvSTASH(sv)    = stash;
  592.     LvTARGOFF(sv)    = 0;
  593.     LvTARGLEN(sv)    = 0;
  594.     LvTARG(sv)    = 0;
  595.     LvTYPE(sv)    = 0;
  596.     break;
  597.     case SVt_PVAV:
  598.     SvANY(sv) = new_XPVAV();
  599.     if (pv)
  600.         Safefree(pv);
  601.     SvPVX(sv)    = 0;
  602.     AvMAX(sv)    = 0;
  603.     AvFILL(sv)    = 0;
  604.     SvIVX(sv)    = 0;
  605.     SvNVX(sv)    = 0.0;
  606.     SvMAGIC(sv)    = magic;
  607.     SvSTASH(sv)    = stash;
  608.     AvALLOC(sv)    = 0;
  609.     AvARYLEN(sv)    = 0;
  610.     AvFLAGS(sv)    = 0;
  611.     break;
  612.     case SVt_PVHV:
  613.     SvANY(sv) = new_XPVHV();
  614.     if (pv)
  615.         Safefree(pv);
  616.     SvPVX(sv)    = 0;
  617.     HvFILL(sv)    = 0;
  618.     HvMAX(sv)    = 0;
  619.     HvKEYS(sv)    = 0;
  620.     SvNVX(sv)    = 0.0;
  621.     SvMAGIC(sv)    = magic;
  622.     SvSTASH(sv)    = stash;
  623.     HvRITER(sv)    = 0;
  624.     HvEITER(sv)    = 0;
  625.     HvPMROOT(sv)    = 0;
  626.     HvNAME(sv)    = 0;
  627.     break;
  628.     case SVt_PVCV:
  629.     SvANY(sv) = new_XPVCV();
  630.     Zero(SvANY(sv), 1, XPVCV);
  631.     SvPVX(sv)    = pv;
  632.     SvCUR(sv)    = cur;
  633.     SvLEN(sv)    = len;
  634.     SvIVX(sv)    = iv;
  635.     SvNVX(sv)    = nv;
  636.     SvMAGIC(sv)    = magic;
  637.     SvSTASH(sv)    = stash;
  638.     break;
  639.     case SVt_PVGV:
  640.     SvANY(sv) = new_XPVGV();
  641.     SvPVX(sv)    = pv;
  642.     SvCUR(sv)    = cur;
  643.     SvLEN(sv)    = len;
  644.     SvIVX(sv)    = iv;
  645.     SvNVX(sv)    = nv;
  646.     SvMAGIC(sv)    = magic;
  647.     SvSTASH(sv)    = stash;
  648.     GvGP(sv)    = 0;
  649.     GvNAME(sv)    = 0;
  650.     GvNAMELEN(sv)    = 0;
  651.     GvSTASH(sv)    = 0;
  652.     break;
  653.     case SVt_PVBM:
  654.     SvANY(sv) = new_XPVBM();
  655.     SvPVX(sv)    = pv;
  656.     SvCUR(sv)    = cur;
  657.     SvLEN(sv)    = len;
  658.     SvIVX(sv)    = iv;
  659.     SvNVX(sv)    = nv;
  660.     SvMAGIC(sv)    = magic;
  661.     SvSTASH(sv)    = stash;
  662.     BmRARE(sv)    = 0;
  663.     BmUSEFUL(sv)    = 0;
  664.     BmPREVIOUS(sv)    = 0;
  665.     break;
  666.     case SVt_PVFM:
  667.     SvANY(sv) = new_XPVFM();
  668.     Zero(SvANY(sv), 1, XPVFM);
  669.     SvPVX(sv)    = pv;
  670.     SvCUR(sv)    = cur;
  671.     SvLEN(sv)    = len;
  672.     SvIVX(sv)    = iv;
  673.     SvNVX(sv)    = nv;
  674.     SvMAGIC(sv)    = magic;
  675.     SvSTASH(sv)    = stash;
  676.     break;
  677.     case SVt_PVIO:
  678.     SvANY(sv) = new_XPVIO();
  679.     Zero(SvANY(sv), 1, XPVIO);
  680.     SvPVX(sv)    = pv;
  681.     SvCUR(sv)    = cur;
  682.     SvLEN(sv)    = len;
  683.     SvIVX(sv)    = iv;
  684.     SvNVX(sv)    = nv;
  685.     SvMAGIC(sv)    = magic;
  686.     SvSTASH(sv)    = stash;
  687.     IoPAGE_LEN(sv)    = 60;
  688.     break;
  689.     }
  690.     SvFLAGS(sv) &= ~SVTYPEMASK;
  691.     SvFLAGS(sv) |= mt;
  692.     return TRUE;
  693. }
  694.  
  695. #ifdef DEBUGGING
  696. char *
  697. sv_peek(sv)
  698. register SV *sv;
  699. {
  700.     char *t = tokenbuf;
  701.     int unref = 0;
  702.  
  703.   retry:
  704.     if (!sv) {
  705.     strcpy(t, "VOID");
  706.     goto finish;
  707.     }
  708.     else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
  709.     strcpy(t, "WILD");
  710.     goto finish;
  711.     }
  712.     else if (sv == &sv_undef || sv == &sv_no || sv == &sv_yes) {
  713.     if (sv == &sv_undef) {
  714.         strcpy(t, "SV_UNDEF");
  715.         if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
  716.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  717.         SvREADONLY(sv))
  718.         goto finish;
  719.     }
  720.     else if (sv == &sv_no) {
  721.         strcpy(t, "SV_NO");
  722.         if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
  723.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  724.         !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
  725.                   SVp_POK|SVp_NOK)) &&
  726.         SvCUR(sv) == 0 &&
  727.         SvNVX(sv) == 0.0)
  728.         goto finish;
  729.     }
  730.     else {
  731.         strcpy(t, "SV_YES");
  732.         if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
  733.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  734.         !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
  735.                   SVp_POK|SVp_NOK)) &&
  736.         SvCUR(sv) == 1 &&
  737.         SvPVX(sv) && *SvPVX(sv) == '1' &&
  738.         SvNVX(sv) == 1.0)
  739.         goto finish;
  740.     }
  741.     t += strlen(t);
  742.     *t++ = ':';
  743.     }
  744.     else if (SvREFCNT(sv) == 0) {
  745.     *t++ = '(';
  746.     unref++;
  747.     }
  748.     if (SvROK(sv)) {
  749.     *t++ = '\\';
  750.     if (t - tokenbuf + unref > 10) {
  751.         strcpy(tokenbuf + unref + 3,"...");
  752.         goto finish;
  753.     }
  754.     sv = (SV*)SvRV(sv);
  755.     goto retry;
  756.     }
  757.     switch (SvTYPE(sv)) {
  758.     default:
  759.     strcpy(t,"FREED");
  760.     goto finish;
  761.  
  762.     case SVt_NULL:
  763.     strcpy(t,"UNDEF");
  764.     return tokenbuf;
  765.     case SVt_IV:
  766.     strcpy(t,"IV");
  767.     break;
  768.     case SVt_NV:
  769.     strcpy(t,"NV");
  770.     break;
  771.     case SVt_RV:
  772.     strcpy(t,"RV");
  773.     break;
  774.     case SVt_PV:
  775.     strcpy(t,"PV");
  776.     break;
  777.     case SVt_PVIV:
  778.     strcpy(t,"PVIV");
  779.     break;
  780.     case SVt_PVNV:
  781.     strcpy(t,"PVNV");
  782.     break;
  783.     case SVt_PVMG:
  784.     strcpy(t,"PVMG");
  785.     break;
  786.     case SVt_PVLV:
  787.     strcpy(t,"PVLV");
  788.     break;
  789.     case SVt_PVAV:
  790.     strcpy(t,"AV");
  791.     break;
  792.     case SVt_PVHV:
  793.     strcpy(t,"HV");
  794.     break;
  795.     case SVt_PVCV:
  796.     if (CvGV(sv))
  797.         sprintf(t, "CV(%s)", GvNAME(CvGV(sv)));
  798.     else
  799.         strcpy(t, "CV()");
  800.     goto finish;
  801.     case SVt_PVGV:
  802.     strcpy(t,"GV");
  803.     break;
  804.     case SVt_PVBM:
  805.     strcpy(t,"BM");
  806.     break;
  807.     case SVt_PVFM:
  808.     strcpy(t,"FM");
  809.     break;
  810.     case SVt_PVIO:
  811.     strcpy(t,"IO");
  812.     break;
  813.     }
  814.     t += strlen(t);
  815.  
  816.     if (SvPOKp(sv)) {
  817.     if (!SvPVX(sv))
  818.         strcpy(t, "(null)");
  819.     if (SvOOK(sv))
  820.         sprintf(t,"(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
  821.     else
  822.         sprintf(t,"(\"%.127s\")",SvPVX(sv));
  823.     }
  824.     else if (SvNOKp(sv))
  825.     sprintf(t,"(%g)",SvNVX(sv));
  826.     else if (SvIOKp(sv))
  827.     sprintf(t,"(%ld)",(long)SvIVX(sv));
  828.     else
  829.     strcpy(t,"()");
  830.     
  831.   finish:
  832.     if (unref) {
  833.     t += strlen(t);
  834.     while (unref--)
  835.         *t++ = ')';
  836.     *t = '\0';
  837.     }
  838.     return tokenbuf;
  839. }
  840. #endif
  841.  
  842. int
  843. sv_backoff(sv)
  844. register SV *sv;
  845. {
  846.     assert(SvOOK(sv));
  847.     if (SvIVX(sv)) {
  848.     char *s = SvPVX(sv);
  849.     SvLEN(sv) += SvIVX(sv);
  850.     SvPVX(sv) -= SvIVX(sv);
  851.     SvIV_set(sv, 0);
  852.     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
  853.     }
  854.     SvFLAGS(sv) &= ~SVf_OOK;
  855.     return 0;
  856. }
  857.  
  858. char *
  859. sv_grow(sv,newlen)
  860. register SV *sv;
  861. #ifndef DOSISH
  862. register I32 newlen;
  863. #else
  864. unsigned long newlen;
  865. #endif
  866. {
  867.     register char *s;
  868.  
  869. #ifdef MSDOS
  870.     if (newlen >= 0x10000) {
  871.     fprintf(stderr, "Allocation too large: %lx\n", newlen);
  872.     my_exit(1);
  873.     }
  874. #endif /* MSDOS */
  875.     if (SvROK(sv))
  876.     sv_unref(sv);
  877.     if (SvTYPE(sv) < SVt_PV) {
  878.     sv_upgrade(sv, SVt_PV);
  879.     s = SvPVX(sv);
  880.     }
  881.     else if (SvOOK(sv)) {    /* pv is offset? */
  882.     sv_backoff(sv);
  883.     s = SvPVX(sv);
  884.     if (newlen > SvLEN(sv))
  885.         newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
  886.     }
  887.     else
  888.     s = SvPVX(sv);
  889.     if (newlen > SvLEN(sv)) {        /* need more room? */
  890.         if (SvLEN(sv) && s)
  891.         Renew(s,newlen,char);
  892.         else
  893.         New(703,s,newlen,char);
  894.     SvPV_set(sv, s);
  895.         SvLEN_set(sv, newlen);
  896.     }
  897.     return s;
  898. }
  899.  
  900. void
  901. sv_setiv(sv,i)
  902. register SV *sv;
  903. IV i;
  904. {
  905.     if (SvTHINKFIRST(sv)) {
  906.     if (SvREADONLY(sv) && curcop != &compiling)
  907.         croak(no_modify);
  908.     if (SvROK(sv))
  909.         sv_unref(sv);
  910.     }
  911.     switch (SvTYPE(sv)) {
  912.     case SVt_NULL:
  913.     sv_upgrade(sv, SVt_IV);
  914.     break;
  915.     case SVt_NV:
  916.     sv_upgrade(sv, SVt_PVNV);
  917.     break;
  918.     case SVt_RV:
  919.     case SVt_PV:
  920.     sv_upgrade(sv, SVt_PVIV);
  921.     break;
  922.  
  923.     case SVt_PVGV:
  924.     if (SvFAKE(sv)) {
  925.         sv_unglob(sv);
  926.         break;
  927.     }
  928.     /* FALL THROUGH */
  929.     case SVt_PVAV:
  930.     case SVt_PVHV:
  931.     case SVt_PVCV:
  932.     case SVt_PVFM:
  933.     case SVt_PVIO:
  934.     croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
  935.         op_name[op->op_type]);
  936.     }
  937.     SvIVX(sv) = i;
  938.     (void)SvIOK_only(sv);            /* validate number */
  939.     SvTAINT(sv);
  940. }
  941.  
  942. void
  943. sv_setnv(sv,num)
  944. register SV *sv;
  945. double num;
  946. {
  947.     if (SvTHINKFIRST(sv)) {
  948.     if (SvREADONLY(sv) && curcop != &compiling)
  949.         croak(no_modify);
  950.     if (SvROK(sv))
  951.         sv_unref(sv);
  952.     }
  953.     switch (SvTYPE(sv)) {
  954.     case SVt_NULL:
  955.     case SVt_IV:
  956.     sv_upgrade(sv, SVt_NV);
  957.     break;
  958.     case SVt_NV:
  959.     case SVt_RV:
  960.     case SVt_PV:
  961.     case SVt_PVIV:
  962.     sv_upgrade(sv, SVt_PVNV);
  963.     /* FALL THROUGH */
  964.     case SVt_PVNV:
  965.     case SVt_PVMG:
  966.     case SVt_PVBM:
  967.     case SVt_PVLV:
  968.     if (SvOOK(sv))
  969.         (void)SvOOK_off(sv);
  970.     break;
  971.     case SVt_PVGV:
  972.     if (SvFAKE(sv)) {
  973.         sv_unglob(sv);
  974.         break;
  975.     }
  976.     /* FALL THROUGH */
  977.     case SVt_PVAV:
  978.     case SVt_PVHV:
  979.     case SVt_PVCV:
  980.     case SVt_PVFM:
  981.     case SVt_PVIO:
  982.     croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
  983.         op_name[op->op_type]);
  984.     }
  985.     SvNVX(sv) = num;
  986.     (void)SvNOK_only(sv);            /* validate number */
  987.     SvTAINT(sv);
  988. }
  989.  
  990. static void
  991. not_a_number(sv)
  992. SV *sv;
  993. {
  994.     char tmpbuf[64];
  995.     char *d = tmpbuf;
  996.     char *s;
  997.     int i;
  998.  
  999.     for (s = SvPVX(sv), i = 50; *s && i; s++,i--) {
  1000.     int ch = *s;
  1001.     if (ch & 128 && !isprint(ch)) {
  1002.         *d++ = 'M';
  1003.         *d++ = '-';
  1004.         ch &= 127;
  1005.     }
  1006.     if (isprint(ch))
  1007.         *d++ = ch;
  1008.     else {
  1009.         *d++ = '^';
  1010.         *d++ = ch ^ 64;
  1011.     }
  1012.     }
  1013.     if (*s) {
  1014.     *d++ = '.';
  1015.     *d++ = '.';
  1016.     *d++ = '.';
  1017.     }
  1018.     *d = '\0';
  1019.  
  1020.     if (op)
  1021.     warn("Argument \"%s\" isn't numeric for %s", tmpbuf,
  1022.         op_name[op->op_type]);
  1023.     else
  1024.     warn("Argument \"%s\" isn't numeric", tmpbuf);
  1025. }
  1026.  
  1027. IV
  1028. sv_2iv(sv)
  1029. register SV *sv;
  1030. {
  1031.     if (!sv)
  1032.     return 0;
  1033.     if (SvGMAGICAL(sv)) {
  1034.     mg_get(sv);
  1035.     if (SvIOKp(sv))
  1036.         return SvIVX(sv);
  1037.     if (SvNOKp(sv)) {
  1038.         if (SvNVX(sv) < 0.0)
  1039.         return I_V(SvNVX(sv));
  1040.         else
  1041.         return (IV) U_V(SvNVX(sv));
  1042.     }
  1043.     if (SvPOKp(sv) && SvLEN(sv)) {
  1044.         if (dowarn && !looks_like_number(sv))
  1045.         not_a_number(sv);
  1046.         return (IV)atol(SvPVX(sv));
  1047.     }
  1048.         if (!SvROK(sv)) {
  1049.             return 0;
  1050.         }
  1051.     }
  1052.     if (SvTHINKFIRST(sv)) {
  1053.     if (SvROK(sv)) {
  1054. #ifdef OVERLOAD
  1055.       SV* tmpstr;
  1056.       if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
  1057.         return SvIV(tmpstr);
  1058. #endif /* OVERLOAD */
  1059.       return (IV)SvRV(sv);
  1060.     }
  1061.     if (SvREADONLY(sv)) {
  1062.         if (SvNOKp(sv)) {
  1063.         if (SvNVX(sv) < 0.0)
  1064.             return I_V(SvNVX(sv));
  1065.         else
  1066.             return (IV) U_V(SvNVX(sv));
  1067.         }
  1068.         if (SvPOKp(sv) && SvLEN(sv)) {
  1069.         if (dowarn && !looks_like_number(sv))
  1070.             not_a_number(sv);
  1071.         return (IV)atol(SvPVX(sv));
  1072.         }
  1073.         if (dowarn)
  1074.         warn(warn_uninit);
  1075.         return 0;
  1076.     }
  1077.     }
  1078.     switch (SvTYPE(sv)) {
  1079.     case SVt_NULL:
  1080.     sv_upgrade(sv, SVt_IV);
  1081.     return SvIVX(sv);
  1082.     case SVt_PV:
  1083.     sv_upgrade(sv, SVt_PVIV);
  1084.     break;
  1085.     case SVt_NV:
  1086.     sv_upgrade(sv, SVt_PVNV);
  1087.     break;
  1088.     }
  1089.     if (SvNOKp(sv)) {
  1090.     if (SvNVX(sv) < 0.0)
  1091.         SvIVX(sv) = I_V(SvNVX(sv));
  1092.     else
  1093.         SvIVX(sv) = (IV) U_V(SvNVX(sv));
  1094.     }
  1095.     else if (SvPOKp(sv) && SvLEN(sv)) {
  1096.     if (dowarn && !looks_like_number(sv))
  1097.         not_a_number(sv);
  1098.     SvIVX(sv) = (IV)atol(SvPVX(sv));
  1099.     }
  1100.     else  {
  1101.     if (dowarn && !localizing)
  1102.         warn(warn_uninit);
  1103.     return 0;
  1104.     }
  1105.     (void)SvIOK_on(sv);
  1106.     DEBUG_c(fprintf(stderr,"0x%lx 2iv(%ld)\n",
  1107.     (unsigned long)sv,(long)SvIVX(sv)));
  1108.     return SvIVX(sv);
  1109. }
  1110.  
  1111. double
  1112. sv_2nv(sv)
  1113. register SV *sv;
  1114. {
  1115.     if (!sv)
  1116.     return 0.0;
  1117.     if (SvGMAGICAL(sv)) {
  1118.     mg_get(sv);
  1119.     if (SvNOKp(sv))
  1120.         return SvNVX(sv);
  1121.     if (SvPOKp(sv) && SvLEN(sv)) {
  1122.         if (dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1123.         not_a_number(sv);
  1124.         return atof(SvPVX(sv));
  1125.     }
  1126.     if (SvIOKp(sv))
  1127.         return (double)SvIVX(sv);
  1128.         if (!SvROK(sv)) {
  1129.             return 0;
  1130.         }
  1131.     }
  1132.     if (SvTHINKFIRST(sv)) {
  1133.     if (SvROK(sv)) {
  1134. #ifdef OVERLOAD
  1135.       SV* tmpstr;
  1136.       if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
  1137.         return SvNV(tmpstr);
  1138. #endif /* OVERLOAD */
  1139.       return (double)(unsigned long)SvRV(sv);
  1140.     }
  1141.     if (SvREADONLY(sv)) {
  1142.         if (SvPOKp(sv) && SvLEN(sv)) {
  1143.         if (dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1144.             not_a_number(sv);
  1145.         return atof(SvPVX(sv));
  1146.         }
  1147.         if (SvIOKp(sv))
  1148.         return (double)SvIVX(sv);
  1149.         if (dowarn)
  1150.         warn(warn_uninit);
  1151.         return 0.0;
  1152.     }
  1153.     }
  1154.     if (SvTYPE(sv) < SVt_NV) {
  1155.     if (SvTYPE(sv) == SVt_IV)
  1156.         sv_upgrade(sv, SVt_PVNV);
  1157.     else
  1158.         sv_upgrade(sv, SVt_NV);
  1159.     DEBUG_c(fprintf(stderr,"0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
  1160.     }
  1161.     else if (SvTYPE(sv) < SVt_PVNV)
  1162.     sv_upgrade(sv, SVt_PVNV);
  1163.     if (SvIOKp(sv) &&
  1164.         (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
  1165.     {
  1166.     SvNVX(sv) = (double)SvIVX(sv);
  1167.     }
  1168.     else if (SvPOKp(sv) && SvLEN(sv)) {
  1169.     if (dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1170.         not_a_number(sv);
  1171.     SvNVX(sv) = atof(SvPVX(sv));
  1172.     }
  1173.     else  {
  1174.     if (dowarn && !localizing)
  1175.         warn(warn_uninit);
  1176.     return 0.0;
  1177.     }
  1178.     SvNOK_on(sv);
  1179.     DEBUG_c(fprintf(stderr,"0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
  1180.     return SvNVX(sv);
  1181. }
  1182.  
  1183. char *
  1184. sv_2pv(sv, lp)
  1185. register SV *sv;
  1186. STRLEN *lp;
  1187. {
  1188.     register char *s;
  1189.     int olderrno;
  1190.  
  1191.     if (!sv) {
  1192.     *lp = 0;
  1193.     return "";
  1194.     }
  1195.     if (SvGMAGICAL(sv)) {
  1196.     mg_get(sv);
  1197.     if (SvPOKp(sv)) {
  1198.         *lp = SvCUR(sv);
  1199.         return SvPVX(sv);
  1200.     }
  1201.     if (SvIOKp(sv)) {
  1202.         (void)sprintf(tokenbuf,"%ld",(long)SvIVX(sv));
  1203.         goto tokensave;
  1204.     }
  1205.     if (SvNOKp(sv)) {
  1206.         Gconvert(SvNVX(sv), DBL_DIG, 0, tokenbuf);
  1207.         goto tokensave;
  1208.     }
  1209.         if (!SvROK(sv)) {
  1210.             *lp = 0;
  1211.             return "";
  1212.         }
  1213.     }
  1214.     if (SvTHINKFIRST(sv)) {
  1215.     if (SvROK(sv)) {
  1216. #ifdef OVERLOAD
  1217.         SV* tmpstr;
  1218.         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
  1219.           return SvPV(tmpstr,*lp);
  1220. #endif /* OVERLOAD */
  1221.         sv = (SV*)SvRV(sv);
  1222.         if (!sv)
  1223.         s = "NULLREF";
  1224.         else {
  1225.         switch (SvTYPE(sv)) {
  1226.         case SVt_NULL:
  1227.         case SVt_IV:
  1228.         case SVt_NV:
  1229.         case SVt_RV:
  1230.         case SVt_PV:
  1231.         case SVt_PVIV:
  1232.         case SVt_PVNV:
  1233.         case SVt_PVBM:
  1234.         case SVt_PVMG:    s = "SCALAR";            break;
  1235.         case SVt_PVLV:    s = "LVALUE";            break;
  1236.         case SVt_PVAV:    s = "ARRAY";            break;
  1237.         case SVt_PVHV:    s = "HASH";            break;
  1238.         case SVt_PVCV:    s = "CODE";            break;
  1239.         case SVt_PVGV:    s = "GLOB";            break;
  1240.         case SVt_PVFM:    s = "FORMATLINE";        break;
  1241.         case SVt_PVIO:    s = "FILEHANDLE";        break;
  1242.         default:    s = "UNKNOWN";            break;
  1243.         }
  1244.         if (SvOBJECT(sv))
  1245.             sprintf(tokenbuf, "%s=%s(0x%lx)",
  1246.                 HvNAME(SvSTASH(sv)), s, (unsigned long)sv);
  1247.         else
  1248.             sprintf(tokenbuf, "%s(0x%lx)", s, (unsigned long)sv);
  1249.         goto tokensaveref;
  1250.         }
  1251.         *lp = strlen(s);
  1252.         return s;
  1253.     }
  1254.     if (SvREADONLY(sv)) {
  1255.         if (SvNOKp(sv)) {
  1256.         Gconvert(SvNVX(sv), DBL_DIG, 0, tokenbuf);
  1257.         goto tokensave;
  1258.         }
  1259.         if (SvIOKp(sv)) {
  1260.         (void)sprintf(tokenbuf,"%ld",(long)SvIVX(sv));
  1261.         goto tokensave;
  1262.         }
  1263.         if (dowarn)
  1264.         warn(warn_uninit);
  1265.         *lp = 0;
  1266.         return "";
  1267.     }
  1268.     }
  1269.     if (!SvUPGRADE(sv, SVt_PV))
  1270.     return 0;
  1271.     if (SvNOKp(sv)) {
  1272.     if (SvTYPE(sv) < SVt_PVNV)
  1273.         sv_upgrade(sv, SVt_PVNV);
  1274.     SvGROW(sv, 28);
  1275.     s = SvPVX(sv);
  1276.     olderrno = errno;    /* some Xenix systems wipe out errno here */
  1277. #ifdef apollo
  1278.     if (SvNVX(sv) == 0.0)
  1279.         (void)strcpy(s,"0");
  1280.     else
  1281. #endif /*apollo*/
  1282.         Gconvert(SvNVX(sv), DBL_DIG, 0, s);
  1283.     errno = olderrno;
  1284. #ifdef FIXNEGATIVEZERO
  1285.         if (*s == '-' && s[1] == '0' && !s[2])
  1286.         strcpy(s,"0");
  1287. #endif
  1288.     while (*s) s++;
  1289. #ifdef hcx
  1290.     if (s[-1] == '.')
  1291.         s--;
  1292. #endif
  1293.     }
  1294.     else if (SvIOKp(sv)) {
  1295.     if (SvTYPE(sv) < SVt_PVIV)
  1296.         sv_upgrade(sv, SVt_PVIV);
  1297.     SvGROW(sv, 11);
  1298.     s = SvPVX(sv);
  1299.     olderrno = errno;    /* some Xenix systems wipe out errno here */
  1300.     (void)sprintf(s,"%ld",(long)SvIVX(sv));
  1301.     errno = olderrno;
  1302.     while (*s) s++;
  1303.     }
  1304.     else {
  1305.     if (dowarn && !localizing)
  1306.         warn(warn_uninit);
  1307.     *lp = 0;
  1308.     return "";
  1309.     }
  1310.     *s = '\0';
  1311.     *lp = s - SvPVX(sv);
  1312.     SvCUR_set(sv, *lp);
  1313.     SvPOK_on(sv);
  1314.     DEBUG_c(fprintf(stderr,"0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
  1315.     return SvPVX(sv);
  1316.  
  1317.   tokensave:
  1318.     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
  1319.     /* Sneaky stuff here */
  1320.  
  1321.       tokensaveref:
  1322.     sv = sv_newmortal();
  1323.     *lp = strlen(tokenbuf);
  1324.     sv_setpvn(sv, tokenbuf, *lp);
  1325.     return SvPVX(sv);
  1326.     }
  1327.     else {
  1328.     STRLEN len;
  1329.     
  1330. #ifdef FIXNEGATIVEZERO
  1331.     if (*tokenbuf == '-' && tokenbuf[1] == '0' && !tokenbuf[2])
  1332.         strcpy(tokenbuf,"0");
  1333. #endif
  1334.     (void)SvUPGRADE(sv, SVt_PV);
  1335.     len = *lp = strlen(tokenbuf);
  1336.     s = SvGROW(sv, len + 1);
  1337.     SvCUR_set(sv, len);
  1338.     (void)strcpy(s, tokenbuf);
  1339.     /* NO SvPOK_on(sv) here! */
  1340.     return s;
  1341.     }
  1342. }
  1343.  
  1344. /* This function is only called on magical items */
  1345. bool
  1346. sv_2bool(sv)
  1347. register SV *sv;
  1348. {
  1349.     if (SvGMAGICAL(sv))
  1350.     mg_get(sv);
  1351.  
  1352.     if (!SvOK(sv))
  1353.     return 0;
  1354.     if (SvROK(sv)) {
  1355. #ifdef OVERLOAD
  1356.       {
  1357.     SV* tmpsv;
  1358.     if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
  1359.       return SvTRUE(tmpsv);
  1360.       }
  1361. #endif /* OVERLOAD */
  1362.       return SvRV(sv) != 0;
  1363.     }
  1364.     if (SvPOKp(sv)) {
  1365.     register XPV* Xpv;
  1366.     if ((Xpv = (XPV*)SvANY(sv)) &&
  1367.         (*Xpv->xpv_pv > '0' ||
  1368.         Xpv->xpv_cur > 1 ||
  1369.         (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
  1370.         return 1;
  1371.     else
  1372.         return 0;
  1373.     }
  1374.     else {
  1375.     if (SvIOKp(sv))
  1376.         return SvIVX(sv) != 0;
  1377.     else {
  1378.         if (SvNOKp(sv))
  1379.         return SvNVX(sv) != 0.0;
  1380.         else
  1381.         return FALSE;
  1382.     }
  1383.     }
  1384. }
  1385.  
  1386. /* Note: sv_setsv() should not be called with a source string that needs
  1387.  * to be reused, since it may destroy the source string if it is marked
  1388.  * as temporary.
  1389.  */
  1390.  
  1391. void
  1392. sv_setsv(dstr,sstr)
  1393. SV *dstr;
  1394. register SV *sstr;
  1395. {
  1396.     register U32 sflags;
  1397.     register int dtype;
  1398.     register int stype;
  1399.  
  1400.     if (sstr == dstr)
  1401.     return;
  1402.     if (SvTHINKFIRST(dstr)) {
  1403.     if (SvREADONLY(dstr) && curcop != &compiling)
  1404.         croak(no_modify);
  1405.     if (SvROK(dstr))
  1406.         sv_unref(dstr);
  1407.     }
  1408.     if (!sstr)
  1409.     sstr = &sv_undef;
  1410.     stype = SvTYPE(sstr);
  1411.     dtype = SvTYPE(dstr);
  1412.  
  1413. #ifdef OVERLOAD
  1414.     SvAMAGIC_off(dstr);
  1415. #endif /* OVERLOAD */
  1416.     /* There's a lot of redundancy below but we're going for speed here */
  1417.  
  1418.     switch (stype) {
  1419.     case SVt_NULL:
  1420.     (void)SvOK_off(dstr);
  1421.     return;
  1422.     case SVt_IV:
  1423.     if (dtype <= SVt_PV) {
  1424.         if (dtype < SVt_IV)
  1425.         sv_upgrade(dstr, SVt_IV);
  1426.         else if (dtype == SVt_NV)
  1427.         sv_upgrade(dstr, SVt_PVNV);
  1428.         else if (dtype <= SVt_PV)
  1429.         sv_upgrade(dstr, SVt_PVIV);
  1430.     }
  1431.     break;
  1432.     case SVt_NV:
  1433.     if (dtype <= SVt_PVIV) {
  1434.         if (dtype < SVt_NV)
  1435.         sv_upgrade(dstr, SVt_NV);
  1436.         else if (dtype == SVt_PVIV)
  1437.         sv_upgrade(dstr, SVt_PVNV);
  1438.         else if (dtype <= SVt_PV)
  1439.         sv_upgrade(dstr, SVt_PVNV);
  1440.     }
  1441.     break;
  1442.     case SVt_RV:
  1443.     if (dtype < SVt_RV)
  1444.         sv_upgrade(dstr, SVt_RV);
  1445.     break;
  1446.     case SVt_PV:
  1447.     if (dtype < SVt_PV)
  1448.         sv_upgrade(dstr, SVt_PV);
  1449.     break;
  1450.     case SVt_PVIV:
  1451.     if (dtype < SVt_PVIV)
  1452.         sv_upgrade(dstr, SVt_PVIV);
  1453.     break;
  1454.     case SVt_PVNV:
  1455.     if (dtype < SVt_PVNV)
  1456.         sv_upgrade(dstr, SVt_PVNV);
  1457.     break;
  1458.     case SVt_PVGV:
  1459.     if (dtype <= SVt_PVGV) {
  1460.         if (dtype < SVt_PVGV) {
  1461.         char *name = GvNAME(sstr);
  1462.         STRLEN len = GvNAMELEN(sstr);
  1463.         sv_upgrade(dstr, SVt_PVGV);
  1464.         sv_magic(dstr, dstr, '*', name, len);
  1465.         GvSTASH(dstr) = GvSTASH(sstr);
  1466.         GvNAME(dstr) = savepvn(name, len);
  1467.         GvNAMELEN(dstr) = len;
  1468.         SvFAKE_on(dstr);    /* can coerce to non-glob */
  1469.         }
  1470.         (void)SvOK_off(dstr);
  1471.         if (!GvAV(sstr))
  1472.         gv_AVadd(sstr);
  1473.         if (!GvHV(sstr))
  1474.         gv_HVadd(sstr);
  1475.         if (!GvIO(sstr))
  1476.         gv_IOadd(sstr);
  1477.         if (GvGP(dstr))
  1478.         gp_free(dstr);
  1479.         GvGP(dstr) = gp_ref(GvGP(sstr));
  1480.         SvTAINT(dstr);
  1481.         GvFLAGS(dstr) &= ~GVf_INTRO;    /* one-shot flag */
  1482.         SvMULTI_on(dstr);
  1483.         return;
  1484.     }
  1485.     /* FALL THROUGH */
  1486.  
  1487.     default:
  1488.     if (dtype < stype)
  1489.         sv_upgrade(dstr, stype);
  1490.     if (SvGMAGICAL(sstr))
  1491.         mg_get(sstr);
  1492.     }
  1493.  
  1494.     sflags = SvFLAGS(sstr);
  1495.  
  1496.     if (sflags & SVf_ROK) {
  1497.     if (dtype >= SVt_PV) {
  1498.         if (dtype == SVt_PVGV) {
  1499.         SV *sref = SvREFCNT_inc(SvRV(sstr));
  1500.         SV *dref = 0;
  1501.         int intro = GvFLAGS(dstr) & GVf_INTRO;
  1502.  
  1503.         if (intro) {
  1504.             GP *gp;
  1505.             GvGP(dstr)->gp_refcnt--;
  1506.             Newz(602,gp, 1, GP);
  1507.             GvGP(dstr) = gp;
  1508.             GvREFCNT(dstr) = 1;
  1509.             GvSV(dstr) = NEWSV(72,0);
  1510.             GvLINE(dstr) = curcop->cop_line;
  1511.             GvEGV(dstr) = dstr;
  1512.             GvFLAGS(dstr) &= ~GVf_INTRO;    /* one-shot flag */
  1513.         }
  1514.         SvMULTI_on(dstr);
  1515.         switch (SvTYPE(sref)) {
  1516.         case SVt_PVAV:
  1517.             if (intro)
  1518.             SAVESPTR(GvAV(dstr));
  1519.             else
  1520.             dref = (SV*)GvAV(dstr);
  1521.             GvAV(dstr) = (AV*)sref;
  1522.             break;
  1523.         case SVt_PVHV:
  1524.             if (intro)
  1525.             SAVESPTR(GvHV(dstr));
  1526.             else
  1527.             dref = (SV*)GvHV(dstr);
  1528.             GvHV(dstr) = (HV*)sref;
  1529.             break;
  1530.         case SVt_PVCV:
  1531.             if (intro)
  1532.             SAVESPTR(GvCV(dstr));
  1533.             else {
  1534.             CV* cv = GvCV(dstr);
  1535.             dref = (SV*)cv;
  1536.             if (dowarn && cv && sref != dref &&
  1537.                 !GvCVGEN((GV*)dstr) &&
  1538.                 (CvROOT(cv) || CvXSUB(cv)) )
  1539.                 warn("Subroutine %s redefined", GvENAME((GV*)dstr));
  1540.             }
  1541.             GvFLAGS(dstr) |= GVf_IMPORTED;
  1542.             GvCV(dstr) = (CV*)sref;
  1543.             break;
  1544.         default:
  1545.             if (intro)
  1546.             SAVESPTR(GvSV(dstr));
  1547.             else
  1548.             dref = (SV*)GvSV(dstr);
  1549.             GvSV(dstr) = sref;
  1550.             break;
  1551.         }
  1552.         if (dref)
  1553.             SvREFCNT_dec(dref);
  1554.         if (intro)
  1555.             SAVEFREESV(sref);
  1556.         SvTAINT(dstr);
  1557.         return;
  1558.         }
  1559.         if (SvPVX(dstr)) {
  1560.         Safefree(SvPVX(dstr));
  1561.         SvLEN(dstr)=SvCUR(dstr)=0;
  1562.         }
  1563.     }
  1564.     (void)SvOK_off(dstr);
  1565.     SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
  1566.     SvROK_on(dstr);
  1567.     if (sflags & SVp_NOK) {
  1568.         SvNOK_on(dstr);
  1569.         SvNVX(dstr) = SvNVX(sstr);
  1570.     }
  1571.     if (sflags & SVp_IOK) {
  1572.         (void)SvIOK_on(dstr);
  1573.         SvIVX(dstr) = SvIVX(sstr);
  1574.     }
  1575. #ifdef OVERLOAD
  1576.     if (SvAMAGIC(sstr)) {
  1577.         SvAMAGIC_on(dstr);
  1578.     }
  1579. #endif /* OVERLOAD */
  1580.     }
  1581.     else if (sflags & SVp_POK) {
  1582.  
  1583.     /*
  1584.      * Check to see if we can just swipe the string.  If so, it's a
  1585.      * possible small lose on short strings, but a big win on long ones.
  1586.      * It might even be a win on short strings if SvPVX(dstr)
  1587.      * has to be allocated and SvPVX(sstr) has to be freed.
  1588.      */
  1589.  
  1590.     if (SvTEMP(sstr)) {        /* slated for free anyway? */
  1591.         if (SvPVX(dstr)) {        /* we know that dtype >= SVt_PV */
  1592.         (void)SvOOK_off(dstr);
  1593.         Safefree(SvPVX(dstr));
  1594.         }
  1595.         SvPV_set(dstr, SvPVX(sstr));
  1596.         SvLEN_set(dstr, SvLEN(sstr));
  1597.         SvCUR_set(dstr, SvCUR(sstr));
  1598.         (void)SvPOK_only(dstr);
  1599.         SvTEMP_off(dstr);
  1600.         SvPV_set(sstr, Nullch);
  1601.         SvLEN_set(sstr, 0);
  1602.         SvPOK_off(sstr);            /* wipe out any weird flags */
  1603.         SvPVX(sstr) = 0;            /* so sstr frees uneventfully */
  1604.     }
  1605.     else {                    /* have to copy actual string */
  1606.         STRLEN len = SvCUR(sstr);
  1607.  
  1608.         SvGROW(dstr, len + 1);        /* inlined from sv_setpvn */
  1609.         Move(SvPVX(sstr),SvPVX(dstr),len,char);
  1610.         SvCUR_set(dstr, len);
  1611.         *SvEND(dstr) = '\0';
  1612.         (void)SvPOK_only(dstr);
  1613.     }
  1614.     /*SUPPRESS 560*/
  1615.     if (sflags & SVp_NOK) {
  1616.         SvNOK_on(dstr);
  1617.         SvNVX(dstr) = SvNVX(sstr);
  1618.     }
  1619.     if (sflags & SVp_IOK) {
  1620.         (void)SvIOK_on(dstr);
  1621.         SvIVX(dstr) = SvIVX(sstr);
  1622.     }
  1623.     }
  1624.     else if (sflags & SVp_NOK) {
  1625.     SvNVX(dstr) = SvNVX(sstr);
  1626.     (void)SvNOK_only(dstr);
  1627.     if (SvIOK(sstr)) {
  1628.         (void)SvIOK_on(dstr);
  1629.         SvIVX(dstr) = SvIVX(sstr);
  1630.     }
  1631.     }
  1632.     else if (sflags & SVp_IOK) {
  1633.     (void)SvIOK_only(dstr);
  1634.     SvIVX(dstr) = SvIVX(sstr);
  1635.     }
  1636.     else {
  1637.     (void)SvOK_off(dstr);
  1638.     }
  1639.     SvTAINT(dstr);
  1640. }
  1641.  
  1642. void
  1643. sv_setpvn(sv,ptr,len)
  1644. register SV *sv;
  1645. register char *ptr;
  1646. register STRLEN len;
  1647. {
  1648.     assert(len >= 0);
  1649.     if (SvTHINKFIRST(sv)) {
  1650.     if (SvREADONLY(sv) && curcop != &compiling)
  1651.         croak(no_modify);
  1652.     if (SvROK(sv))
  1653.         sv_unref(sv);
  1654.     }
  1655.     if (!ptr) {
  1656.     (void)SvOK_off(sv);
  1657.     return;
  1658.     }
  1659.     if (!SvUPGRADE(sv, SVt_PV))
  1660.     return;
  1661.     SvGROW(sv, len + 1);
  1662.     Move(ptr,SvPVX(sv),len,char);
  1663.     SvCUR_set(sv, len);
  1664.     *SvEND(sv) = '\0';
  1665.     (void)SvPOK_only(sv);        /* validate pointer */
  1666.     SvTAINT(sv);
  1667. }
  1668.  
  1669. void
  1670. sv_setpv(sv,ptr)
  1671. register SV *sv;
  1672. register char *ptr;
  1673. {
  1674.     register STRLEN len;
  1675.  
  1676.     if (SvTHINKFIRST(sv)) {
  1677.     if (SvREADONLY(sv) && curcop != &compiling)
  1678.         croak(no_modify);
  1679.     if (SvROK(sv))
  1680.         sv_unref(sv);
  1681.     }
  1682.     if (!ptr) {
  1683.     (void)SvOK_off(sv);
  1684.     return;
  1685.     }
  1686.     len = strlen(ptr);
  1687.     if (!SvUPGRADE(sv, SVt_PV))
  1688.     return;
  1689.     SvGROW(sv, len + 1);
  1690.     Move(ptr,SvPVX(sv),len+1,char);
  1691.     SvCUR_set(sv, len);
  1692.     (void)SvPOK_only(sv);        /* validate pointer */
  1693.     SvTAINT(sv);
  1694. }
  1695.  
  1696. void
  1697. sv_usepvn(sv,ptr,len)
  1698. register SV *sv;
  1699. register char *ptr;
  1700. register STRLEN len;
  1701. {
  1702.     if (SvTHINKFIRST(sv)) {
  1703.     if (SvREADONLY(sv) && curcop != &compiling)
  1704.         croak(no_modify);
  1705.     if (SvROK(sv))
  1706.         sv_unref(sv);
  1707.     }
  1708.     if (!SvUPGRADE(sv, SVt_PV))
  1709.     return;
  1710.     if (!ptr) {
  1711.     (void)SvOK_off(sv);
  1712.     return;
  1713.     }
  1714.     if (SvPVX(sv))
  1715.     Safefree(SvPVX(sv));
  1716.     Renew(ptr, len+1, char);
  1717.     SvPVX(sv) = ptr;
  1718.     SvCUR_set(sv, len);
  1719.     SvLEN_set(sv, len+1);
  1720.     *SvEND(sv) = '\0';
  1721.     (void)SvPOK_only(sv);        /* validate pointer */
  1722.     SvTAINT(sv);
  1723. }
  1724.  
  1725. void
  1726. sv_chop(sv,ptr)    /* like set but assuming ptr is in sv */
  1727. register SV *sv;
  1728. register char *ptr;
  1729. {
  1730.     register STRLEN delta;
  1731.  
  1732.     if (!ptr || !SvPOKp(sv))
  1733.     return;
  1734.     if (SvTHINKFIRST(sv)) {
  1735.     if (SvREADONLY(sv) && curcop != &compiling)
  1736.         croak(no_modify);
  1737.     if (SvROK(sv))
  1738.         sv_unref(sv);
  1739.     }
  1740.     if (SvTYPE(sv) < SVt_PVIV)
  1741.     sv_upgrade(sv,SVt_PVIV);
  1742.  
  1743.     if (!SvOOK(sv)) {
  1744.     SvIVX(sv) = 0;
  1745.     SvFLAGS(sv) |= SVf_OOK;
  1746.     }
  1747.     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
  1748.     delta = ptr - SvPVX(sv);
  1749.     SvLEN(sv) -= delta;
  1750.     SvCUR(sv) -= delta;
  1751.     SvPVX(sv) += delta;
  1752.     SvIVX(sv) += delta;
  1753. }
  1754.  
  1755. void
  1756. sv_catpvn(sv,ptr,len)
  1757. register SV *sv;
  1758. register char *ptr;
  1759. register STRLEN len;
  1760. {
  1761.     STRLEN tlen;
  1762.     char *junk;
  1763.  
  1764.     junk = SvPV_force(sv, tlen);
  1765.     SvGROW(sv, tlen + len + 1);
  1766.     Move(ptr,SvPVX(sv)+tlen,len,char);
  1767.     SvCUR(sv) += len;
  1768.     *SvEND(sv) = '\0';
  1769.     (void)SvPOK_only(sv);        /* validate pointer */
  1770.     SvTAINT(sv);
  1771. }
  1772.  
  1773. void
  1774. sv_catsv(dstr,sstr)
  1775. SV *dstr;
  1776. register SV *sstr;
  1777. {
  1778.     char *s;
  1779.     STRLEN len;
  1780.     if (!sstr)
  1781.     return;
  1782.     if (s = SvPV(sstr, len))
  1783.     sv_catpvn(dstr,s,len);
  1784. }
  1785.  
  1786. void
  1787. sv_catpv(sv,ptr)
  1788. register SV *sv;
  1789. register char *ptr;
  1790. {
  1791.     register STRLEN len;
  1792.     STRLEN tlen;
  1793.     char *junk;
  1794.  
  1795.     if (!ptr)
  1796.     return;
  1797.     junk = SvPV_force(sv, tlen);
  1798.     len = strlen(ptr);
  1799.     SvGROW(sv, tlen + len + 1);
  1800.     Move(ptr,SvPVX(sv)+tlen,len+1,char);
  1801.     SvCUR(sv) += len;
  1802.     (void)SvPOK_only(sv);        /* validate pointer */
  1803.     SvTAINT(sv);
  1804. }
  1805.  
  1806. SV *
  1807. #ifdef LEAKTEST
  1808. newSV(x,len)
  1809. I32 x;
  1810. #else
  1811. newSV(len)
  1812. #endif
  1813. STRLEN len;
  1814. {
  1815.     register SV *sv;
  1816.     
  1817.     new_SV();
  1818.     SvANY(sv) = 0;
  1819.     SvREFCNT(sv) = 1;
  1820.     SvFLAGS(sv) = 0;
  1821.     if (len) {
  1822.     sv_upgrade(sv, SVt_PV);
  1823.     SvGROW(sv, len + 1);
  1824.     }
  1825.     return sv;
  1826. }
  1827.  
  1828. void
  1829. sv_magic(sv, obj, how, name, namlen)
  1830. register SV *sv;
  1831. SV *obj;
  1832. int how;
  1833. char *name;
  1834. I32 namlen;
  1835. {
  1836.     MAGIC* mg;
  1837.     
  1838.     if (SvREADONLY(sv) && curcop != &compiling && !strchr("gB", how))
  1839.     croak(no_modify);
  1840.     if (SvMAGICAL(sv)) {
  1841.     if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
  1842.         if (how == 't')
  1843.         mg->mg_len |= 1;
  1844.         return;
  1845.     }
  1846.     }
  1847.     else {
  1848.     if (!SvUPGRADE(sv, SVt_PVMG))
  1849.         return;
  1850.     }
  1851.     Newz(702,mg, 1, MAGIC);
  1852.     mg->mg_moremagic = SvMAGIC(sv);
  1853.  
  1854.     SvMAGIC(sv) = mg;
  1855.     if (!obj || obj == sv || how == '#')
  1856.     mg->mg_obj = obj;
  1857.     else {
  1858.     mg->mg_obj = SvREFCNT_inc(obj);
  1859.     mg->mg_flags |= MGf_REFCOUNTED;
  1860.     }
  1861.     mg->mg_type = how;
  1862.     mg->mg_len = namlen;
  1863.     if (name && namlen >= 0)
  1864.     mg->mg_ptr = savepvn(name, namlen);
  1865.     switch (how) {
  1866.     case 0:
  1867.     mg->mg_virtual = &vtbl_sv;
  1868.     break;
  1869. #ifdef OVERLOAD
  1870.     case 'A':
  1871.         mg->mg_virtual = &vtbl_amagic;
  1872.         break;
  1873.     case 'a':
  1874.         mg->mg_virtual = &vtbl_amagicelem;
  1875.         break;
  1876.     case 'c':
  1877.         mg->mg_virtual = 0;
  1878.         break;
  1879. #endif /* OVERLOAD */
  1880.     case 'B':
  1881.     mg->mg_virtual = &vtbl_bm;
  1882.     break;
  1883.     case 'E':
  1884.     mg->mg_virtual = &vtbl_env;
  1885.     break;
  1886.     case 'e':
  1887.     mg->mg_virtual = &vtbl_envelem;
  1888.     break;
  1889.     case 'g':
  1890.     mg->mg_virtual = &vtbl_mglob;
  1891.     break;
  1892.     case 'I':
  1893.     mg->mg_virtual = &vtbl_isa;
  1894.     break;
  1895.     case 'i':
  1896.     mg->mg_virtual = &vtbl_isaelem;
  1897.     break;
  1898.     case 'L':
  1899.     SvRMAGICAL_on(sv);
  1900.     mg->mg_virtual = 0;
  1901.     break;
  1902.     case 'l':
  1903.     mg->mg_virtual = &vtbl_dbline;
  1904.     break;
  1905.     case 'P':
  1906.     mg->mg_virtual = &vtbl_pack;
  1907.     break;
  1908.     case 'p':
  1909.     case 'q':
  1910.     mg->mg_virtual = &vtbl_packelem;
  1911.     break;
  1912.     case 'S':
  1913.     mg->mg_virtual = &vtbl_sig;
  1914.     break;
  1915.     case 's':
  1916.     mg->mg_virtual = &vtbl_sigelem;
  1917.     break;
  1918.     case 't':
  1919.     mg->mg_virtual = &vtbl_taint;
  1920.     mg->mg_len = 1;
  1921.     break;
  1922.     case 'U':
  1923.     mg->mg_virtual = &vtbl_uvar;
  1924.     break;
  1925.     case 'v':
  1926.     mg->mg_virtual = &vtbl_vec;
  1927.     break;
  1928.     case 'x':
  1929.     mg->mg_virtual = &vtbl_substr;
  1930.     break;
  1931.     case '*':
  1932.     mg->mg_virtual = &vtbl_glob;
  1933.     break;
  1934.     case '#':
  1935.     mg->mg_virtual = &vtbl_arylen;
  1936.     break;
  1937.     case '.':
  1938.     mg->mg_virtual = &vtbl_pos;
  1939.     break;
  1940.     case '~':    /* reserved for extensions but multiple extensions may clash */
  1941.     break;
  1942.     default:
  1943.     croak("Don't know how to handle magic of type '%c'", how);
  1944.     }
  1945.     mg_magical(sv);
  1946.     if (SvGMAGICAL(sv))
  1947.     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
  1948. }
  1949.  
  1950. int
  1951. sv_unmagic(sv, type)
  1952. SV* sv;
  1953. int type;
  1954. {
  1955.     MAGIC* mg;
  1956.     MAGIC** mgp;
  1957.     if (!SvMAGICAL(sv))
  1958.     return 0;
  1959.     mgp = &SvMAGIC(sv);
  1960.     for (mg = *mgp; mg; mg = *mgp) {
  1961.     if (mg->mg_type == type) {
  1962.         MGVTBL* vtbl = mg->mg_virtual;
  1963.         *mgp = mg->mg_moremagic;
  1964.         if (vtbl && vtbl->svt_free)
  1965.         (*vtbl->svt_free)(sv, mg);
  1966.         if (mg->mg_ptr && mg->mg_type != 'g')
  1967.         Safefree(mg->mg_ptr);
  1968.         if (mg->mg_flags & MGf_REFCOUNTED)
  1969.         SvREFCNT_dec(mg->mg_obj);
  1970.         Safefree(mg);
  1971.     }
  1972.     else
  1973.         mgp = &mg->mg_moremagic;
  1974.     }
  1975.     if (!SvMAGIC(sv)) {
  1976.     SvMAGICAL_off(sv);
  1977.     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
  1978.     }
  1979.  
  1980.     return 0;
  1981. }
  1982.  
  1983. void
  1984. sv_insert(bigstr,offset,len,little,littlelen)
  1985. SV *bigstr;
  1986. STRLEN offset;
  1987. STRLEN len;
  1988. char *little;
  1989. STRLEN littlelen;
  1990. {
  1991.     register char *big;
  1992.     register char *mid;
  1993.     register char *midend;
  1994.     register char *bigend;
  1995.     register I32 i;
  1996.  
  1997.     if (!bigstr)
  1998.     croak("Can't modify non-existent substring");
  1999.     SvPV_force(bigstr, na);
  2000.  
  2001.     i = littlelen - len;
  2002.     if (i > 0) {            /* string might grow */
  2003.     big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
  2004.     mid = big + offset + len;
  2005.     midend = bigend = big + SvCUR(bigstr);
  2006.     bigend += i;
  2007.     *bigend = '\0';
  2008.     while (midend > mid)        /* shove everything down */
  2009.         *--bigend = *--midend;
  2010.     Move(little,big+offset,littlelen,char);
  2011.     SvCUR(bigstr) += i;
  2012.     SvSETMAGIC(bigstr);
  2013.     return;
  2014.     }
  2015.     else if (i == 0) {
  2016.     Move(little,SvPVX(bigstr)+offset,len,char);
  2017.     SvSETMAGIC(bigstr);
  2018.     return;
  2019.     }
  2020.  
  2021.     big = SvPVX(bigstr);
  2022.     mid = big + offset;
  2023.     midend = mid + len;
  2024.     bigend = big + SvCUR(bigstr);
  2025.  
  2026.     if (midend > bigend)
  2027.     croak("panic: sv_insert");
  2028.  
  2029.     if (mid - big > bigend - midend) {    /* faster to shorten from end */
  2030.     if (littlelen) {
  2031.         Move(little, mid, littlelen,char);
  2032.         mid += littlelen;
  2033.     }
  2034.     i = bigend - midend;
  2035.     if (i > 0) {
  2036.         Move(midend, mid, i,char);
  2037.         mid += i;
  2038.     }
  2039.     *mid = '\0';
  2040.     SvCUR_set(bigstr, mid - big);
  2041.     }
  2042.     /*SUPPRESS 560*/
  2043.     else if (i = mid - big) {    /* faster from front */
  2044.     midend -= littlelen;
  2045.     mid = midend;
  2046.     sv_chop(bigstr,midend-i);
  2047.     big += i;
  2048.     while (i--)
  2049.         *--midend = *--big;
  2050.     if (littlelen)
  2051.         Move(little, mid, littlelen,char);
  2052.     }
  2053.     else if (littlelen) {
  2054.     midend -= littlelen;
  2055.     sv_chop(bigstr,midend);
  2056.     Move(little,midend,littlelen,char);
  2057.     }
  2058.     else {
  2059.     sv_chop(bigstr,midend);
  2060.     }
  2061.     SvSETMAGIC(bigstr);
  2062. }
  2063.  
  2064. /* make sv point to what nstr did */
  2065.  
  2066. void
  2067. sv_replace(sv,nsv)
  2068. register SV *sv;
  2069. register SV *nsv;
  2070. {
  2071.     U32 refcnt = SvREFCNT(sv);
  2072.     if (SvTHINKFIRST(sv)) {
  2073.     if (SvREADONLY(sv) && curcop != &compiling)
  2074.         croak(no_modify);
  2075.     if (SvROK(sv))
  2076.         sv_unref(sv);
  2077.     }
  2078.     if (SvREFCNT(nsv) != 1)
  2079.     warn("Reference miscount in sv_replace()");
  2080.     if (SvMAGICAL(sv)) {
  2081.     if (SvMAGICAL(nsv))
  2082.         mg_free(nsv);
  2083.     else
  2084.         sv_upgrade(nsv, SVt_PVMG);
  2085.     SvMAGIC(nsv) = SvMAGIC(sv);
  2086.     SvFLAGS(nsv) |= SvMAGICAL(sv);
  2087.     SvMAGICAL_off(sv);
  2088.     SvMAGIC(sv) = 0;
  2089.     }
  2090.     SvREFCNT(sv) = 0;
  2091.     sv_clear(sv);
  2092.     StructCopy(nsv,sv,SV);
  2093.     SvREFCNT(sv) = refcnt;
  2094.     del_SV(nsv);
  2095. }
  2096.  
  2097. void
  2098. sv_clear(sv)
  2099. register SV *sv;
  2100. {
  2101.     assert(sv);
  2102.     assert(SvREFCNT(sv) == 0);
  2103.  
  2104.     if (SvOBJECT(sv)) {
  2105.     dSP;
  2106.     GV* destructor;
  2107.  
  2108.     if (defstash) {        /* Still have a symbol table? */
  2109.         destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
  2110.  
  2111.         ENTER;
  2112.         SAVEFREESV(SvSTASH(sv));
  2113.         if (destructor && GvCV(destructor)) {
  2114.         SV ref;
  2115.  
  2116.         Zero(&ref, 1, SV);
  2117.         sv_upgrade(&ref, SVt_RV);
  2118.         SAVEI32(SvREFCNT(sv));
  2119.         SvRV(&ref) = SvREFCNT_inc(sv);
  2120.         SvROK_on(&ref);
  2121.  
  2122.         EXTEND(SP, 2);
  2123.         PUSHMARK(SP);
  2124.         PUSHs(&ref);
  2125.         PUTBACK;
  2126.         perl_call_sv((SV*)destructor, G_DISCARD|G_EVAL);
  2127.         del_XRV(SvANY(&ref));
  2128.         }
  2129.         LEAVE;
  2130.     }
  2131.     if (SvOBJECT(sv)) {
  2132.         SvOBJECT_off(sv);    /* Curse the object. */
  2133.         if (SvTYPE(sv) != SVt_PVIO)
  2134.         --sv_objcount;    /* XXX Might want something more general */
  2135.     }
  2136.     }
  2137.     if (SvMAGICAL(sv))
  2138.     mg_free(sv);
  2139.     switch (SvTYPE(sv)) {
  2140.     case SVt_PVIO:
  2141.     Safefree(IoTOP_NAME(sv));
  2142.     Safefree(IoFMT_NAME(sv));
  2143.     Safefree(IoBOTTOM_NAME(sv));
  2144.     /* FALL THROUGH */
  2145.     case SVt_PVBM:
  2146.     goto freescalar;
  2147.     case SVt_PVCV:
  2148.     case SVt_PVFM:
  2149.     cv_undef((CV*)sv);
  2150.     goto freescalar;
  2151.     case SVt_PVHV:
  2152.     hv_undef((HV*)sv);
  2153.     break;
  2154.     case SVt_PVAV:
  2155.     av_undef((AV*)sv);
  2156.     break;
  2157.     case SVt_PVGV:
  2158.     gp_free(sv);
  2159.     Safefree(GvNAME(sv));
  2160.     /* FALL THROUGH */
  2161.     case SVt_PVLV:
  2162.     case SVt_PVMG:
  2163.     case SVt_PVNV:
  2164.     case SVt_PVIV:
  2165.       freescalar:
  2166.     (void)SvOOK_off(sv);
  2167.     /* FALL THROUGH */
  2168.     case SVt_PV:
  2169.     case SVt_RV:
  2170.     if (SvROK(sv))
  2171.         SvREFCNT_dec(SvRV(sv));
  2172.     else if (SvPVX(sv))
  2173.         Safefree(SvPVX(sv));
  2174.     break;
  2175. /*
  2176.     case SVt_NV:
  2177.     case SVt_IV:
  2178.     case SVt_NULL:
  2179.     break;
  2180. */
  2181.     }
  2182.  
  2183.     switch (SvTYPE(sv)) {
  2184.     case SVt_NULL:
  2185.     break;
  2186.     case SVt_IV:
  2187.     del_XIV(SvANY(sv));
  2188.     break;
  2189.     case SVt_NV:
  2190.     del_XNV(SvANY(sv));
  2191.     break;
  2192.     case SVt_RV:
  2193.     del_XRV(SvANY(sv));
  2194.     break;
  2195.     case SVt_PV:
  2196.     del_XPV(SvANY(sv));
  2197.     break;
  2198.     case SVt_PVIV:
  2199.     del_XPVIV(SvANY(sv));
  2200.     break;
  2201.     case SVt_PVNV:
  2202.     del_XPVNV(SvANY(sv));
  2203.     break;
  2204.     case SVt_PVMG:
  2205.     del_XPVMG(SvANY(sv));
  2206.     break;
  2207.     case SVt_PVLV:
  2208.     del_XPVLV(SvANY(sv));
  2209.     break;
  2210.     case SVt_PVAV:
  2211.     del_XPVAV(SvANY(sv));
  2212.     break;
  2213.     case SVt_PVHV:
  2214.     del_XPVHV(SvANY(sv));
  2215.     break;
  2216.     case SVt_PVCV:
  2217.     del_XPVCV(SvANY(sv));
  2218.     break;
  2219.     case SVt_PVGV:
  2220.     del_XPVGV(SvANY(sv));
  2221.     break;
  2222.     case SVt_PVBM:
  2223.     del_XPVBM(SvANY(sv));
  2224.     break;
  2225.     case SVt_PVFM:
  2226.     del_XPVFM(SvANY(sv));
  2227.     break;
  2228.     case SVt_PVIO:
  2229.     del_XPVIO(SvANY(sv));
  2230.     break;
  2231.     }
  2232.     SvFLAGS(sv) &= SVf_BREAK;
  2233.     SvFLAGS(sv) |= SVTYPEMASK;
  2234. }
  2235.  
  2236. SV *
  2237. sv_newref(sv)
  2238. SV* sv;
  2239. {
  2240.     if (sv)
  2241.     SvREFCNT(sv)++;
  2242.     return sv;
  2243. }
  2244.  
  2245. void
  2246. sv_free(sv)
  2247. SV *sv;
  2248. {
  2249.     if (!sv)
  2250.     return;
  2251.     if (SvREADONLY(sv)) {
  2252.     if (sv == &sv_undef || sv == &sv_yes || sv == &sv_no)
  2253.         return;
  2254.     }
  2255.     if (SvREFCNT(sv) == 0) {
  2256.     if (SvFLAGS(sv) & SVf_BREAK)
  2257.         return;
  2258.     warn("Attempt to free unreferenced scalar");
  2259.     return;
  2260.     }
  2261.     if (--SvREFCNT(sv) > 0)
  2262.     return;
  2263. #ifdef DEBUGGING
  2264.     if (SvTEMP(sv)) {
  2265.     warn("Attempt to free temp prematurely");
  2266.     return;
  2267.     }
  2268. #endif
  2269.     sv_clear(sv);
  2270.     del_SV(sv);
  2271. }
  2272.  
  2273. STRLEN
  2274. sv_len(sv)
  2275. register SV *sv;
  2276. {
  2277.     char *junk;
  2278.     STRLEN len;
  2279.  
  2280.     if (!sv)
  2281.     return 0;
  2282.  
  2283.     if (SvGMAGICAL(sv))
  2284.     len = mg_len(sv);
  2285.     else
  2286.     junk = SvPV(sv, len);
  2287.     return len;
  2288. }
  2289.  
  2290. I32
  2291. sv_eq(str1,str2)
  2292. register SV *str1;
  2293. register SV *str2;
  2294. {
  2295.     char *pv1;
  2296.     STRLEN cur1;
  2297.     char *pv2;
  2298.     STRLEN cur2;
  2299.  
  2300.     if (!str1) {
  2301.     pv1 = "";
  2302.     cur1 = 0;
  2303.     }
  2304.     else
  2305.     pv1 = SvPV(str1, cur1);
  2306.  
  2307.     if (!str2)
  2308.     return !cur1;
  2309.     else
  2310.     pv2 = SvPV(str2, cur2);
  2311.  
  2312.     if (cur1 != cur2)
  2313.     return 0;
  2314.  
  2315.     return !bcmp(pv1, pv2, cur1);
  2316. }
  2317.  
  2318. I32
  2319. sv_cmp(str1,str2)
  2320. register SV *str1;
  2321. register SV *str2;
  2322. {
  2323.     I32 retval;
  2324.     char *pv1;
  2325.     STRLEN cur1;
  2326.     char *pv2;
  2327.     STRLEN cur2;
  2328.  
  2329.     if (!str1) {
  2330.     pv1 = "";
  2331.     cur1 = 0;
  2332.     }
  2333.     else
  2334.     pv1 = SvPV(str1, cur1);
  2335.  
  2336.     if (!str2) {
  2337.     pv2 = "";
  2338.     cur2 = 0;
  2339.     }
  2340.     else
  2341.     pv2 = SvPV(str2, cur2);
  2342.  
  2343.     if (!cur1)
  2344.     return cur2 ? -1 : 0;
  2345.     if (!cur2)
  2346.     return 1;
  2347.  
  2348.     if (cur1 < cur2) {
  2349.     /*SUPPRESS 560*/
  2350.     if (retval = memcmp((void*)pv1, (void*)pv2, cur1))
  2351.         return retval < 0 ? -1 : 1;
  2352.     else
  2353.         return -1;
  2354.     }
  2355.     /*SUPPRESS 560*/
  2356.     else if (retval = memcmp((void*)pv1, (void*)pv2, cur2))
  2357.     return retval < 0 ? -1 : 1;
  2358.     else if (cur1 == cur2)
  2359.     return 0;
  2360.     else
  2361.     return 1;
  2362. }
  2363.  
  2364. char *
  2365. sv_gets(sv,fp,append)
  2366. register SV *sv;
  2367. register FILE *fp;
  2368. I32 append;
  2369. {
  2370.     register char *bp;        /* we're going to steal some values */
  2371. #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
  2372.     register I32 cnt;        /*  from the stdio struct and put EVERYTHING */
  2373.     register STDCHAR *ptr;    /*   in the innermost loop into registers */
  2374.     STRLEN bpx;
  2375.     I32 shortbuffered;
  2376. #endif
  2377.     register I32 newline = rschar;/* (assuming >= 6 registers) */
  2378.     I32 i;
  2379.  
  2380.     if (SvTHINKFIRST(sv)) {
  2381.     if (SvREADONLY(sv) && curcop != &compiling)
  2382.         croak(no_modify);
  2383.     if (SvROK(sv))
  2384.         sv_unref(sv);
  2385.     }
  2386.     if (!SvUPGRADE(sv, SVt_PV))
  2387.     return 0;
  2388.     if (rspara) {        /* have to do this both before and after */
  2389.     do {            /* to make sure file boundaries work right */
  2390.         if (feof(fp))
  2391.         return 0;
  2392.         i = getc(fp);
  2393.         if (i != '\n') {
  2394.         if (i == -1)
  2395.             return 0;
  2396.         ungetc(i,fp);
  2397.         break;
  2398.         }
  2399.     } while (i != EOF);
  2400.     }
  2401. #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE)
  2402.     /* Here is some breathtakingly efficient cheating */
  2403.     cnt = FILE_cnt(fp);            /* get count into register */
  2404.     (void)SvPOK_only(sv);        /* validate pointer */
  2405.     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
  2406.     if (cnt > 80 && SvLEN(sv) > append) {
  2407.         shortbuffered = cnt - SvLEN(sv) + append + 1;
  2408.         cnt -= shortbuffered;
  2409.     }
  2410.     else {
  2411.         shortbuffered = 0;
  2412.         SvGROW(sv, append+cnt+2);/* (remembering cnt can be -1) */
  2413.     }
  2414.     }
  2415.     else
  2416.     shortbuffered = 0;
  2417.     bp = SvPVX(sv) + append;        /* move these two too to registers */
  2418.     ptr = FILE_ptr(fp);
  2419.     for (;;) {
  2420.       screamer:
  2421.     if (cnt > 0) {
  2422.         while (--cnt >= 0) {         /* this */    /* eat */
  2423.         if ((*bp++ = *ptr++) == newline) /* really */    /* dust */
  2424.             goto thats_all_folks;     /* screams */    /* sed :-) */ 
  2425.         }
  2426.     }
  2427.     
  2428.     if (shortbuffered) {        /* oh well, must extend */
  2429.         cnt = shortbuffered;
  2430.         shortbuffered = 0;
  2431.         bpx = bp - SvPVX(sv);    /* prepare for possible relocation */
  2432.         SvCUR_set(sv, bpx);
  2433.         SvGROW(sv, SvLEN(sv) + append + cnt + 2);
  2434.         bp = SvPVX(sv) + bpx;    /* reconstitute our pointer */
  2435.         continue;
  2436.     }
  2437.  
  2438.     FILE_cnt(fp) = cnt;        /* deregisterize cnt and ptr */
  2439.     FILE_ptr(fp) = ptr;
  2440.     i = _filbuf(fp);        /* get more characters */
  2441.     cnt = FILE_cnt(fp);
  2442.     ptr = FILE_ptr(fp);        /* reregisterize cnt and ptr */
  2443.  
  2444.     if (i == EOF)            /* all done for ever? */
  2445.         goto thats_really_all_folks;
  2446.  
  2447.     bpx = bp - SvPVX(sv);        /* prepare for possible relocation */
  2448.     SvCUR_set(sv, bpx);
  2449.     SvGROW(sv, bpx + cnt + 2);
  2450.     bp = SvPVX(sv) + bpx;        /* reconstitute our pointer */
  2451.  
  2452.     if (i == newline) {        /* all done for now? */
  2453.         *bp++ = i;
  2454.         goto thats_all_folks;
  2455.     }
  2456.     *bp++ = i;            /* now go back to screaming loop */
  2457.     }
  2458.  
  2459. thats_all_folks:
  2460.     if (rslen > 1 && (bp - SvPVX(sv) < rslen || bcmp(bp - rslen, rs, rslen)))
  2461.     goto screamer;            /* go back to the fray */
  2462. thats_really_all_folks:
  2463.     if (shortbuffered)
  2464.     cnt += shortbuffered;
  2465.     FILE_cnt(fp) = cnt;            /* put these back or we're in trouble */
  2466.     FILE_ptr(fp) = ptr;
  2467.     *bp = '\0';
  2468.     SvCUR_set(sv, bp - SvPVX(sv));    /* set length */
  2469.  
  2470. #else /* USE_STDIO_PTR && STDIO_PTR_LVALUE && STDIO_CNT_LVALUE */
  2471.     /*The big, slow, and stupid way */
  2472.     {
  2473.     char buf[8192];
  2474.     register char * bpe = buf + sizeof(buf) - 3;
  2475.  
  2476. screamer:
  2477.     bp = buf;
  2478.     while ((i = getc(fp)) != EOF && (*bp++ = i) != newline && bp < bpe) ;
  2479.  
  2480.     if (append)
  2481.         sv_catpvn(sv, buf, bp - buf);
  2482.     else
  2483.         sv_setpvn(sv, buf, bp - buf);
  2484.     if (i != EOF            /* joy */
  2485.         &&
  2486.         (i != newline
  2487.          ||
  2488.          (rslen > 1
  2489.           &&
  2490.           (SvCUR(sv) < rslen
  2491.            ||
  2492.            bcmp(SvPVX(sv) + SvCUR(sv) - rslen, rs, rslen)
  2493.           )
  2494.          )
  2495.         )
  2496.        )
  2497.     {
  2498.         append = -1;
  2499.         goto screamer;
  2500.     }
  2501.     }
  2502.  
  2503. #endif /* USE_STDIO_PTR && STDIO_PTR_LVALUE && STDIO_CNT_LVALUE */
  2504.  
  2505.     if (rspara) {
  2506.         while (i != EOF) {
  2507.         i = getc(fp);
  2508.         if (i != '\n') {
  2509.         ungetc(i,fp);
  2510.         break;
  2511.         }
  2512.     }
  2513.     }
  2514.     return SvCUR(sv) - append ? SvPVX(sv) : Nullch;
  2515. }
  2516.  
  2517. void
  2518. sv_inc(sv)
  2519. register SV *sv;
  2520. {
  2521.     register char *d;
  2522.     int flags;
  2523.  
  2524.     if (!sv)
  2525.     return;
  2526.     if (SvTHINKFIRST(sv)) {
  2527.     if (SvREADONLY(sv) && curcop != &compiling)
  2528.         croak(no_modify);
  2529.     if (SvROK(sv)) {
  2530. #ifdef OVERLOAD
  2531.       if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
  2532. #endif /* OVERLOAD */
  2533.       sv_unref(sv);
  2534.     }
  2535.     }
  2536.     if (SvGMAGICAL(sv))
  2537.     mg_get(sv);
  2538.     flags = SvFLAGS(sv);
  2539.     if (flags & SVp_IOK) {
  2540.     ++SvIVX(sv);
  2541.     (void)SvIOK_only(sv);
  2542.     return;
  2543.     }
  2544.     if (flags & SVp_NOK) {
  2545.     SvNVX(sv) += 1.0;
  2546.     (void)SvNOK_only(sv);
  2547.     return;
  2548.     }
  2549.     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
  2550.     sv_upgrade(sv, SVt_NV);
  2551.     SvNVX(sv) = 1.0;
  2552.     (void)SvNOK_only(sv);
  2553.     return;
  2554.     }
  2555.     d = SvPVX(sv);
  2556.     while (isALPHA(*d)) d++;
  2557.     while (isDIGIT(*d)) d++;
  2558.     if (*d) {
  2559.         sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
  2560.     return;
  2561.     }
  2562.     d--;
  2563.     while (d >= SvPVX(sv)) {
  2564.     if (isDIGIT(*d)) {
  2565.         if (++*d <= '9')
  2566.         return;
  2567.         *(d--) = '0';
  2568.     }
  2569.     else {
  2570.         ++*d;
  2571.         if (isALPHA(*d))
  2572.         return;
  2573.         *(d--) -= 'z' - 'a' + 1;
  2574.     }
  2575.     }
  2576.     /* oh,oh, the number grew */
  2577.     SvGROW(sv, SvCUR(sv) + 2);
  2578.     SvCUR(sv)++;
  2579.     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
  2580.     *d = d[-1];
  2581.     if (isDIGIT(d[1]))
  2582.     *d = '1';
  2583.     else
  2584.     *d = d[1];
  2585. }
  2586.  
  2587. void
  2588. sv_dec(sv)
  2589. register SV *sv;
  2590. {
  2591.     int flags;
  2592.  
  2593.     if (!sv)
  2594.     return;
  2595.     if (SvTHINKFIRST(sv)) {
  2596.     if (SvREADONLY(sv) && curcop != &compiling)
  2597.         croak(no_modify);
  2598.     if (SvROK(sv)) {
  2599. #ifdef OVERLOAD
  2600.       if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
  2601. #endif /* OVERLOAD */
  2602.       sv_unref(sv);
  2603.     }
  2604.     }
  2605.     if (SvGMAGICAL(sv))
  2606.     mg_get(sv);
  2607.     flags = SvFLAGS(sv);
  2608.     if (flags & SVp_IOK) {
  2609.     --SvIVX(sv);
  2610.     (void)SvIOK_only(sv);
  2611.     return;
  2612.     }
  2613.     if (flags & SVp_NOK) {
  2614.     SvNVX(sv) -= 1.0;
  2615.     (void)SvNOK_only(sv);
  2616.     return;
  2617.     }
  2618.     if (!(flags & SVp_POK)) {
  2619.     sv_upgrade(sv, SVt_NV);
  2620.     SvNVX(sv) = -1.0;
  2621.     (void)SvNOK_only(sv);
  2622.     return;
  2623.     }
  2624.     sv_setnv(sv,atof(SvPVX(sv)) - 1.0);
  2625. }
  2626.  
  2627. /* Make a string that will exist for the duration of the expression
  2628.  * evaluation.  Actually, it may have to last longer than that, but
  2629.  * hopefully we won't free it until it has been assigned to a
  2630.  * permanent location. */
  2631.  
  2632. static void
  2633. sv_mortalgrow()
  2634. {
  2635.     tmps_max += 128;
  2636.     Renew(tmps_stack, tmps_max, SV*);
  2637. }
  2638.  
  2639. SV *
  2640. sv_mortalcopy(oldstr)
  2641. SV *oldstr;
  2642. {
  2643.     register SV *sv;
  2644.  
  2645.     new_SV();
  2646.     SvANY(sv) = 0;
  2647.     SvREFCNT(sv) = 1;
  2648.     SvFLAGS(sv) = 0;
  2649.     sv_setsv(sv,oldstr);
  2650.     if (++tmps_ix >= tmps_max)
  2651.     sv_mortalgrow();
  2652.     tmps_stack[tmps_ix] = sv;
  2653.     SvTEMP_on(sv);
  2654.     return sv;
  2655. }
  2656.  
  2657. SV *
  2658. sv_newmortal()
  2659. {
  2660.     register SV *sv;
  2661.  
  2662.     new_SV();
  2663.     SvANY(sv) = 0;
  2664.     SvREFCNT(sv) = 1;
  2665.     SvFLAGS(sv) = SVs_TEMP;
  2666.     if (++tmps_ix >= tmps_max)
  2667.     sv_mortalgrow();
  2668.     tmps_stack[tmps_ix] = sv;
  2669.     return sv;
  2670. }
  2671.  
  2672. /* same thing without the copying */
  2673.  
  2674. SV *
  2675. sv_2mortal(sv)
  2676. register SV *sv;
  2677. {
  2678.     if (!sv)
  2679.     return sv;
  2680.     if (SvREADONLY(sv) && curcop != &compiling)
  2681.     croak(no_modify);
  2682.     if (++tmps_ix >= tmps_max)
  2683.     sv_mortalgrow();
  2684.     tmps_stack[tmps_ix] = sv;
  2685.     SvTEMP_on(sv);
  2686.     return sv;
  2687. }
  2688.  
  2689. SV *
  2690. newSVpv(s,len)
  2691. char *s;
  2692. STRLEN len;
  2693. {
  2694.     register SV *sv;
  2695.  
  2696.     new_SV();
  2697.     SvANY(sv) = 0;
  2698.     SvREFCNT(sv) = 1;
  2699.     SvFLAGS(sv) = 0;
  2700.     if (!len)
  2701.     len = strlen(s);
  2702.     sv_setpvn(sv,s,len);
  2703.     return sv;
  2704. }
  2705.  
  2706. SV *
  2707. newSVnv(n)
  2708. double n;
  2709. {
  2710.     register SV *sv;
  2711.  
  2712.     new_SV();
  2713.     SvANY(sv) = 0;
  2714.     SvREFCNT(sv) = 1;
  2715.     SvFLAGS(sv) = 0;
  2716.     sv_setnv(sv,n);
  2717.     return sv;
  2718. }
  2719.  
  2720. SV *
  2721. newSViv(i)
  2722. IV i;
  2723. {
  2724.     register SV *sv;
  2725.  
  2726.     new_SV();
  2727.     SvANY(sv) = 0;
  2728.     SvREFCNT(sv) = 1;
  2729.     SvFLAGS(sv) = 0;
  2730.     sv_setiv(sv,i);
  2731.     return sv;
  2732. }
  2733.  
  2734. SV *
  2735. newRV(ref)
  2736. SV *ref;
  2737. {
  2738.     register SV *sv;
  2739.  
  2740.     new_SV();
  2741.     SvANY(sv) = 0;
  2742.     SvREFCNT(sv) = 1;
  2743.     SvFLAGS(sv) = 0;
  2744.     sv_upgrade(sv, SVt_RV);
  2745.     SvTEMP_off(ref);
  2746.     SvRV(sv) = SvREFCNT_inc(ref);
  2747.     SvROK_on(sv);
  2748.     return sv;
  2749. }
  2750.  
  2751. /* make an exact duplicate of old */
  2752.  
  2753. SV *
  2754. newSVsv(old)
  2755. register SV *old;
  2756. {
  2757.     register SV *sv;
  2758.  
  2759.     if (!old)
  2760.     return Nullsv;
  2761.     if (SvTYPE(old) == SVTYPEMASK) {
  2762.     warn("semi-panic: attempt to dup freed string");
  2763.     return Nullsv;
  2764.     }
  2765.     new_SV();
  2766.     SvANY(sv) = 0;
  2767.     SvREFCNT(sv) = 1;
  2768.     SvFLAGS(sv) = 0;
  2769.     if (SvTEMP(old)) {
  2770.     SvTEMP_off(old);
  2771.     sv_setsv(sv,old);
  2772.     SvTEMP_on(old);
  2773.     }
  2774.     else
  2775.     sv_setsv(sv,old);
  2776.     return sv;
  2777. }
  2778.  
  2779. void
  2780. sv_reset(s,stash)
  2781. register char *s;
  2782. HV *stash;
  2783. {
  2784.     register HE *entry;
  2785.     register GV *gv;
  2786.     register SV *sv;
  2787.     register I32 i;
  2788.     register PMOP *pm;
  2789.     register I32 max;
  2790.     char todo[256];
  2791.  
  2792.     if (!*s) {        /* reset ?? searches */
  2793.     for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
  2794.         pm->op_pmflags &= ~PMf_USED;
  2795.     }
  2796.     return;
  2797.     }
  2798.  
  2799.     /* reset variables */
  2800.  
  2801.     if (!HvARRAY(stash))
  2802.     return;
  2803.  
  2804.     Zero(todo, 256, char);
  2805.     while (*s) {
  2806.     i = *s;
  2807.     if (s[1] == '-') {
  2808.         s += 2;
  2809.     }
  2810.     max = *s++;
  2811.     for ( ; i <= max; i++) {
  2812.         todo[i] = 1;
  2813.     }
  2814.     for (i = 0; i <= (I32) HvMAX(stash); i++) {
  2815.         for (entry = HvARRAY(stash)[i];
  2816.           entry;
  2817.           entry = entry->hent_next) {
  2818.         if (!todo[(U8)*entry->hent_key])
  2819.             continue;
  2820.         gv = (GV*)entry->hent_val;
  2821.         sv = GvSV(gv);
  2822.         (void)SvOK_off(sv);
  2823.         if (SvTYPE(sv) >= SVt_PV) {
  2824.             SvCUR_set(sv, 0);
  2825.             SvTAINT(sv);
  2826.             if (SvPVX(sv) != Nullch)
  2827.             *SvPVX(sv) = '\0';
  2828.         }
  2829.         if (GvAV(gv)) {
  2830.             av_clear(GvAV(gv));
  2831.         }
  2832.         if (GvHV(gv)) {
  2833.             if (HvNAME(GvHV(gv)))
  2834.             continue;
  2835.             hv_clear(GvHV(gv));
  2836. #ifndef VMS  /* VMS has no environ array */
  2837.             if (gv == envgv)
  2838.             environ[0] = Nullch;
  2839. #endif
  2840.         }
  2841.         }
  2842.     }
  2843.     }
  2844. }
  2845.  
  2846. CV *
  2847. sv_2cv(sv, st, gvp, lref)
  2848. SV *sv;
  2849. HV **st;
  2850. GV **gvp;
  2851. I32 lref;
  2852. {
  2853.     GV *gv;
  2854.     CV *cv;
  2855.  
  2856.     if (!sv)
  2857.     return *gvp = Nullgv, Nullcv;
  2858.     switch (SvTYPE(sv)) {
  2859.     case SVt_PVCV:
  2860.     *st = CvSTASH(sv);
  2861.     *gvp = Nullgv;
  2862.     return (CV*)sv;
  2863.     case SVt_PVHV:
  2864.     case SVt_PVAV:
  2865.     *gvp = Nullgv;
  2866.     return Nullcv;
  2867.     case SVt_PVGV:
  2868.     gv = (GV*)sv;
  2869.     *gvp = gv;
  2870.     *st = GvESTASH(gv);
  2871.     goto fix_gv;
  2872.  
  2873.     default:
  2874.     if (SvGMAGICAL(sv))
  2875.         mg_get(sv);
  2876.     if (SvROK(sv)) {
  2877.         cv = (CV*)SvRV(sv);
  2878.         if (SvTYPE(cv) != SVt_PVCV)
  2879.         croak("Not a subroutine reference");
  2880.         *gvp = Nullgv;
  2881.         *st = CvSTASH(cv);
  2882.         return cv;
  2883.     }
  2884.     if (isGV(sv))
  2885.         gv = (GV*)sv;
  2886.     else
  2887.         gv = gv_fetchpv(SvPV(sv, na), lref, SVt_PVCV);
  2888.     *gvp = gv;
  2889.     if (!gv)
  2890.         return Nullcv;
  2891.     *st = GvESTASH(gv);
  2892.     fix_gv:
  2893.     if (lref && !GvCV(gv)) {
  2894.         ENTER;
  2895.         sv = NEWSV(704,0);
  2896.         gv_efullname(sv, gv);
  2897.         newSUB(start_subparse(),
  2898.            newSVOP(OP_CONST, 0, sv),
  2899.            Nullop);
  2900.         LEAVE;
  2901.     }
  2902.     return GvCV(gv);
  2903.     }
  2904. }
  2905.  
  2906. #ifndef SvTRUE
  2907. I32
  2908. SvTRUE(sv)
  2909. register SV *sv;
  2910. {
  2911.     if (!sv)
  2912.     return 0;
  2913.     if (SvGMAGICAL(sv))
  2914.     mg_get(sv);
  2915.     if (SvPOK(sv)) {
  2916.     register XPV* Xpv;
  2917.     if ((Xpv = (XPV*)SvANY(sv)) &&
  2918.         (*Xpv->xpv_pv > '0' ||
  2919.         Xpv->xpv_cur > 1 ||
  2920.         (Xpv->xpv_cur && *Xpv->xpv_pv != '0')))
  2921.         return 1;
  2922.     else
  2923.         return 0;
  2924.     }
  2925.     else {
  2926.     if (SvIOK(sv))
  2927.         return SvIVX(sv) != 0;
  2928.     else {
  2929.         if (SvNOK(sv))
  2930.         return SvNVX(sv) != 0.0;
  2931.         else
  2932.         return sv_2bool(sv);
  2933.     }
  2934.     }
  2935. }
  2936. #endif /* SvTRUE */
  2937.  
  2938. #ifndef SvIV
  2939. IV SvIV(Sv)
  2940. register SV *Sv;
  2941. {
  2942.     if (SvIOK(Sv))
  2943.     return SvIVX(Sv);
  2944.     return sv_2iv(Sv);
  2945. }
  2946. #endif /* SvIV */
  2947.  
  2948.  
  2949. #ifndef SvNV
  2950. double SvNV(Sv)
  2951. register SV *Sv;
  2952. {
  2953.     if (SvNOK(Sv))
  2954.     return SvNVX(Sv);
  2955.     if (SvIOK(Sv))
  2956.     return (double)SvIVX(Sv);
  2957.     return sv_2nv(Sv);
  2958. }
  2959. #endif /* SvNV */
  2960.  
  2961. #ifdef CRIPPLED_CC
  2962. char *
  2963. sv_pvn(sv, lp)
  2964. SV *sv;
  2965. STRLEN *lp;
  2966. {
  2967.     if (SvPOK(sv)) {
  2968.     *lp = SvCUR(sv);
  2969.     return SvPVX(sv);
  2970.     }
  2971.     return sv_2pv(sv, lp);
  2972. }
  2973. #endif
  2974.  
  2975. char *
  2976. sv_pvn_force(sv, lp)
  2977. SV *sv;
  2978. STRLEN *lp;
  2979. {
  2980.     char *s;
  2981.  
  2982.     if (SvREADONLY(sv) && curcop != &compiling)
  2983.     croak(no_modify);
  2984.     
  2985.     if (SvPOK(sv)) {
  2986.     *lp = SvCUR(sv);
  2987.     }
  2988.     else {
  2989.     if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
  2990.         if (SvFAKE(sv))
  2991.         sv_unglob(sv);
  2992.         else
  2993.         croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
  2994.             op_name[op->op_type]);
  2995.     }
  2996.     s = sv_2pv(sv, lp);
  2997.     if (s != SvPVX(sv)) {    /* Almost, but not quite, sv_setpvn() */
  2998.         STRLEN len = *lp;
  2999.         
  3000.         if (SvROK(sv))
  3001.         sv_unref(sv);
  3002.         (void)SvUPGRADE(sv, SVt_PV);        /* Never FALSE */
  3003.         SvGROW(sv, len + 1);
  3004.         Move(s,SvPVX(sv),len,char);
  3005.         SvCUR_set(sv, len);
  3006.         *SvEND(sv) = '\0';
  3007.     }
  3008.     if (!SvPOK(sv)) {
  3009.         SvPOK_on(sv);        /* validate pointer */
  3010.         SvTAINT(sv);
  3011.         DEBUG_c(fprintf(stderr,"0x%lx 2pv(%s)\n",
  3012.         (unsigned long)sv,SvPVX(sv)));
  3013.     }
  3014.     }
  3015.     return SvPVX(sv);
  3016. }
  3017.  
  3018. char *
  3019. sv_reftype(sv, ob)
  3020. SV* sv;
  3021. int ob;
  3022. {
  3023.     if (ob && SvOBJECT(sv))
  3024.     return HvNAME(SvSTASH(sv));
  3025.     else {
  3026.     switch (SvTYPE(sv)) {
  3027.     case SVt_NULL:
  3028.     case SVt_IV:
  3029.     case SVt_NV:
  3030.     case SVt_RV:
  3031.     case SVt_PV:
  3032.     case SVt_PVIV:
  3033.     case SVt_PVNV:
  3034.     case SVt_PVMG:
  3035.     case SVt_PVBM:
  3036.                 if (SvROK(sv))
  3037.                     return "REF";
  3038.                 else
  3039.                     return "SCALAR";
  3040.     case SVt_PVLV:        return "LVALUE";
  3041.     case SVt_PVAV:        return "ARRAY";
  3042.     case SVt_PVHV:        return "HASH";
  3043.     case SVt_PVCV:        return "CODE";
  3044.     case SVt_PVGV:        return "GLOB";
  3045.     case SVt_PVFM:        return "FORMLINE";
  3046.     default:        return "UNKNOWN";
  3047.     }
  3048.     }
  3049. }
  3050.  
  3051. int
  3052. sv_isobject(sv)
  3053. SV *sv;
  3054. {
  3055.     if (!SvROK(sv))
  3056.     return 0;
  3057.     sv = (SV*)SvRV(sv);
  3058.     if (!SvOBJECT(sv))
  3059.     return 0;
  3060.     return 1;
  3061. }
  3062.  
  3063. int
  3064. sv_isa(sv, name)
  3065. SV *sv;
  3066. char *name;
  3067. {
  3068.     if (!SvROK(sv))
  3069.     return 0;
  3070.     sv = (SV*)SvRV(sv);
  3071.     if (!SvOBJECT(sv))
  3072.     return 0;
  3073.  
  3074.     return strEQ(HvNAME(SvSTASH(sv)), name);
  3075. }
  3076.  
  3077. SV*
  3078. newSVrv(rv, classname)
  3079. SV *rv;
  3080. char *classname;
  3081. {
  3082.     SV *sv;
  3083.  
  3084.     new_SV();
  3085.     SvANY(sv) = 0;
  3086.     SvREFCNT(sv) = 0;
  3087.     SvFLAGS(sv) = 0;
  3088.     sv_upgrade(rv, SVt_RV);
  3089.     SvRV(rv) = SvREFCNT_inc(sv);
  3090.     SvROK_on(rv);
  3091.  
  3092.     if (classname) {
  3093.     HV* stash = gv_stashpv(classname, TRUE);
  3094.     (void)sv_bless(rv, stash);
  3095.     }
  3096.     return sv;
  3097. }
  3098.  
  3099. SV*
  3100. sv_setref_pv(rv, classname, pv)
  3101. SV *rv;
  3102. char *classname;
  3103. void* pv;
  3104. {
  3105.     if (!pv)
  3106.     sv_setsv(rv, &sv_undef);
  3107.     else
  3108.     sv_setiv(newSVrv(rv,classname), (IV)pv);
  3109.     return rv;
  3110. }
  3111.  
  3112. SV*
  3113. sv_setref_iv(rv, classname, iv)
  3114. SV *rv;
  3115. char *classname;
  3116. IV iv;
  3117. {
  3118.     sv_setiv(newSVrv(rv,classname), iv);
  3119.     return rv;
  3120. }
  3121.  
  3122. SV*
  3123. sv_setref_nv(rv, classname, nv)
  3124. SV *rv;
  3125. char *classname;
  3126. double nv;
  3127. {
  3128.     sv_setnv(newSVrv(rv,classname), nv);
  3129.     return rv;
  3130. }
  3131.  
  3132. SV*
  3133. sv_setref_pvn(rv, classname, pv, n)
  3134. SV *rv;
  3135. char *classname;
  3136. char* pv;
  3137. I32 n;
  3138. {
  3139.     sv_setpvn(newSVrv(rv,classname), pv, n);
  3140.     return rv;
  3141. }
  3142.  
  3143. SV*
  3144. sv_bless(sv,stash)
  3145. SV* sv;
  3146. HV* stash;
  3147. {
  3148.     SV *ref;
  3149.     if (!SvROK(sv))
  3150.         croak("Can't bless non-reference value");
  3151.     ref = SvRV(sv);
  3152.     if (SvFLAGS(ref) & (SVs_OBJECT|SVf_READONLY)) {
  3153.     if (SvREADONLY(ref))
  3154.         croak(no_modify);
  3155.     if (SvOBJECT(ref) && SvTYPE(ref) != SVt_PVIO)
  3156.         --sv_objcount;
  3157.     }
  3158.     SvOBJECT_on(ref);
  3159.     ++sv_objcount;
  3160.     (void)SvUPGRADE(ref, SVt_PVMG);
  3161.     SvSTASH(ref) = (HV*)SvREFCNT_inc(stash);
  3162.  
  3163. #ifdef OVERLOAD
  3164.     SvAMAGIC_off(sv);
  3165.     if (Gv_AMG(stash)) {
  3166.       SvAMAGIC_on(sv);
  3167.     }
  3168. #endif /* OVERLOAD */
  3169.  
  3170.     return sv;
  3171. }
  3172.  
  3173. static void
  3174. sv_unglob(sv)
  3175. SV* sv;
  3176. {
  3177.     assert(SvTYPE(sv) == SVt_PVGV);
  3178.     SvFAKE_off(sv);
  3179.     if (GvGP(sv))
  3180.     gp_free(sv);
  3181.     sv_unmagic(sv, '*');
  3182.     Safefree(GvNAME(sv));
  3183.     SvFLAGS(sv) &= ~SVTYPEMASK;
  3184.     SvFLAGS(sv) |= SVt_PVMG;
  3185. }
  3186.  
  3187. void
  3188. sv_unref(sv)
  3189. SV* sv;
  3190. {
  3191.     SV* rv = SvRV(sv);
  3192.     
  3193.     SvRV(sv) = 0;
  3194.     SvROK_off(sv);
  3195.     SvREFCNT_dec(rv);
  3196. }
  3197.  
  3198. #ifdef DEBUGGING
  3199. void
  3200. sv_dump(sv)
  3201. SV* sv;
  3202. {
  3203.     char tmpbuf[1024];
  3204.     char *d = tmpbuf;
  3205.     U32 flags;
  3206.     U32 type;
  3207.  
  3208.     if (!sv) {
  3209.     fprintf(stderr, "SV = 0\n");
  3210.     return;
  3211.     }
  3212.     
  3213.     flags = SvFLAGS(sv);
  3214.     type = SvTYPE(sv);
  3215.  
  3216.     sprintf(d, "(0x%lx)\n  REFCNT = %ld\n  FLAGS = (",
  3217.     (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
  3218.     d += strlen(d);
  3219.     if (flags & SVs_PADBUSY)    strcat(d, "PADBUSY,");
  3220.     if (flags & SVs_PADTMP)    strcat(d, "PADTMP,");
  3221.     if (flags & SVs_PADMY)    strcat(d, "PADMY,");
  3222.     if (flags & SVs_TEMP)    strcat(d, "TEMP,");
  3223.     if (flags & SVs_OBJECT)    strcat(d, "OBJECT,");
  3224.     if (flags & SVs_GMG)    strcat(d, "GMG,");
  3225.     if (flags & SVs_SMG)    strcat(d, "SMG,");
  3226.     if (flags & SVs_RMG)    strcat(d, "RMG,");
  3227.     d += strlen(d);
  3228.  
  3229.     if (flags & SVf_IOK)    strcat(d, "IOK,");
  3230.     if (flags & SVf_NOK)    strcat(d, "NOK,");
  3231.     if (flags & SVf_POK)    strcat(d, "POK,");
  3232.     if (flags & SVf_ROK)    strcat(d, "ROK,");
  3233.     if (flags & SVf_OOK)    strcat(d, "OOK,");
  3234.     if (flags & SVf_FAKE)    strcat(d, "FAKE,");
  3235.     if (flags & SVf_READONLY)    strcat(d, "READONLY,");
  3236.     d += strlen(d);
  3237.  
  3238.     if (flags & SVp_IOK)    strcat(d, "pIOK,");
  3239.     if (flags & SVp_NOK)    strcat(d, "pNOK,");
  3240.     if (flags & SVp_POK)    strcat(d, "pPOK,");
  3241.     if (flags & SVp_SCREAM)    strcat(d, "SCREAM,");
  3242.     d += strlen(d);
  3243.     if (d[-1] == ',')
  3244.     d--;
  3245.     *d++ = ')';
  3246.     *d = '\0';
  3247.  
  3248.     fprintf(stderr, "SV = ");
  3249.     switch (type) {
  3250.     case SVt_NULL:
  3251.     fprintf(stderr,"NULL%s\n", tmpbuf);
  3252.     return;
  3253.     case SVt_IV:
  3254.     fprintf(stderr,"IV%s\n", tmpbuf);
  3255.     break;
  3256.     case SVt_NV:
  3257.     fprintf(stderr,"NV%s\n", tmpbuf);
  3258.     break;
  3259.     case SVt_RV:
  3260.     fprintf(stderr,"RV%s\n", tmpbuf);
  3261.     break;
  3262.     case SVt_PV:
  3263.     fprintf(stderr,"PV%s\n", tmpbuf);
  3264.     break;
  3265.     case SVt_PVIV:
  3266.     fprintf(stderr,"PVIV%s\n", tmpbuf);
  3267.     break;
  3268.     case SVt_PVNV:
  3269.     fprintf(stderr,"PVNV%s\n", tmpbuf);
  3270.     break;
  3271.     case SVt_PVBM:
  3272.     fprintf(stderr,"PVBM%s\n", tmpbuf);
  3273.     break;
  3274.     case SVt_PVMG:
  3275.     fprintf(stderr,"PVMG%s\n", tmpbuf);
  3276.     break;
  3277.     case SVt_PVLV:
  3278.     fprintf(stderr,"PVLV%s\n", tmpbuf);
  3279.     break;
  3280.     case SVt_PVAV:
  3281.     fprintf(stderr,"PVAV%s\n", tmpbuf);
  3282.     break;
  3283.     case SVt_PVHV:
  3284.     fprintf(stderr,"PVHV%s\n", tmpbuf);
  3285.     break;
  3286.     case SVt_PVCV:
  3287.     fprintf(stderr,"PVCV%s\n", tmpbuf);
  3288.     break;
  3289.     case SVt_PVGV:
  3290.     fprintf(stderr,"PVGV%s\n", tmpbuf);
  3291.     break;
  3292.     case SVt_PVFM:
  3293.     fprintf(stderr,"PVFM%s\n", tmpbuf);
  3294.     break;
  3295.     case SVt_PVIO:
  3296.     fprintf(stderr,"PVIO%s\n", tmpbuf);
  3297.     break;
  3298.     default:
  3299.     fprintf(stderr,"UNKNOWN%s\n", tmpbuf);
  3300.     return;
  3301.     }
  3302.     if (type >= SVt_PVIV || type == SVt_IV)
  3303.     fprintf(stderr, "  IV = %ld\n", (long)SvIVX(sv));
  3304.     if (type >= SVt_PVNV || type == SVt_NV)
  3305.     fprintf(stderr, "  NV = %.*g\n", DBL_DIG, SvNVX(sv));
  3306.     if (SvROK(sv)) {
  3307.     fprintf(stderr, "  RV = 0x%lx\n", (long)SvRV(sv));
  3308.     sv_dump(SvRV(sv));
  3309.     return;
  3310.     }
  3311.     if (type < SVt_PV)
  3312.     return;
  3313.     if (type <= SVt_PVLV) {
  3314.     if (SvPVX(sv))
  3315.         fprintf(stderr, "  PV = 0x%lx \"%s\"\n  CUR = %ld\n  LEN = %ld\n",
  3316.         (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
  3317.     else
  3318.         fprintf(stderr, "  PV = 0\n");
  3319.     }
  3320.     if (type >= SVt_PVMG) {
  3321.     if (SvMAGIC(sv)) {
  3322.         fprintf(stderr, "  MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
  3323.     }
  3324.     if (SvSTASH(sv))
  3325.         fprintf(stderr, "  STASH = %s\n", HvNAME(SvSTASH(sv)));
  3326.     }
  3327.     switch (type) {
  3328.     case SVt_PVLV:
  3329.     fprintf(stderr, "  TYPE = %c\n", LvTYPE(sv));
  3330.     fprintf(stderr, "  TARGOFF = %ld\n", (long)LvTARGOFF(sv));
  3331.     fprintf(stderr, "  TARGLEN = %ld\n", (long)LvTARGLEN(sv));
  3332.     fprintf(stderr, "  TARG = 0x%lx\n", (long)LvTARG(sv));
  3333.     sv_dump(LvTARG(sv));
  3334.     break;
  3335.     case SVt_PVAV:
  3336.     fprintf(stderr, "  ARRAY = 0x%lx\n", (long)AvARRAY(sv));
  3337.     fprintf(stderr, "  ALLOC = 0x%lx\n", (long)AvALLOC(sv));
  3338.     fprintf(stderr, "  FILL = %ld\n", (long)AvFILL(sv));
  3339.     fprintf(stderr, "  MAX = %ld\n", (long)AvMAX(sv));
  3340.     fprintf(stderr, "  ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
  3341.     if (AvREAL(sv))
  3342.         fprintf(stderr, "  FLAGS = (REAL)\n");
  3343.     else
  3344.         fprintf(stderr, "  FLAGS = ()\n");
  3345.     break;
  3346.     case SVt_PVHV:
  3347.     fprintf(stderr, "  ARRAY = 0x%lx\n",(long)HvARRAY(sv));
  3348.     fprintf(stderr, "  KEYS = %ld\n", (long)HvKEYS(sv));
  3349.     fprintf(stderr, "  FILL = %ld\n", (long)HvFILL(sv));
  3350.     fprintf(stderr, "  MAX = %ld\n", (long)HvMAX(sv));
  3351.     fprintf(stderr, "  RITER = %ld\n", (long)HvRITER(sv));
  3352.     fprintf(stderr, "  EITER = 0x%lx\n",(long) HvEITER(sv));
  3353.     if (HvPMROOT(sv))
  3354.         fprintf(stderr, "  PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
  3355.     if (HvNAME(sv))
  3356.         fprintf(stderr, "  NAME = \"%s\"\n", HvNAME(sv));
  3357.     break;
  3358.     case SVt_PVFM:
  3359.     case SVt_PVCV:
  3360.     fprintf(stderr, "  STASH = 0x%lx\n", (long)CvSTASH(sv));
  3361.     fprintf(stderr, "  START = 0x%lx\n", (long)CvSTART(sv));
  3362.     fprintf(stderr, "  ROOT = 0x%lx\n", (long)CvROOT(sv));
  3363.     fprintf(stderr, "  XSUB = 0x%lx\n", (long)CvXSUB(sv));
  3364.     fprintf(stderr, "  XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
  3365.     fprintf(stderr, "  FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
  3366.     fprintf(stderr, "  DEPTH = %ld\n", (long)CvDEPTH(sv));
  3367.     fprintf(stderr, "  PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
  3368.     fprintf(stderr, "  OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
  3369.     if (type == SVt_PVFM)
  3370.         fprintf(stderr, "  LINES = %ld\n", (long)FmLINES(sv));
  3371.     break;
  3372.     case SVt_PVGV:
  3373.     fprintf(stderr, "  NAME = %s\n", GvNAME(sv));
  3374.     fprintf(stderr, "  NAMELEN = %ld\n", (long)GvNAMELEN(sv));
  3375.     fprintf(stderr, "  STASH = 0x%lx\n", (long)GvSTASH(sv));
  3376.     fprintf(stderr, "  GP = 0x%lx\n", (long)GvGP(sv));
  3377.     fprintf(stderr, "    SV = 0x%lx\n", (long)GvSV(sv));
  3378.     fprintf(stderr, "    REFCNT = %ld\n", (long)GvREFCNT(sv));
  3379.     fprintf(stderr, "    IO = 0x%lx\n", (long)GvIOp(sv));
  3380.     fprintf(stderr, "    FORM = 0x%lx\n", (long)GvFORM(sv));
  3381.     fprintf(stderr, "    AV = 0x%lx\n", (long)GvAV(sv));
  3382.     fprintf(stderr, "    HV = 0x%lx\n", (long)GvHV(sv));
  3383.     fprintf(stderr, "    CV = 0x%lx\n", (long)GvCV(sv));
  3384.     fprintf(stderr, "    CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
  3385.     fprintf(stderr, "    LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
  3386.     fprintf(stderr, "    LINE = %ld\n", (long)GvLINE(sv));
  3387.     fprintf(stderr, "    FLAGS = 0x%x\n", (int)GvFLAGS(sv));
  3388.     fprintf(stderr, "    STASH = 0x%lx\n", (long)GvSTASH(sv));
  3389.     fprintf(stderr, "    EGV = 0x%lx\n", (long)GvEGV(sv));
  3390.     break;
  3391.     case SVt_PVIO:
  3392.     fprintf(stderr, "  IFP = 0x%lx\n", (long)IoIFP(sv));
  3393.     fprintf(stderr, "  OFP = 0x%lx\n", (long)IoOFP(sv));
  3394.     fprintf(stderr, "  DIRP = 0x%lx\n", (long)IoDIRP(sv));
  3395.     fprintf(stderr, "  LINES = %ld\n", (long)IoLINES(sv));
  3396.     fprintf(stderr, "  PAGE = %ld\n", (long)IoPAGE(sv));
  3397.     fprintf(stderr, "  PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
  3398.     fprintf(stderr, "  LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
  3399.     fprintf(stderr, "  TOP_NAME = %s\n", IoTOP_NAME(sv));
  3400.     fprintf(stderr, "  TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
  3401.     fprintf(stderr, "  FMT_NAME = %s\n", IoFMT_NAME(sv));
  3402.     fprintf(stderr, "  FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
  3403.     fprintf(stderr, "  BOTTOM_NAME = %s\n", IoBOTTOM_NAME(sv));
  3404.     fprintf(stderr, "  BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
  3405.     fprintf(stderr, "  SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
  3406.     fprintf(stderr, "  TYPE = %c\n", IoTYPE(sv));
  3407.     fprintf(stderr, "  FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
  3408.     break;
  3409.     }
  3410. }
  3411. #else
  3412. void
  3413. sv_dump(sv)
  3414. SV* sv;
  3415. {
  3416. }
  3417. #endif
  3418.  
  3419. IO*
  3420. sv_2io(sv)
  3421. SV *sv;
  3422. {
  3423.     IO* io;
  3424.     GV* gv;
  3425.  
  3426.     switch (SvTYPE(sv)) {
  3427.     case SVt_PVIO:
  3428.     io = (IO*)sv;
  3429.     break;
  3430.     case SVt_PVGV:
  3431.     gv = (GV*)sv;
  3432.     io = GvIO(gv);
  3433.     if (!io)
  3434.         croak("Bad filehandle: %s", GvNAME(gv));
  3435.     break;
  3436.     default:
  3437.     if (!SvOK(sv))
  3438.         croak(no_usym, "filehandle");
  3439.     if (SvROK(sv))
  3440.         return sv_2io(SvRV(sv));
  3441.     gv = gv_fetchpv(SvPV(sv,na), FALSE, SVt_PVIO);
  3442.     if (gv)
  3443.         io = GvIO(gv);
  3444.     else
  3445.         io = 0;
  3446.     if (!io)
  3447.         croak("Bad filehandle: %s", SvPV(sv,na));
  3448.     break;
  3449.     }
  3450.     return io;
  3451. }
  3452.  
  3453.