Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

313 lines
6.2 KiB

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