242 lines
7.2 KiB
C
242 lines
7.2 KiB
C
|
/************************************************************/
|
|||
|
/* 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 */
|
|||
|
|