windows-nt/Source/XPSP1/NT/base/mvdm/wow16/write/editftn.c

242 lines
7.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/************************************************************/
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
/************************************************************/
#define NOCLIPBOARD
#define NOGDICAPMASKS
#define NOCTLMGR
#define NOVIRTUALKEYCODES
#define NOWINMESSAGES
#define NOWINSTYLES
#define NOSYSMETRICS
#define NOMENUS
#define NOKEYSTATE
#define NOGDI
#define NORASTEROPS
#define NOSYSCOMMANDS
#define NOSHOWWINDOW
#define NOCOLOR
#define NOATOM
#define NOBITMAP
#define NOICON
#define NOBRUSH
#define NOCREATESTRUCT
#define NOMB
#define NOFONT
#define NOMSG
#define NOOPENFILE
#define NOPEN
#define NOPOINT
#define NOREGION
#define NOSCROLL
#define NOSOUND
#define NOWH
#define NOWINOFFSETS
#define NOWNDCLASS
#define NOCOMM
#include <windows.h>
/*#include "toolbox.h"*/
#include "mw.h"
#include "cmddefs.h"
#include "dispdefs.h"
#include "wwdefs.h"
#include "docdefs.h"
#include "editdefs.h"
#include "filedefs.h"
#include "str.h"
#include "propdefs.h"
#include "fkpdefs.h"
#include "printdef.h" /* printdefs.h */
#include "debug.h"
extern struct DOD (**hpdocdod)[];
extern struct FCB (**hpfnfcb)[];
extern int wwMac;
extern struct WWD rgwwd[];
extern struct WWD *pwwdCur;
extern int **HAllocate();
extern int docCur;
extern typeCP cpMacCur;
extern struct SEL selCur;
extern int ferror;
#ifdef FOOTNOTES
AddFtns(docDest, cpDest, docSrc, cpFirst, cpLim, hfntbSrc)
int docDest, docSrc;
typeCP cpDest, cpFirst, cpLim;
struct FNTB **hfntbSrc;
{ /* Add footnote text to coppespond with inserted references */
/* Called after inserting docSrc[cpFirst:cpLim) into docDest@cpDest */
struct FNTB *pfntbSrc, **hfntbDest, *pfntbDest;
struct FND *pfndSrc, *pfndDest;
int cfndDest, ifndSrc, cfndIns, ifndDest;
typeCP cpFtnSrc, dcpFtn, cpFtnDest;
typeCP dcp;
if ((pfndSrc = &(pfntbSrc = *hfntbSrc)->rgfnd[0])->cpFtn <= cpFirst)
return; /* No footnotes or source text is inside ftns */
pfndSrc += (ifndSrc = IcpSearch(cpFirst, pfndSrc,
cchFND, bcpRefFND, pfntbSrc->cfnd));
cpFtnSrc = pfndSrc->cpFtn;
/* Find all references in inserted area. */
for (cfndIns = 0; pfndSrc->cpRef < cpLim; pfndSrc++, cfndIns++)
;
if (cfndIns != 0)
{ /* Insert footnote text and fnd's. */
dcpFtn = pfndSrc->cpFtn - cpFtnSrc; /* Length of ftn texts */
/* Ensure destination fntb large enough */
/* HEAP MOVEMENT */
if (FNoHeap(hfntbDest = HfntbEnsure(docDest, cfndIns)))
return;
if ((pfndDest = &(pfntbDest = *hfntbDest)->rgfnd[0])->cpFtn <= cpDest)
{ /* Inserting refs inside footnotes? No way! */
Error(IDPMTFtnLoad);
return;
}
/* Find ifnd to insert new fnd's */
ifndDest = IcpSearch(cpDest, pfndDest,
cchFND, bcpRefFND, cfndDest = pfntbDest->cfnd);
/* Insert new footnote text */
/* HEAP MOVEMENT */
ReplaceCps(docDest, cpFtnDest = (pfndDest + ifndDest)->cpFtn, cp0,
docSrc, cpFtnSrc, dcpFtn);
if (ferror)
return;
/* Insert new fnd's */
pfndSrc = &(pfntbSrc = *hfntbSrc)->rgfnd[ifndSrc];
pfndDest = &(pfntbDest = *hfntbDest)->rgfnd[ifndDest];
pfntbDest->cfnd += cfndIns; /* Update fnd count */
pfndDest->cpFtn += dcpFtn; /* AdjustCp considers the insertion to be
part of this footnote; correct it. */
blt(pfndDest, pfndDest + cfndIns,
cwFND * (cfndDest - ifndDest)); /* Open up fntb */
while (cfndIns--)
{ /* Copy fnd's */
pfndDest->cpRef = cpDest + pfndSrc->cpRef - cpFirst;
(pfndDest++)->cpFtn =
cpFtnDest + (pfndSrc++)->cpFtn - cpFtnSrc;
}
/* Invalidate dl's of later ftn refs */
dcp = (**hfntbDest).rgfnd[0].cpFtn - ccpEol - cpDest;
AdjustCp(docDest, cpDest, dcp, dcp);
RecalcWwCps();
}
}
#endif /* FOOTNOTES */
#ifdef FOOTNOTES
/* R E M O V E D E L F T N T E X T */
RemoveDelFtnText(doc, cpFirst, cpLim, hfntb)
int doc;
typeCP cpFirst,cpLim;
struct FNTB **hfntb;
/* Remove the text of footnotes that are contained in the selection that is
delimited by cpFirst and CpLim */
{
struct FNTB *pfntb;
struct FND *pfnd, *pfndT;
int cfnd, ifnd, cfndDel;
if ((pfnd = &(pfntb = *hfntb)->rgfnd[0])->cpFtn > cpFirst)
{
pfnd += (ifnd =
IcpSearch(cpFirst, pfnd, cchFND, bcpRefFND, cfnd = pfntb->cfnd));
/* Find all references in deleted area. */
for (pfndT = pfnd, cfndDel = 0; pfndT->cpRef < cpLim; pfndT++, cfndDel++)
;
#ifdef DEBUG
Assert(ifnd + cfndDel < cfnd);
#endif
if (cfndDel != 0)
{ /* Delete footnote text and close up fntb. */
typeCP cpDel = pfnd->cpFtn;
blt(pfndT, pfnd, cwFND * ((cfnd -= cfndDel) - ifnd));
(*hfntb)->cfnd = cfnd;
/* HEAP MOVEMENT */
Replace(doc, cpDel, pfnd->cpFtn - cpDel, fnNil, fc0, fc0);
if (cfnd == 1)
{
Replace(doc, (**hpdocdod)[doc].cpMac - ccpEol,
(typeCP) ccpEol, fnNil, fc0, fc0);
FreeH((**hpdocdod)[doc].hfntb);
(**hpdocdod)[doc].hfntb = 0;
/* fix selCur twisted by AdjustCp. Another AdjustCp still pending. */
if (doc == docCur && !pwwdCur->fFtn)
{
selCur.cpFirst = selCur.cpLim = cpLim;
cpMacCur = (**hpdocdod)[doc].cpMac;
}
}
else
{ /* Invalidate dl's of later ftn refs */
typeCP dcp = (**hfntb).rgfnd[0].cpFtn -
ccpEol - cpLim;
AdjustCp(doc, cpLim, dcp, dcp);
}
}
}
}
#endif /* FOOTNOTES */
#ifdef FOOTNOTES
struct FNTB **HfntbCreate(fn)
int fn;
{ /* Create a footnote table from a formatted file */
struct FNTB *pfntbFile;
typePN pn;
int cchT;
int cfnd;
struct FNTB **hfntb;
int *pwFntb;
int cw;
#ifdef DEBUG
Assert(fn != fnNil && (**hpfnfcb)[fn].fFormatted);
#endif
if ((pn = (**hpfnfcb)[fn].pnFntb) == (**hpfnfcb)[fn].pnSep)
return 0;
pfntbFile = (struct FNTB *) PchGetPn(fn, pn, &cchT, false);
if ((cfnd = pfntbFile->cfnd) == 0)
return (struct FNTB **)0;
hfntb = (struct FNTB **) HAllocate(cw = cwFNTBBase + cfnd * cwFND);
if (FNoHeap(hfntb))
return (struct FNTB **)hOverflow;
pwFntb = (int *) *hfntb;
blt(pfntbFile, pwFntb, min(cwSector, cw));
while ((cw -= cwSector) > 0)
{ /* Copy the fnd's to heap */
blt(PchGetPn(fn, ++pn, &cchT, false), pwFntb += cwSector,
min(cwSector, cw));
}
(*hfntb)->cfndMax = cfnd;
return hfntb;
}
#endif /* FOOTNOTES */