419 lines
7.8 KiB
C
419 lines
7.8 KiB
C
|
/************************************************************/
|
|||
|
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
|
|||
|
/************************************************************/
|
|||
|
|
|||
|
/* util2.c -- less frequently used utility routines */
|
|||
|
#define NOVIRTUALKEYCODES
|
|||
|
#define NOCTLMGR
|
|||
|
#define NOWINMESSAGES
|
|||
|
#define NOWINSTYLES
|
|||
|
#define NOCLIPBOARD
|
|||
|
#define NOGDICAPMASKS
|
|||
|
#define NOSYSMETRICS
|
|||
|
#define NOMENUS
|
|||
|
#define NOCOMM
|
|||
|
#define NOSOUND
|
|||
|
#include <windows.h>
|
|||
|
|
|||
|
#include "mw.h"
|
|||
|
#include "doslib.h"
|
|||
|
#include "str.h"
|
|||
|
#include "machdefs.h"
|
|||
|
#include "cmddefs.h"
|
|||
|
#include "propdefs.h"
|
|||
|
#include "fkpdefs.h"
|
|||
|
#include "docdefs.h"
|
|||
|
#include "debug.h"
|
|||
|
#include "editdefs.h"
|
|||
|
#include "wwdefs.h"
|
|||
|
#define NOKCCODES
|
|||
|
#include "ch.h"
|
|||
|
|
|||
|
extern struct DOD (**hpdocdod)[];
|
|||
|
extern HANDLE hMmwModInstance;
|
|||
|
extern CHAR vchDecimal; /* "decimal point" character */
|
|||
|
extern int viDigits;
|
|||
|
extern BOOL vbLZero;
|
|||
|
CHAR *PchFillPchId(PCH, int, int);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
FillStId(st, idpmt, cchIn)
|
|||
|
CHAR *st;
|
|||
|
IDPMT idpmt;
|
|||
|
int cchIn;
|
|||
|
{ /* load string from resource file to buffer, the string is zero
|
|||
|
terminated, make it into a st, i.e. cch (excluding '\0' is stored
|
|||
|
in the 1st byte of the string) */
|
|||
|
|
|||
|
int cch = LoadString(hMmwModInstance, idpmt, (LPSTR)&st[1], cchIn-1);
|
|||
|
Assert(cch != 0);
|
|||
|
st[0] = cch;
|
|||
|
} /* FillStId */
|
|||
|
|
|||
|
|
|||
|
CHAR *PchFillPchId(sz, idstr, cchIn)
|
|||
|
register CHAR * sz;
|
|||
|
register int idstr;
|
|||
|
int cchIn;
|
|||
|
{ /*
|
|||
|
Description: load string from resource file to buffer, the
|
|||
|
string loaded is zero terminated
|
|||
|
Returns: pointer to '\0' last loaded
|
|||
|
*/
|
|||
|
int cch = LoadString(hMmwModInstance, idstr, (LPSTR)sz, cchIn);
|
|||
|
/* Note: cch does not include the '\0' */
|
|||
|
{
|
|||
|
char msg[80];
|
|||
|
if (cch == 0)
|
|||
|
{
|
|||
|
wsprintf(msg,"bad resource id: 0x%x\n\r",idstr);
|
|||
|
OutputDebugString(msg);
|
|||
|
}
|
|||
|
Assert(cch != 0);
|
|||
|
}
|
|||
|
return(sz + cch);
|
|||
|
} /* end of PchFillPchId */
|
|||
|
|
|||
|
|
|||
|
int FDirtyDoc(doc)
|
|||
|
register int doc;
|
|||
|
{ /* Return true if killing this doc would lose editing */
|
|||
|
register struct DOD *pdod;
|
|||
|
return ((pdod = &(**hpdocdod)[doc])->fDirty && pdod->cref == 1);
|
|||
|
} /* end of F D i r t y D o c */
|
|||
|
|
|||
|
|
|||
|
int ncvtu(n, ppch)
|
|||
|
register int n;
|
|||
|
CHAR **ppch;
|
|||
|
{
|
|||
|
register int cch = 0;
|
|||
|
|
|||
|
if (n < 0)
|
|||
|
{
|
|||
|
*(*ppch)++ = '-';
|
|||
|
n = -n;
|
|||
|
++cch;
|
|||
|
}
|
|||
|
|
|||
|
if (n >= 10)
|
|||
|
{
|
|||
|
cch += ncvtu(n / 10, ppch);
|
|||
|
n %= 10;
|
|||
|
}
|
|||
|
else if ((n == 0) && !vbLZero) // then no leading zero
|
|||
|
return 0;
|
|||
|
|
|||
|
*(*ppch)++ = '0' + n;
|
|||
|
return cch + 1;
|
|||
|
} /* end of n c v t uR */
|
|||
|
|
|||
|
|
|||
|
HANDLE HszGlobalCreate( sz )
|
|||
|
CHAR *sz;
|
|||
|
{ /* Create handle for string in global windows heap. return the handle. */
|
|||
|
HANDLE h;
|
|||
|
LPCH lpch;
|
|||
|
int cch=CchSz( sz );
|
|||
|
|
|||
|
if ((h=GlobalAlloc( GMEM_MOVEABLE, (LONG)cch )) != NULL)
|
|||
|
{
|
|||
|
if ((lpch = GlobalLock( h )) != NULL )
|
|||
|
{
|
|||
|
bltbx( (LPSTR) sz, lpch, cch );
|
|||
|
GlobalUnlock( h );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
GlobalFree( h );
|
|||
|
return NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
return h;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef DEBUG
|
|||
|
fnScribble( dchPos, ch )
|
|||
|
int dchPos;
|
|||
|
CHAR ch;
|
|||
|
{ /* Scribble a char dchPos char positions from the UR screen corner */
|
|||
|
/* We create a special device context to avoid interfering with the */
|
|||
|
/* ones MEMO uses */
|
|||
|
extern struct WWD rgwwd[];
|
|||
|
|
|||
|
static unsigned dxpScribbleChar=0;
|
|||
|
static unsigned dypScribbleChar;
|
|||
|
static unsigned ypScribble;
|
|||
|
|
|||
|
int xp = wwdCurrentDoc.xpMac - (dxpScribbleChar * (dchPos+1));
|
|||
|
int ilevel = SaveDC( wwdCurrentDoc.hDC );
|
|||
|
|
|||
|
SelectObject( wwdCurrentDoc.hDC, GetStockObject(ANSI_FIXED_FONT) );
|
|||
|
|
|||
|
if ( dxpScribbleChar == 0 )
|
|||
|
{ /* First time through */
|
|||
|
TEXTMETRIC tm;
|
|||
|
|
|||
|
GetTextMetrics( wwdCurrentDoc.hDC, (LPTEXTMETRIC)&tm );
|
|||
|
dxpScribbleChar = tm.tmAveCharWidth;
|
|||
|
dypScribbleChar = tm.tmHeight + tm.tmInternalLeading;
|
|||
|
ypScribble = (dypScribbleChar >> 2) + wwdCurrentDoc.ypMin;
|
|||
|
}
|
|||
|
PatBlt( wwdCurrentDoc.hDC, xp, ypScribble, dxpScribbleChar, dypScribbleChar,
|
|||
|
WHITENESS );
|
|||
|
TextOut( wwdCurrentDoc.hDC, xp, ypScribble, (LPSTR) &ch, 1 );
|
|||
|
RestoreDC( wwdCurrentDoc.hDC, ilevel );
|
|||
|
}
|
|||
|
#endif /* DEBUG */
|
|||
|
|
|||
|
|
|||
|
/* original util3.c starts from here */
|
|||
|
|
|||
|
#define iMaxOver10 3276
|
|||
|
extern int utCur;
|
|||
|
|
|||
|
/* Must agree with cmddefs.h */
|
|||
|
extern CHAR *mputsz[];
|
|||
|
|
|||
|
/* Must agree with cmddefs.h */
|
|||
|
unsigned mputczaUt[utMax] =
|
|||
|
{
|
|||
|
czaInch, czaCm, czaP10, czaP12, czaPoint,
|
|||
|
czaLine
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int FZaFromSs(pza, ss, cch, ut)
|
|||
|
int *pza;
|
|||
|
CHAR ss[];
|
|||
|
int cch,
|
|||
|
ut;
|
|||
|
{ /* Return za in *pza from string representation in ss. True if valid za */
|
|||
|
long lza = 0;
|
|||
|
register CHAR *pch = ss;
|
|||
|
register CHAR *pchMac = &ss[cch];
|
|||
|
int ch;
|
|||
|
unsigned czaUt;
|
|||
|
int fNeg;
|
|||
|
|
|||
|
if (cch <= 0)
|
|||
|
return false;
|
|||
|
|
|||
|
switch (*--pchMac)
|
|||
|
{ /* Check for units */
|
|||
|
case 'n': /* inch */
|
|||
|
if (*--pchMac != 'i')
|
|||
|
goto NoUnits;
|
|||
|
case '"': /* inch */
|
|||
|
ut = utInch;
|
|||
|
break;
|
|||
|
|
|||
|
#ifdef CASHMERE /* units such as pt, pt12, pt10 */
|
|||
|
case '0': /* pt10 */
|
|||
|
if (*--pchMac != '1' || *--pchMac != 'p')
|
|||
|
goto NoUnits;
|
|||
|
ut = utP10;
|
|||
|
break;
|
|||
|
case '2': /* pt12 */
|
|||
|
if (*--pchMac != '1' || *--pchMac != 'p')
|
|||
|
goto NoUnits;
|
|||
|
ut = utP12;
|
|||
|
break;
|
|||
|
case 'i': /* line */
|
|||
|
if (*--pchMac != 'l')
|
|||
|
goto NoUnits;
|
|||
|
ut = utLine;
|
|||
|
break;
|
|||
|
case 't': /* pt */
|
|||
|
if (*--pchMac != 'p')
|
|||
|
goto NoUnits;
|
|||
|
ut = utPoint;
|
|||
|
break;
|
|||
|
#endif /* CASHMERE */
|
|||
|
|
|||
|
case 'm': /* cm */
|
|||
|
if (*--pchMac != 'c')
|
|||
|
goto NoUnits;
|
|||
|
ut = utCm;
|
|||
|
break;
|
|||
|
default:
|
|||
|
++pchMac;
|
|||
|
break;
|
|||
|
NoUnits:
|
|||
|
pchMac = &ss[cch];
|
|||
|
}
|
|||
|
|
|||
|
while (pch < pchMac && *(pchMac - 1) == chSpace)
|
|||
|
--pchMac;
|
|||
|
|
|||
|
czaUt = mputczaUt[ut];
|
|||
|
|
|||
|
/* extract leading blanks */
|
|||
|
while (*pch == ' ')
|
|||
|
pch++;
|
|||
|
|
|||
|
fNeg = *pch == '-';
|
|||
|
if (fNeg) ++pch; /* skip past minus sign */
|
|||
|
while ((ch = *pch++) != vchDecimal)
|
|||
|
{
|
|||
|
if ((ch < '0' || ch > '9') || lza >= iMaxOver10)
|
|||
|
return false;
|
|||
|
lza = lza * 10 + (ch - '0') * czaUt;
|
|||
|
if (pch >= pchMac)
|
|||
|
goto GotNum;
|
|||
|
}
|
|||
|
|
|||
|
while (pch < pchMac)
|
|||
|
{
|
|||
|
ch = *pch++;
|
|||
|
if (ch < '0' || ch > '9')
|
|||
|
return false;
|
|||
|
lza += ((ch - '0') * czaUt + 5) / 10;
|
|||
|
czaUt = (czaUt + 5) / 10;
|
|||
|
}
|
|||
|
|
|||
|
GotNum:
|
|||
|
if (lza > ((long) (22 * czaInch)))
|
|||
|
return false;
|
|||
|
|
|||
|
*pza = fNeg ? (int) -lza : (int) lza;
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
int
|
|||
|
CchExpZa(ppch, za, ut, cchMax)
|
|||
|
CHAR **ppch;
|
|||
|
int ut, cchMax;
|
|||
|
register int za;
|
|||
|
{ /* Stuff the expansion of linear measure za in unit ut into pch.
|
|||
|
Return # of chars stuffed. Don't exceed cchMax. */
|
|||
|
register int cch = 0;
|
|||
|
unsigned czaUt;
|
|||
|
int zu;
|
|||
|
|
|||
|
/* If not in point mode and even half line, display as half lines v. points */
|
|||
|
if (ut == utPoint && utCur != utPoint &&
|
|||
|
(za / (czaLine / 2) * (czaLine / 2)) == za)
|
|||
|
ut = utLine;
|
|||
|
|
|||
|
|
|||
|
czaUt = mputczaUt[ut];
|
|||
|
if (cchMax < cchMaxNum)
|
|||
|
return 0;
|
|||
|
|
|||
|
if (za < 0)
|
|||
|
{ /* Output minus sign and make positive */
|
|||
|
*(*ppch)++ = '-';
|
|||
|
za = -za;
|
|||
|
cch++;
|
|||
|
}
|
|||
|
|
|||
|
/* round off to two decimal places */
|
|||
|
za += czaUt / 200;
|
|||
|
|
|||
|
zu = za / czaUt; /* Get integral part */
|
|||
|
|
|||
|
cch += ncvtu(zu, ppch); /* Expand integral part */
|
|||
|
|
|||
|
za -= zu * czaUt; /* Retain fraction part */
|
|||
|
|
|||
|
if (((za *= 10) >= czaUt || za * 10 >= czaUt) && (viDigits > 0))
|
|||
|
{ /* Check *10 first because of possible overflow */
|
|||
|
zu = za / czaUt;
|
|||
|
|
|||
|
*(*ppch)++ = vchDecimal;
|
|||
|
cch++;
|
|||
|
|
|||
|
*(*ppch)++ = '0' + zu;
|
|||
|
cch++;
|
|||
|
zu = ((za - zu * czaUt) * 10) / czaUt;
|
|||
|
if ((zu != 0) && (viDigits > 1))
|
|||
|
{
|
|||
|
*(*ppch)++ = '0' + zu;
|
|||
|
cch++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (cch <= 1)
|
|||
|
/* force zeroes */
|
|||
|
{
|
|||
|
if ((cch == 0) && vbLZero) // then no leading zero
|
|||
|
{
|
|||
|
*(*ppch)++ = '0';
|
|||
|
cch++;
|
|||
|
}
|
|||
|
*(*ppch)++ = vchDecimal;
|
|||
|
cch++;
|
|||
|
if (viDigits > 0)
|
|||
|
{
|
|||
|
*(*ppch)++ = '0';
|
|||
|
cch++;
|
|||
|
}
|
|||
|
if (viDigits > 1)
|
|||
|
{
|
|||
|
*(*ppch)++ = '0';
|
|||
|
cch++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
cch += CchStuff(ppch, mputsz[ut], cchMax - cch);
|
|||
|
|
|||
|
return cch;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#ifdef KEEPALL /* Use FPdxaFromItDxa2Id */
|
|||
|
int DxaFromSt(st, ut)
|
|||
|
register CHAR *st;
|
|||
|
int ut;
|
|||
|
{
|
|||
|
int za;
|
|||
|
|
|||
|
if (*st > 0 && FZaFromSs(&za, st+1, *st, ut)) /* see util.c */
|
|||
|
return za;
|
|||
|
else
|
|||
|
return valNil;
|
|||
|
}
|
|||
|
|
|||
|
int DxaFromItem(it)
|
|||
|
int it;
|
|||
|
{
|
|||
|
int za;
|
|||
|
register CHAR stBuf[32];
|
|||
|
|
|||
|
GetItTextValue(it, stBuf);
|
|||
|
|
|||
|
if (*stBuf > 0 && FZaFromSs(&za, stBuf+1, *stBuf, utCur)) /* see util.c */
|
|||
|
return (za == valNil) ? 0 : za;
|
|||
|
else
|
|||
|
return valNil;
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
int CchStuff(ppch, sz, cchMax)
|
|||
|
CHAR **ppch, sz[];
|
|||
|
int cchMax;
|
|||
|
{
|
|||
|
register int cch = 0;
|
|||
|
register CHAR *pch = *ppch;
|
|||
|
|
|||
|
while (cchMax-- > 0 && (*pch = *sz++) != 0)
|
|||
|
{
|
|||
|
cch++;
|
|||
|
pch++;
|
|||
|
}
|
|||
|
|
|||
|
if (cchMax < 0)
|
|||
|
bltbyte("...", pch - 3, 3);
|
|||
|
|
|||
|
*ppch = pch;
|
|||
|
return cch;
|
|||
|
}
|
|||
|
|