|
|
1.1 root 1:
2: /****************************** Module Header ******************************\
3: * Module Name: message.c - procecures to process the message dialog
4: *
5: * Created: Microsoft, IBM Corporation 1990
6: *
7: \***************************************************************************/
8:
9: #define INCL_WIN
10: #define INCL_WINSYS
11: #define INCL_DOSPROCESS
12: #include <os2.h>
13: #include <stdio.h>
14: #include <string.h>
15: #include "spy.h"
16: #include "spyhk32.h"
17: #include <time.h>
18: #include <stdlib.h>
19:
20: /* This is a real hack, estimate size of WND Structure */
21: #define SIZEOFWND 34
22: #define MAXMSGBYTES 100
23:
24: /************* GLOBAL VARIABLES */
25:
26:
27: /************* PROCEDURE DECLARATIONS */
28:
29:
30:
31: void UpdMsgsLBSels (USHORT, BOOL);
32: void UpdMsgTblFromLB (HWND);
33: void ProcessQueueMsg(QMSGSPY *);
34: void SelOrDeselWithMouse(BOOL);
35: void UpdateMsgBoxCurMsgText(HWND);
36:
37: void SelectMessageFromText(HWND);
38: void SendMsgProcCmd(HWND, USHORT);
39: void SetItemHexNum(HWND, USHORT, ULONG);
40: ULONG GetItemVal(HWND, USHORT, BOOL, PSZ, PSZ);
41:
42:
43:
44:
45:
46: /**************************** Public Function ******************************\
47: * MRESULT EXPENTRY SpyMsgDlgProc (hwnd, msg, mp1, mp2)
48: *
49: * Effects: Message List dialog procedure
50: *
51: *
52: * Return value:
53: \***************************************************************************/
54: MRESULT EXPENTRY SpyMsgDlgProc(hwnd, msg, mp1, mp2)
55: HWND hwnd;
56: USHORT msg;
57: MPARAM mp1;
58: MPARAM mp2;
59: {
60: SHORT i;
61: MSGI *pmsgi;
62: USHORT item;
63: SHORT bHooksNew;
64: USHORT iItemFocus; /* Index to item that has the focus */
65:
66: switch (msg) {
67:
68: case WM_INITDLG:
69: /*
70: * Initialize the list box with the list of messages that are
71: * defined in our message table
72: */
73: iCurItemFocus = -1;
74: pmsgi = rgmsgi; /* Point to start of list */
75: hwndMessageLB = WinWindowFromID(hwnd, DID_OMSGLIST);
76: for (i = 0; i < cmsgi; i++) {
77: pmsgi->iListBox = item = (USHORT)WinSendMsg(hwndMessageLB,
78: LM_INSERTITEM,
79: (MPARAM)(spyopt.fAlphaSortMsgList? LIT_SORTASCENDING : LIT_END),
80: (MPARAM)(PSZ)pmsgi->szMsg);
81: WinSendMsg(hwndMessageLB, LM_SETITEMHANDLE, (MPARAM)item,
82: (MPARAM)i);
83: if (pmsgi->wOptions & MSGI_ENABLED) {
84: WinSendMsg(hwndMessageLB, LM_SELECTITEM, (MPARAM)item,
85: (MPARAM)TRUE);
86: }
87: pmsgi++;
88: }
89:
90: /*
91: * If alpha Sort, we need to make a second pass through, and update
92: * our indexes of where each message is in the list box
93: */
94: if (spyopt.fAlphaSortMsgList) {
95: for (i = 0; i < cmsgi; i++) {
96: item = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
97: MPFROMSHORT(i), 0L);
98: rgmsgi[item].iListBox = i;
99: }
100: }
101:
102:
103:
104: /* Initialize the Hook type record */
105: WinSendDlgItemMsg(hwnd, DID_OINPUT, BM_SETCHECK,
106: (MPARAM)(spyopt.bHooks & SPYH_INPUT)?1 : 0, 0L);
107:
108: WinSendDlgItemMsg(hwnd, DID_OSENDMSG, BM_SETCHECK,
109: (MPARAM)(spyopt.bHooks & SPYH_SENDMSG)?1 : 0, 0L);
110:
111: WinSendDlgItemMsg(hwnd, DID_OTHERMSGS, BM_SETCHECK,
112: (MPARAM)(spyopt.fDispOtherMsgs), 0L);
113:
114: WinSetFocus(HWND_DESKTOP, hwndMessageLB);
115: fTrackingListBox = TRUE;
116: return ((MRESULT)TRUE); /* We set the focus */
117:
118: break;
119:
120: case WM_CHAR:
121: /*
122: * Handle VK_ENTER and VK_NEWLINE if our Edit control has
123: * the focus and it is a keydown
124: */
125: if (!(SHORT1FROMMP(mp1) & KC_KEYUP) &&
126: (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
127: ( (SHORT2FROMMP(mp2) == VK_ENTER) ||
128: (SHORT2FROMMP(mp2) == VK_NEWLINE) )) {
129:
130:
131: if (WinQueryFocus(HWND_DESKTOP, FALSE) ==
132: WinWindowFromID(hwnd, DID_MSGEDIT)) {
133: SelectMessageFromText(hwnd);
134: break;
135: }
136: }
137:
138: /* Normaly pass to dialog procedure to handle message */
139: return(WinDefDlgProc(hwnd, msg, mp1, mp2));
140: break;
141:
142: case WM_COMMAND:
143: switch (SHORT1FROMMP(mp1)) {
144: case DID_OK:
145:
146: /*
147: * Call to update the Message table select bits
148: */
149:
150: UpdMsgTblFromLB (hwnd);
151:
152: /* Setup new hook options */
153: bHooksNew = 0;
154:
155: if ((BOOL)WinSendDlgItemMsg(hwnd,
156: DID_OINPUT, BM_QUERYCHECK, 0L, 0L))
157: bHooksNew = SPYH_INPUT;
158:
159: if ((BOOL)WinSendDlgItemMsg(hwnd,
160: DID_OSENDMSG, BM_QUERYCHECK, 0L, 0L))
161: bHooksNew |= SPYH_SENDMSG;
162:
163: if (bHooksNew != spyopt.bHooks) {
164: SpyReleaseHook (FALSE); /* Dont clear queue */
165: spyopt.bHooks = bHooksNew;
166: SpyInstallHook(hab, hmqSpy, spyopt.bHooks); /* Install hook again */
167: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
168: MM_SETITEMATTR, MPFROM2SHORT(CMD_INPUTHOOK, TRUE),
169: MPFROM2SHORT(MIA_CHECKED,
170: (spyopt.bHooks & SPYH_INPUT) ? MIA_CHECKED : 0));
171: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
172: MM_SETITEMATTR, MPFROM2SHORT(CMD_SENDMSGHOOK, TRUE),
173: MPFROM2SHORT(MIA_CHECKED,
174: (spyopt.bHooks & SPYH_SENDMSG) ? MIA_CHECKED : 0));
175: }
176:
177: /* Fall through to DID_CANCEL */
178: case DID_CANCEL:
179: /* Now dismiss the dialog */
180: hwndMessageLB = NULL; /* Not here anymore to process */
181: fTrackingListBox = FALSE;
182: WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
183: break;
184:
185: /*
186: * These case simply update the listbox with which messages are
187: * enabled
188: */
189: case DID_MALL:
190: UpdMsgsLBSels (0, TRUE);
191: break;
192: case DID_MNONE:
193: UpdMsgsLBSels (0, FALSE);
194: break;
195: case DID_MCON:
196: UpdMsgsLBSels (MSGI_KEY, TRUE);
197: break;
198: case DID_MCOFF:
199: UpdMsgsLBSels (MSGI_KEY, FALSE);
200: break;
201: case DID_MMON:
202: UpdMsgsLBSels (MSGI_MOUSE, TRUE);
203: break;
204: case DID_MMOFF:
205: UpdMsgsLBSels (MSGI_MOUSE, FALSE);
206: break;
207: case DID_MFON:
208: UpdMsgsLBSels (MSGI_FREQ, TRUE);
209: break;
210: case DID_MFOFF:
211: UpdMsgsLBSels (MSGI_FREQ, FALSE);
212: break;
213: }
214: break;
215:
216: default:
217: /*
218: * Default is to see if the listbox has changed its focus
219: * item number. If it has, then we want to display the information
220: * about the window that the listbox cursor is over. There is no
221: * legal way to do this, except to temporarily put the listbox into
222: * single selection mode and query the selection.
223: */
224: if (fTrackingListBox && (hwndMessageLB != NULL)) {
225: WinSetWindowBits(hwndMessageLB, QWL_STYLE, 0L, LS_MULTIPLESEL);
226: iItemFocus = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION,
227: (MPARAM)LIT_FIRST, 0L);
228: WinSetWindowBits(hwndMessageLB, QWL_STYLE, LS_MULTIPLESEL,
229: LS_MULTIPLESEL);
230: if (iItemFocus != iCurItemFocus) {
231: iCurItemFocus = iItemFocus;
232: UpdateMsgBoxCurMsgText(hwnd);
233: }
234: }
235: return(WinDefDlgProc(hwnd, msg, mp1, mp2));
236: break;
237: }
238: return 0L;
239: }
240:
241:
242:
243: /***************************** Private Function ****************************\
244: * void UpdateMsgBoxCurMsgText()
245: *
246: * Effects:
247: * Updates the text that is displayed in the message text line
248: *
249: * History:
250: * 27-September-1988 KurtE
251: \***************************************************************************/
252: void UpdateMsgBoxCurMsgText(hwndDlg)
253: HWND hwndDlg;
254: {
255: SHORT sMsgI;
256: char szTemp[80];
257:
258:
259: if (iCurItemFocus >= 0) {
260: /* Get the messge index */
261: sMsgI = (SHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
262: (MPARAM)iCurItemFocus, 0L);
263: sprintf(szTemp, "0x%04x - %s", rgmsgi[sMsgI].msg,
264: rgmsgi[sMsgI].szMsg);
265: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)szTemp);
266: } else {
267: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)"");
268: }
269:
270: }
271:
272:
273:
274:
275: /***************************** Private Function ****************************\
276: * void SelectMessageFromText(hwndDlg)
277: *
278: * Effects:
279: * Updates the text that is displayed in the message text line
280: *
281: * History:
282: * 27-September-1988 KurtE
283: \***************************************************************************/
284: void SelectMessageFromText(hwndDlg)
285: HWND hwndDlg;
286: {
287: char szTemp[80];
288: USHORT msg;
289: MSGI *pmsgi;
290: int i;
291:
292:
293: /* First get the edit text from the string */
294: WinQueryDlgItemText(hwndDlg, DID_MSGEDIT, sizeof(szTemp),
295: (PSZ)szTemp);
296:
297: if ((msg = UConvertStringToNum(szTemp)) != 0xffff) {
298:
299: /* We have a number, now try to find message in message table */
300: pmsgi = PmsgiFromMsg(msg);
301:
302: } else {
303: /* Assume String, Try to locate string in our table */
304: pmsgi = rgmsgi; /* Start at beginning of table */
305: /*
306: * This does simple string compares, it does not map case, nor
307: * does it trim the string.
308: */
309: for (i=0; i < cmsgi; i++) {
310: if (strcmpi(pmsgi->szMsg, szTemp) == 0)
311: break;
312: pmsgi++;
313: };
314:
315: if (i >= cmsgi)
316: pmsgi = NULL;
317: }
318:
319: /*
320: * Have a pointer to MSGI of message, or NULL if not in list.
321: */
322: if(pmsgi != NULL) {
323: /* First make sure it is visible */
324: WinSendMsg(hwndMessageLB, LM_SETTOPINDEX,
325: MPFROMSHORT(pmsgi->iListBox), (MPARAM)0L);
326:
327: /* Always set it on */
328: WinSendMsg(hwndMessageLB, LM_SELECTITEM,
329: MPFROMSHORT(pmsgi->iListBox), MPFROMSHORT(TRUE));
330:
331: } else {
332: WinAlarm(HWND_DESKTOP, WA_WARNING);
333: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)"");
334: }
335: }
336:
337:
338:
339:
340:
341: /**************************** Public Function ******************************\
342: * void UpdMsgsLBSels (USHORT uMask, fOnOrOff);
343: *
344: * Effects: Will update the selected items in the message listbox, that is
345: * displayed in the options dialog
346: *
347: * Return value: none
348: \***************************************************************************/
349: void UpdMsgsLBSels (uMask, fOnOrOff)
350: USHORT uMask;
351: BOOL fOnOrOff;
352: {
353:
354: SHORT i;
355: MSGI *pmsgi;
356:
357: /*
358: * Loop through all of the items in our list, if the mask is 0 or
359: * the bit is on in the item, then update the select state in listbox
360: * defined in our message table
361: */
362: fTrackingListBox = FALSE;
363: pmsgi = rgmsgi; /* Point to start of list */
364: for (i = 0; i < cmsgi; i++) {
365: if ((uMask == 0) || (pmsgi->wOptions & uMask)) {
366: WinSendMsg(hwndMessageLB, LM_SELECTITEM,
367: (MPARAM)pmsgi->iListBox, (MPARAM)fOnOrOff);
368: }
369: pmsgi++;
370: }
371: fTrackingListBox = TRUE;
372: }
373:
374:
375:
376: /**************************** Public Function ******************************\
377: * void UpdMsgsLBSels (HWND hwndDialog, USHORT uMask, fOnOrOff);
378: *
379: * Effects: Will update the selected items in the message listbox, that is
380: * displayed in the options dialog
381: *
382: * Return value: none
383: \***************************************************************************/
384: void UpdMsgTblFromLB (hwndDialog)
385: HWND hwndDialog;
386: {
387:
388: USHORT i;
389: register MSGI *pmsgi;
390: USHORT itemSel;
391:
392: /*
393: * Loop through all of the items in the list and update the selection
394: * status depending of if the item is selected in the list box or
395: * not.
396: */
397: /* First simply turn off all of the bits */
398: pmsgi = rgmsgi;
399: for (i = 0; i < cmsgi; i++) {
400: pmsgi->wOptions &= ~MSGI_ENABLED;
401: pmsgi++;
402: }
403:
404: /* Then turn on all of the selected items */
405: itemSel = (USHORT)LIT_FIRST;
406:
407: while ((itemSel = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION,
408: (MPARAM)itemSel, 0L)) != (USHORT)LIT_NONE) {
409:
410: /* The item handle contains index in our array */
411: i = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
412: (MPARAM)itemSel, 0L);
413:
414: rgmsgi[i].wOptions |= MSGI_ENABLED;
415: }
416:
417: /* Get the Other message option from checkmark */
418: spyopt.fDispOtherMsgs = ((BOOL)WinSendDlgItemMsg(hwndDialog, DID_OTHERMSGS,
419: BM_QUERYCHECK, 0L, 0L));
420:
421: /* Now call function to update the hooks message list */
422: UpdateHooksMsgTable();
423: }
424:
425:
426:
427:
428: /**************************** Public Function ******************************\
429: * void UpdateHooksMsgTable(void)
430: *
431: * Effects: Set the message bitmask to the hook, for interested messages.
432: * displayed in the options dialog
433: *
434: * Return value: none
435: \***************************************************************************/
436: void UpdateHooksMsgTable()
437: {
438: MSGI *pmsgi;
439: UCHAR rgb[MAXMSGFILTERBYTES];
440: int i;
441: UCHAR *prgb;
442: unsigned char mask;
443:
444: /*
445: * First zero the bitmask
446: */
447: memset(rgb,'\0', MAXMSGFILTERBYTES);
448: mask = 1;
449: prgb = rgb;
450:
451: /*
452: * Quick and dirty loop to set the bits
453: */
454: pmsgi = rgmsgi;
455: for (i = 0; i <= MAXMSGFILTER; i++) {
456: /* If enabled, set bit in bit table */
457:
458: if (pmsgi->msg == i) {
459: if (pmsgi->wOptions & MSGI_ENABLED)
460: *prgb = pmsgi->bMPTypes | MP_ENABLED;
461:
462: pmsgi++;
463: } else {
464: /* Hole in range, set it true */
465: *prgb |= mask;
466: }
467:
468: prgb++;
469: }
470:
471: /* Now call the hook function with the new mask */
472: SpySetMessageList((char FAR *)rgb, spyopt.fDispOtherMsgs);
473: }
474:
475:
476:
477:
478: /**************************** Public Function ******************************\
479: * EnableOrDisableMsg(BOOL fEnable)
480: *
481: * Effects: Fastway to enable or disable a particular message code. The one
482: * that is currently selected in the output listbox.
483: *
484: * Return value: none
485: \***************************************************************************/
486:
487: void EnableOrDisableMsg(fEnable)
488: BOOL fEnable;
489: {
490: USHORT itemSel;
491: char szTemp[100];
492: char *psz;
493: MSGI *pmsgi;
494: SHORT i;
495:
496: itemSel = (USHORT)WinSendMsg(hwndSpyList, LM_QUERYSELECTION,
497: (MPARAM)LIT_FIRST, 0L);
498: if (itemSel == (USHORT)LIT_NONE)
499: return; /* None to process */
500:
501: /* Get the message text */
502: WinSendMsg(hwndSpyList, LM_QUERYITEMTEXT,
503: MPFROM2SHORT(itemSel, sizeof(szTemp)), (MPARAM)(PSZ)szTemp);
504:
505: /* Now lets extract the messgae string from the line */
506: psz = &szTemp[3];
507: while (*psz != ' ')
508: psz++; /* locate first blank */
509: *psz = '\0'; /* Zero terminate string */
510:
511:
512: /*
513: * Loop through all of the items in our list, until we find a
514: * string that matches our string.
515: */
516: pmsgi = rgmsgi; /* Point to start of list */
517: for (i = 0; i < cmsgi; i++) {
518: if (strcmpi(&szTemp[2], pmsgi->szMsg) == 0) {
519: /*
520: * Found our message, update the bit of the message, and
521: * call the function to let the hook know the new results
522: */
523: if (fEnable)
524: pmsgi->wOptions |= MSGI_ENABLED;
525: else
526: pmsgi->wOptions &= ~MSGI_ENABLED;
527:
528: UpdateHooksMsgTable(); /* Set Spys Msg table */
529: return;
530: }
531: pmsgi++;
532: }
533: }
534:
535:
536: /**************************** Public Function ******************************\
537: * MRESULT SendMsgDlgProc(...)
538: *
539: * Effects: This is the dialog procedure for the Send Message facility of spy
540: *
541: * Return value: none
542: \***************************************************************************/
543: extern MRESULT EXPENTRY SendMsgDlgProc(hwnd, msg, mp1, mp2)
544: HWND hwnd;
545: USHORT msg;
546: MPARAM mp1;
547: MPARAM mp2;
548: {
549:
550:
551: switch (msg) {
552:
553: case WM_INITDLG:
554: break;
555:
556: case WM_COMMAND:
557: SendMsgProcCmd(hwnd, LOUSHORT(mp1));
558: break;
559:
560: default:
561: return(WinDefDlgProc(hwnd, msg, mp1, mp2));
562: break;
563: }
564:
565: return 0L;
566: }
567:
568:
569: void SendMsgProcCmd(hwnd, id)
570: HWND hwnd;
571: USHORT id;
572: {
573: HWND hwndPoint;
574: BOOL fPostMsg;
575: USHORT msg;
576: MPARAM mp1;
577: MPARAM mp2;
578: MRESULT mresult;
579: char szLine1[80];
580: char szLine2[80];
581: char szTemp[12];
582:
583:
584: fPostMsg = TRUE;
585:
586: switch (id) {
587: case DID_SELHWND:
588: // Call function to allow the user to point at a window.
589: hwndPoint = HwndSelWinWithMouse(hwnd, NULL, FALSE);
590: sprintf(szTemp, "%p", hwndPoint);
591: WinSetDlgItemText(hwnd, DID_HWND, (PSZ)szTemp);
592: break;
593:
594: case DID_SEND:
595: fPostMsg = FALSE;
596: case DID_POST:
597: /* Send or post, setup to send the message */
598: /* First setup the Hwnd */
599: hwndPoint = (HWND)GetItemVal(hwnd, DID_HWND, FALSE, szLine1, szLine2);
600: sprintf(szTemp, "%p", hwndPoint);
601: WinSetDlgItemText(hwnd, DID_HWND, (PSZ)szTemp);
602:
603: /* Now the MSG */
604: msg = (USHORT)GetItemVal(hwnd, DID_COMMAND, TRUE, szLine1, szLine2);
605: SetItemHexNum(hwnd, DID_COMMAND, (ULONG)msg);
606:
607: /* Now the mp1 */
608: mp1 = (MPARAM)GetItemVal(hwnd, DID_MPARAM1, TRUE, szLine1, szLine2);
609: SetItemHexNum(hwnd, DID_MPARAM1, (ULONG)mp1);
610:
611: /* Now the mp2 */
612: mp2 = (MPARAM)GetItemVal(hwnd, DID_MPARAM2, TRUE, szLine1, szLine2);
613: SetItemHexNum(hwnd, DID_MPARAM2, (ULONG)mp2);
614:
615: /* Get initial values of two string variables */
616: WinQueryDlgItemText(hwnd, DID_STRING1, sizeof(szLine1), (PSZ)szLine1);
617: WinQueryDlgItemText(hwnd, DID_STRING2, sizeof(szLine2), (PSZ)szLine2);
618:
619: /* Now Send or post the message */
620: if (fPostMsg)
621: mresult = (MRESULT)WinPostMsg(hwndPoint, msg, mp1, mp2);
622: else
623: mresult = WinSendMsg(hwndPoint, msg, mp1, mp2);
624:
625: SetItemHexNum(hwnd, DID_RESULT, (ULONG)mresult);
626:
627: /* Set the Ending values for the strings */
628: WinSetDlgItemText(hwnd, DID_STRING1, (PSZ)szLine1);
629: WinSetDlgItemText(hwnd, DID_STRING2, (PSZ)szLine2);
630: break;
631:
632: case DID_CANCEL:
633: WinDismissDlg(hwnd, 1234);
634: WinDestroyWindow(hwnd);
635: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
636: MM_SETITEMATTR, MPFROM2SHORT(CMD_SENDMSG, TRUE),
637: MPFROM2SHORT(MIA_DISABLED, 0));
638:
639: break;
640: }
641: }
642:
643: void SetItemHexNum(hwnd, idItem, lVal)
644: HWND hwnd;
645: USHORT idItem;
646: ULONG lVal;
647: {
648: char szTemp[20];
649:
650: sprintf (szTemp, "0x%lx", lVal);
651: WinSetDlgItemText(hwnd, idItem, (PSZ)szTemp);
652: }
653:
654: ULONG GetItemVal(hwnd, idItem, fLookup, psz1, psz2)
655: HWND hwnd;
656: USHORT idItem;
657: BOOL fLookup;
658: PSZ psz1;
659: PSZ psz2;
660: {
661: ULONG lVal;
662: char szTemp[80];
663: register char *psz;
664: MSGI *pmsgi;
665: SHORT i;
666: USHORT usSel;
667: USHORT usOffset;
668:
669: WinQueryDlgItemText(hwnd, idItem, sizeof(szTemp), (PSZ)szTemp);
670:
671: /* Quick and dirty convert string to uppercase */
672: for (psz = szTemp; *psz; psz++) {
673: if ((*psz >= 'a') && (*psz <= 'z'))
674: *psz = *psz - 'a' + 'A';
675: }
676:
677: if (fLookup) {
678: // Try to find the string in our table.
679: pmsgi = rgmsgi; /* Start at beginning of table */
680: /*
681: * This does simple string compares, it does not map case, nor
682: * does it trim the string.
683: */
684: for (i=0; i < cmsgi; i++) {
685: if (strcmpi(pmsgi->szMsg, szTemp) == 0)
686: break;
687: pmsgi++;
688: }
689:
690: if (i < cmsgi)
691: return ((ULONG)pmsgi->msg);
692:
693: }
694:
695: /* Simple Test for &1 and &2 */
696: if (szTemp[0] == '&') {
697: if (szTemp[1] == '2')
698: return ((LONG)psz2);
699: else
700: return ((LONG)psz1);
701: }
702:
703: // Now test for pointers to convert
704: if (strchr(szTemp, ':') != NULL) {
705: // This NEEDS to be rewritten!!!!!
706: usOffset = 0;
707: for (psz = szTemp; *psz; psz++) {
708: if ((*psz >= '0') && (*psz <= '9'))
709: usOffset = (usOffset << 4) + (USHORT)(*psz - '0');
710: else if ((*psz >= 'A') && (*psz <= 'F'))
711: usOffset = (usOffset << 4) + (USHORT)(*psz - 'A' + 10 );
712: else if (*psz == ':') {
713: usSel = usOffset;
714: usOffset = 0;
715: }
716: else
717: break;
718: }
719:
720: // Finally return the value
721: return (MAKEULONG(usOffset, usSel));
722:
723: }
724:
725: /* Quick and Dirty conversion functions */
726: lVal = 0;
727: if (szTemp[0] == '0' && szTemp[1] == 'X') {
728: /* Hex values */
729: for (psz = &szTemp[2]; *psz; psz++) {
730: if ((*psz >= '0') && (*psz <= '9'))
731: lVal = (lVal << 4) + (ULONG)(*psz - '0');
732: else if ((*psz >= 'A') && (*psz <= 'F'))
733: lVal = (lVal << 4) + (ULONG)(*psz - 'A' + 10 );
734: else
735: return (lVal);
736: }
737:
738: } else {
739: /* Base 10 */
740: for (psz = szTemp; *psz; psz++) {
741: if ((*psz >= '0') && (*psz <= '9'))
742: lVal = lVal * 10 + (ULONG)(*psz - '0');
743: else
744: return (lVal);
745: }
746: }
747:
748: return (lVal);
749: }
750:
751:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.