|
|
/************************************************************/ /* 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 */
|