[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]


   NAME
	MapANSI -- Encode an ANSI string into keycodes. (V36)

   SYNOPSIS
	actual = MapANSI( string, count, buffer, length, keyMap )
	D0                A0      D0     A1      D1      A2

	LONG MapANSI( STRPTR, LONG, STRPTR, LONG, struct KeyMap * );

   FUNCTION
	This console function converts an ANSI byte string to the
	code/qualifier pairs of type IECLASS_RAWKEY that would
	generate the string and places those pairs in a buffer.
	A code/qualifier pair is a pair of bytes suitable for
	putting in the ie_Code and low byte of ie_Qualifier,
	and for subsequent events, shifted to the ie_Prev1DownCode/
	ie_Prev1DownQual then ie_Prev2DownCode/ie_Prev2DownQual
	pairs for any dead or double dead key mapping.


   INPUTS
	string - the ANSI string to convert.
	count - the number of characters in the string.
	buffer - a byte buffer large enough to hold all anticipated
	    code/qualifier pairs generated by this conversion.
	length - maximum anticipation, i.e. the buffer size in bytes
	    divided by two (the size of the code/qualifier pair).
	keyMap - a KeyMap structure pointer, or null if the default
	    key map is to be used.

   RESULT
	actual - the number of code/qualifier pairs in the buffer,
	    or negative to describe an error (see below).

   EXAMPLE
	...
	#include <devices/inputevent.h>

	#define	STIMSIZE	3	/* two dead keys, one key */
	unsigned char rBuffer[STIMSIZE*2];
	...
	    KeymapBase = (struct Library *) OpenLibrary("keymap.library", 0);
	    ...
	    event.ie_NextEvent = 0;
	    event.ie_Class = IECLASS_RAWKEY;
	    event.ie_SubClass = 0;

	    /* prove keymap code completeness and MapANSI reversibility */
	    for (code = 0; code < 256; code++) {
		buffer[0] = code;
		actual = MapANSI(buffer, 1, rBuffer, STIMSIZE, 0);
		r = rBuffer;
		event.ie_Prev2DownCode = 0;
		event.ie_Prev2DownQual = 0;
		event.ie_Prev1DownCode = 0;
		event.ie_Prev1DownQual = 0;
		switch (actual) {
		    case -2:
			printf("MapANSI internal error");
			goto reportChar;
		    case -1:
			printf("MapANSI overflow error");
			goto reportChar;
		    case 0:
			printf("MapANSI ungeneratable code");
			goto reportChar;

		    case 3:
			event.ie_Prev2DownCode = *r++;
			event.ie_Prev2DownQual = *r++;
		    case 2:
			event.ie_Prev1DownCode = *r++;
			event.ie_Prev1DownQual = *r++;
		    case 1:
			event.ie_Code = *r++;
			event.ie_Qualifier = *r;

			actual = MapRawKey(&event, buffer, BUFFERLEN, 0);
			if ((actual != 1) || (buffer[0] != code)) {
			    printf("MapANSI not reversible");
			    for (i = 0; i < actual; i++)
				ReportChar(buffer[i]);
			    printf(" from");
	reportChar:
			    ReportChar(code);
			    printf("n");
			}
		}
	    }
	...

   ERRORS
	if actual is 0, a character in the string was not generatable
	    from the keyMap.
	if actual is -1, a buffer overflow condition was detected.
	if actual is -2, an internal error occurred (e.g. no memory)

   SEE ALSO
	devices/inputevent.h, devices/keymap.h


[Back to Amiga Developer Docs]