- topgv = gv_fetchsv(topname, 0, SVt_PVFM);
- if ((topgv && GvFORM(topgv)) ||
- !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
- IoTOP_NAME(io) = savesvpv(topname);
- else
- IoTOP_NAME(io) = savepvs("top");
- }
- topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
- if (!topgv || !GvFORM(topgv)) {
- IoLINES_LEFT(io) = IoPAGE_LEN(io);
- goto forget_top;
- }
- IoTOP_GV(io) = topgv;
- }
- if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
- I32 lines = IoLINES_LEFT(io);
- const char *s = SvPVX_const(PL_formtarget);
- if (lines <= 0) /* Yow, header didn't even fit!!! */
- goto forget_top;
- while (lines-- > 0) {
- s = strchr(s, '\n');
- if (!s)
- break;
- s++;
- }
- if (s) {
- const STRLEN save = SvCUR(PL_formtarget);
- SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
- do_print(PL_formtarget, ofp);
- SvCUR_set(PL_formtarget, save);
- sv_chop(PL_formtarget, s);
- FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
- }
- }
- if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
- do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
- IoLINES_LEFT(io) = IoPAGE_LEN(io);
- IoPAGE(io)++;
- PL_formtarget = PL_toptarget;
- IoFLAGS(io) |= IOf_DIDTOP;
- fgv = IoTOP_GV(io);
- assert(fgv); /* IoTOP_GV(io) should have been set above */
- cv = GvFORM(fgv);
- if (!cv) {
- SV * const sv = sv_newmortal();
- gv_efullname4(sv, fgv, NULL, FALSE);
- DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
- }
- return doform(cv, gv, PL_op);
+ topgv = gv_fetchsv(topname, 0, SVt_PVFM);
+ if ((topgv && GvFORM(topgv)) ||
+ !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
+ IoTOP_NAME(io) = savesvpv(topname);
+ else
+ IoTOP_NAME(io) = savepvs("top");
+ }
+ topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
+ if (!topgv || !GvFORM(topgv)) {
+ IoLINES_LEFT(io) = IoPAGE_LEN(io);
+ goto forget_top;
+ }
+ IoTOP_GV(io) = topgv;
+ }
+ if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
+ I32 lines = IoLINES_LEFT(io);
+ const char *s = SvPVX_const(PL_formtarget);
+ const char *e = SvEND(PL_formtarget);
+ if (lines <= 0) /* Yow, header didn't even fit!!! */
+ goto forget_top;
+ while (lines-- > 0) {
+ s = (char *) memchr(s, '\n', e - s);
+ if (!s)
+ break;
+ s++;
+ }
+ if (s) {
+ const STRLEN save = SvCUR(PL_formtarget);
+ SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
+ do_print(PL_formtarget, ofp);
+ SvCUR_set(PL_formtarget, save);
+ sv_chop(PL_formtarget, s);
+ FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
+ }
+ }
+ if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
+ do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
+ IoLINES_LEFT(io) = IoPAGE_LEN(io);
+ IoPAGE(io)++;
+ PL_formtarget = PL_toptarget;
+ IoFLAGS(io) |= IOf_DIDTOP;
+ fgv = IoTOP_GV(io);
+ assert(fgv); /* IoTOP_GV(io) should have been set above */
+ cv = GvFORM(fgv);
+ if (!cv) {
+ SV * const sv = sv_newmortal();
+ gv_efullname4(sv, fgv, NULL, FALSE);
+ DIE(aTHX_ "Undefined top format \"%" SVf "\" called", SVfARG(sv));
+ }
+ return doform(cv, gv, PL_op);