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