313 lines
6.2 KiB
C
313 lines
6.2 KiB
C
/************************************************************/
|
||
/* 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 */
|
||
|