|
|
/************************************************************/ /* Windows Write, Copyright 1985-1992 Microsoft Corporation */ /************************************************************/
/* format2.c -- MW formatting routines */ /* Less used subroutines */
#define NOGDICAPMASKS
#define NOCTLMGR
#define NOVIRTUALKEYCODES
#define NOWINMESSAGES
#define NOWINSTYLES
#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 "mw.h"
#include "editdefs.h"
#include "cmddefs.h"
#include "fmtdefs.h"
#include "propdefs.h"
#define NOKCCODES
#include "ch.h"
#include "docdefs.h"
#include "ffdefs.h"
#include "filedefs.h"
#include "fkpdefs.h"
#include "printdef.h"
#include "str.h"
#include "wwdefs.h"
extern struct FLI vfli; extern struct SEP vsepAbs; extern typeCP vcpFirstSectCache; extern typeCP vcpFetch; extern int vcchFetch; extern CHAR *vpchFetch; extern int vpgn; extern CHAR stBuf[]; extern struct DOD (**hpdocdod)[]; extern struct WWD rgwwd[]; extern typeCP cpMinDocument;
int CchExpPgn(pch, pgn, nfc, flm, cchMax) CHAR *pch; unsigned pgn, cchMax; int nfc, flm; {
#ifdef CASHMERE
static CHAR rgchUCRoman[] = "IVIIIXLXXXCDCCCMMM???"; static CHAR rgchLCRoman[] = "iviiixlxxxcdcccmmm???"; #define cchRgchDigit 5
#endif /* CASMERE */
if (flm & flmPrinting) {
#ifdef CASHMERE
switch (nfc) { int cch, ich, chLetter; case nfcArabic: if (cchMax < cchMaxNum) return 0; return ncvtu(pgn, &pch); case nfcUCRoman: return CchStuffRoman(&pch, pgn, rgchUCRoman, cchMax); case nfcLCRoman: return CchStuffRoman(&pch, pgn, rgchLCRoman, cchMax); case nfcUCLetter: case nfcLCLetter: if ((cch = (pgn - 1) / 26 + 1) > cchMax) return 0; chLetter = (pgn - 1) % 26 + (nfc == nfcUCLetter ? 'A' : 'a'); for (ich = 0; ich < cch; ich++) pch[ich] = chLetter; return cch; } #else /* not CASHMERE */
if (cchMax < cchMaxNum) return 0; return ncvtu(pgn, &pch); } #endif /* not CASHMERE */
else { int cch; cch = CchChStuff(&pch, chLParen, cchMax); cch += CchStuffIdstr(&pch, IDSTRChPage, cchMax - cch); cch += CchChStuff(&pch, chRParen, cchMax - cch); return cch; } }
/* C C H S T U F F I D S T R */ int CchStuffIdstr(ppch, idstr, cchMax) CHAR **ppch; IDSTR idstr; int cchMax; { int cch; CHAR st[cchMaxExpand]; /* note: we assume no individual idstr
will have a length > cchMaxExpand */
FillStId(st, idstr, sizeof(st)); cch = max(0, min(cchMax, st[0])); bltbyte(&st[1], *ppch, cch); (*ppch) += cch; return cch; }
/* C C H C H S T U F F */ int CchChStuff(ppch, ch, cchMax) CHAR **ppch; CHAR ch; int cchMax; { if(cchMax > 0) { **ppch = ch; (*ppch)++; return 1; } else return 0; }
#ifdef CASHMERE
int CchStuffRoman(ppch, u, rgch, cchMax) CHAR **ppch, *rgch; unsigned u, cchMax; { static CHAR mpdgcch[10] = { 0, 1, 2, 3, 2, 1, 2, 3, 4, 2 }; static CHAR mpdgich[10] = { 0, 0, 2, 2, 0, 1, 1, 1, 1, 4 }; int cch, cchDone;
cchDone = 0; if (u >= 10) { cchDone = CchStuffRoman(ppch, u / 10, rgch + cchRgchDigit, cchMax); cchMax -= cchDone; u %= 10; }
cch = mpdgcch[u]; if (cch > cchMax || cch == 0) return cchDone; bltbyte(&rgch[mpdgich[u]], *ppch, cch); *ppch += cch; return cch + cchDone; } #endif /* CASHMERE */
int FFormatSpecials(pifi, flm, nfc) struct IFI *pifi; int flm; int nfc; { /* A run of special characters was encountered; format it */ /* Return true unless wordwrap required */ int cch; int cchPr; int ich; int dxp; int dxpPr; int sch; CHAR *pchPr;
while (pifi->ichFetch < vcchFetch && pifi->xpPr <= pifi->xpPrRight) {
#ifdef CASHMERE
switch (sch = vpchFetch[pifi->ichFetch++]) { case schPage: cch = CchExpPgn(&vfli.rgch[pifi->ich], vpgn, nfc, flm, ichMaxLine - pifi->ich); break;
case schFootnote: cch = CchExpFtn(&vfli.rgch[pifi->ich], vcpFetch + pifi->ichFetch - 1, flm, ichMaxLine - pifi->ich); break;
default: cch = CchExpUnknown(&vfli.rgch[pifi->ich], flm, ichMaxLine - pifi->ich); break; } #else /* not CASHMERE */
pchPr = &vfli.rgch[pifi->ich]; if ((sch = vpchFetch[pifi->ichFetch]) == schPage && (wwdCurrentDoc.fEditHeader || wwdCurrentDoc.fEditFooter || ((flm & flmPrinting) && vcpFetch + (typeCP)pifi->ichFetch < cpMinDocument))) { cch = CchExpPgn(pchPr, vpgn, nfc, flm, ichMaxLine - pifi->ich); if (flm & flmPrinting) { cchPr = cch; } else { /* Assume that vsepAbs has been set up by FormatLine(). */ cchPr = CchExpPgn(pchPr = &stBuf[0], vsepAbs.pgnStart == pgnNil ? 1 : vsepAbs.pgnStart, nfc, flmPrinting, ichMaxLine - pifi->ich); } } else { cch = cchPr = CchExpUnknown(pchPr, flm, ichMaxLine - pifi->ich); } pifi->ichFetch++; #endif /* not CASHMERE */
dxpPr = 0; for (ich = 0; ich < cchPr; ++ich, ++pchPr) { dxpPr += DxpFromCh(*pchPr, true); } pifi->xpPr += dxpPr; if (flm & flmPrinting) { dxp = dxpPr; } else { dxp = 0; for (ich = pifi->ich; ich < pifi->ich + cch; ++ich) { dxp += DxpFromCh(vfli.rgch[ich], false); } } vfli.rgch[pifi->ich] = sch; pifi->xp += (vfli.rgdxp[pifi->ich++] = dxp);
if (pifi->xpPr > pifi->xpPrRight) { return (vcpFetch == vfli.cpMin); } }
pifi->fPrevSpace = false; return true; }
int CchExpUnknown(pch, flm, cchMax) CHAR *pch; int flm, cchMax; { int cch;
#ifdef CASHMERE
cch = CchChStuff(&pch, chLParen, cchMax); cch += CchChStuff(&pch, chQMark, cchMax - cch); cch += CchChStuff(&pch, chRParen, cchMax - cch); #else /* not CASHMERE */
cch = CchChStuff(&pch, chStar, cchMax); #endif /* not CASHMERE */
return cch; }
#ifdef CASHMERE
int CchExpFtn(pch, cp, flm, cchMax) CHAR *pch; typeCP cp; int flm, cchMax; { int doc = vfli.doc; if (cchMax < cchMaxNum) return 0; if (cp >= CpMacText(doc)) cp = CpRefFromFtn(doc, cp); CacheSect(doc, cp); return ncvtu(IfndFromCp(doc, cp) - IfndFromCp(doc, vcpFirstSectCache) + 1, &pch); } #endif /* CASHMERE */
|