/*
 * Key Map Editor ver 1.0
 * Process Gadget
 *
 * parameter: 	Gadget - Address of Gadget selected
 *
 * by: Tim Friest
 * on: January 1, 1989
 */

#include "KME_Includes.h"
#include "KME_Protos.h"
#include "KME_Defs.h"
#include "KME_Globals.h"

extern	int	CopyKey(struct KeyMap *, USHORT, USHORT);
extern	void	MoveKey(struct KeyMap *, USHORT, USHORT);
extern	void	SwapKeys(struct KeyMap *, USHORT, USHORT);
extern	void	ClearKey(struct KeyMap *, USHORT);

void	ProcGadget(Gad)
struct Gadget *Gad;
{
	int OldStatus;

	switch (Gad->GadgetID) {
		case 0x60:	/* Shift Key Toggled */
		case 0x61:
			OldStatus = CheckFlag(SF_Shift);
			if ((LeftShiftGadget.Flags & SELECTED) || (RightShiftGadget.Flags & SELECTED))
				SetFlag(SF_Shift);
			else
				ClearFlag(SF_Shift);
			if (OldStatus != (CheckFlag(SF_Shift)))
				UpdateDisplay(GadgetList, KeyMapNode, TRUE);
			break;
		case 0x62:	/* Caps Lock Key Toggled */
			OldStatus = CheckFlag(SF_CapsLock);
			if (Gad->Flags & SELECTED)
				SetFlag(SF_CapsLock);
			else
				ClearFlag(SF_CapsLock);
			if (!(CheckFlag(SF_Shift)) && (OldStatus != (CheckFlag(SF_CapsLock))))
				UpdateDisplay(GadgetList, KeyMapNode, TRUE);
			break;
		case 0x63:	/* Control Key Toggled */
			OldStatus = CheckFlag(SF_Control);
			if (Gad->Flags & SELECTED)
				SetFlag(SF_Control);
			else
				ClearFlag(SF_Control);
			if (OldStatus != (CheckFlag(SF_Control)))
				UpdateDisplay(GadgetList, KeyMapNode, TRUE);
			break;
		case 0x64:	/* Alt Key Toggled */
		case 0x65:
			OldStatus = CheckFlag(SF_Alt);
			if ((LeftAltGadget.Flags & SELECTED) || (RightAltGadget.Flags & SELECTED))
				SetFlag(SF_Alt);
			else
				ClearFlag(SF_Alt);
			if (OldStatus != (CheckFlag(SF_Alt)))
				UpdateDisplay(GadgetList, KeyMapNode, TRUE);
			break;
		default:
			switch (StatusFlags & (SF_Define|SF_Copy|SF_Move|SF_Swap|SF_Clear)) {
				case SF_Define:
					if (ProcKeyReq(Gad->GadgetID))
						UpdateDisplay(Gad, KeyMapNode, FALSE);
					break;
				case SF_Copy:
					if (FromKeyGad == NULL) {
						FromKeyGad = Gad;
						ChangePointer(-1);
					}
					else {
						if (FromKeyGad != Gad) {
							CopyKey(&KeyMapNode->kn_KeyMap, FromKeyGad->GadgetID, Gad->GadgetID);
							UpdateDisplay(Gad, KeyMapNode, FALSE);
						}
						ChangePointer(SF_Copy);
						FromKeyGad = NULL;
					}
					break;
				case SF_Move:
					if (FromKeyGad == NULL) {
						FromKeyGad = Gad;
						ChangePointer(-1);
					}
					else {
						if (FromKeyGad != Gad) {
							MoveKey(&KeyMapNode->kn_KeyMap, FromKeyGad->GadgetID, Gad->GadgetID);
							UpdateDisplay(FromKeyGad, KeyMapNode, FALSE);
							UpdateDisplay(Gad, KeyMapNode, FALSE);
						}
						ChangePointer(SF_Move);
						FromKeyGad = NULL;
					}
					break;
				case SF_Swap:
					if (FromKeyGad == NULL) {
						FromKeyGad = Gad;
						ChangePointer(-1);
					}
					else {
						if (FromKeyGad != Gad) {
							SwapKeys(&KeyMapNode->kn_KeyMap, FromKeyGad->GadgetID, Gad->GadgetID);
							UpdateDisplay(FromKeyGad, KeyMapNode, FALSE);
							UpdateDisplay(Gad, KeyMapNode, FALSE);
						}
						ChangePointer(SF_Swap);
						FromKeyGad = NULL;
					}
					break;
				case SF_Clear:
					ClearKey(&KeyMapNode->kn_KeyMap, Gad->GadgetID);
					UpdateDisplay(Gad, KeyMapNode, FALSE);
			} /* switch */
	} /* switch */
}

/*
 * Copy Key
 *
 * Parameters:	KeyMap - KeyMap to work with
 *		FromKeyCode - Key Code to copy from
 *		ToKeyCode - Key Code to copy to
 */
int CopyKey(KeyMap, FromKey, ToKey)
struct KeyMap *KeyMap;
unsigned short FromKey;
unsigned short ToKey;
{
	struct HalfKeyMap *FromHalfKeyMap, *ToHalfKeyMap;
	int len;
	UBYTE headerlen;

	if (FromKey < 0x40)
		FromHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		FromHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		FromKey -= 0x40;
	}
	if (ToKey < 0x40)
		ToHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		ToHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		ToKey -= 0x40;
	}

	switch (FromHalfKeyMap->KeyMapTypes[FromKey] & (KCF_STRING|KCF_DEAD|KCF_NOP)) {
		case KC_NOQUAL:
		case KCF_NOP:
			ToHalfKeyMap->KeyMap[ToKey] = FromHalfKeyMap->KeyMap[FromKey];
			break;
		case KCF_STRING:
			len = StringKeyLength(FromHalfKeyMap, FromKey, &headerlen);
			if ((ToHalfKeyMap->KeyMap[ToKey] = (ULONG)AllocMem(len, MEMF_CLEAR)) == NULL) {
				Write(Output(), "Memory Allocation Failed, CopyKey:String\n", 41);
				return(FALSE);
			}
			CopyStringKey(FromHalfKeyMap, FromKey, (UBYTE *)ToHalfKeyMap->KeyMap[ToKey], headerlen);
			break;
		case KCF_DEAD:
			len = DeadKeyLength(FromHalfKeyMap, FromKey, &headerlen);
			if ((ToHalfKeyMap->KeyMap[ToKey] = (ULONG)AllocMem(len, MEMF_CLEAR)) == NULL) {
				Write(Output(), "Memory Allocation Failed, CopyKey:Dead\n", 39);
				return(FALSE);
			}
			CopyDeadKey(FromHalfKeyMap, FromKey, (UBYTE *)ToHalfKeyMap->KeyMap[ToKey], headerlen);
	} /* switch */
	ToHalfKeyMap->KeyMapTypes[ToKey] = FromHalfKeyMap->KeyMapTypes[FromKey];
	ToHalfKeyMap->Capsable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Capsable[ToKey/8] |= (FromHalfKeyMap->Capsable[FromKey/8] & (FromKey % 8));
	ToHalfKeyMap->Repeatable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Repeatable[ToKey/8] |= (FromHalfKeyMap->Repeatable[FromKey/8] & (FromKey % 8));
	SetFlag(SF_Modified);
	return(TRUE);
}

/*
 * Move Key
 *
 * Parameters:	KeyMap - KeyMap to work with
 *		FromKeyCode - Key Code to move from
 *		ToKeyCode - Key Code to move to
 */
void MoveKey(KeyMap, FromKey, ToKey)
struct KeyMap *KeyMap;
unsigned short FromKey;
unsigned short ToKey;
{
	struct HalfKeyMap *FromHalfKeyMap, *ToHalfKeyMap;

	if (FromKey < 0x40)
		FromHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		FromHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		FromKey -= 0x40;
	}
	if (ToKey < 0x40)
		ToHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		ToHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		ToKey -= 0x40;
	}

	ToHalfKeyMap->KeyMapTypes[ToKey] = FromHalfKeyMap->KeyMapTypes[FromKey];
	ToHalfKeyMap->KeyMap[ToKey] = FromHalfKeyMap->KeyMap[FromKey];
	ToHalfKeyMap->Capsable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Capsable[ToKey/8] |= (FromHalfKeyMap->Capsable[FromKey/8] & (FromKey % 8));
	ToHalfKeyMap->Repeatable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Repeatable[ToKey/8] |= (FromHalfKeyMap->Repeatable[FromKey/8] & (FromKey % 8));

	FromHalfKeyMap->KeyMapTypes[FromKey] = KCF_NOP;
	FromHalfKeyMap->KeyMap[FromKey] = NULL;
	FromHalfKeyMap->Capsable[FromKey/8] &= ~(FromKey % 8);
	FromHalfKeyMap->Repeatable[FromKey/8] &= ~(FromKey % 8);
	SetFlag(SF_Modified);
}

/*
 * Swap Key
 *
 * Parameters:	KeyMap - KeyMap to work with
 *		FromKeyCode - Key Code to swap from
 *		ToKeyCode - Key Code to swap to
 */
void SwapKeys(KeyMap, FromKey, ToKey)
struct KeyMap *KeyMap;
unsigned short FromKey;
unsigned short ToKey;
{
	struct HalfKeyMap *FromHalfKeyMap, *ToHalfKeyMap;
	UBYTE temptype, tempcaps, temprepeat;
	ULONG tempmap;

	if (FromKey < 0x40)
		FromHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		FromHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		FromKey -= 0x40;
	}
	if (ToKey < 0x40)
		ToHalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		ToHalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		ToKey -= 0x40;
	}

	temptype = ToHalfKeyMap->KeyMapTypes[ToKey];
	tempmap = ToHalfKeyMap->KeyMap[ToKey];
	tempcaps = ToHalfKeyMap->Capsable[ToKey/8] & (ToKey % 8);
	temprepeat = ToHalfKeyMap->Repeatable[ToKey/8] & (ToKey % 8);

	ToHalfKeyMap->KeyMapTypes[ToKey] = FromHalfKeyMap->KeyMapTypes[FromKey];
	ToHalfKeyMap->KeyMap[ToKey] = FromHalfKeyMap->KeyMap[FromKey];
	ToHalfKeyMap->Capsable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Capsable[ToKey/8] |= (FromHalfKeyMap->Capsable[FromKey/8] & (FromKey % 8));
	ToHalfKeyMap->Repeatable[ToKey/8] &= ~(ToKey % 8);
	ToHalfKeyMap->Repeatable[ToKey/8] |= (FromHalfKeyMap->Repeatable[FromKey/8] & (FromKey % 8));

	FromHalfKeyMap->KeyMapTypes[FromKey] = temptype;
	FromHalfKeyMap->KeyMap[FromKey] = tempmap;
	FromHalfKeyMap->Capsable[FromKey/8] &= ~(FromKey % 8);
	FromHalfKeyMap->Capsable[FromKey/8] |= tempcaps;
	FromHalfKeyMap->Repeatable[FromKey/8] &= ~(FromKey % 8);
	FromHalfKeyMap->Repeatable[FromKey/8] |= temprepeat;
	SetFlag(SF_Modified);
}

/*
 * Clear Key
 *
 * parameters:	KeyMap - Key Map to work with
 *		KeyCode - KeyCode to erase
 */
void ClearKey(KeyMap, KeyCode)
struct KeyMap *KeyMap;
unsigned short KeyCode;
{
	struct HalfKeyMap *HalfKeyMap;
	int len;
	UBYTE headerlen;

	if (KeyCode < 0x40)
		HalfKeyMap = (struct HalfKeyMap *)KeyMap;
	else {
		HalfKeyMap = (struct HalfKeyMap *)&KeyMap->km_HiKeyMapTypes;
		KeyCode -= 0x40;
	}

	switch (HalfKeyMap->KeyMapTypes[KeyCode] & (KCF_STRING|KCF_DEAD|KCF_NOP)) {
		case KCF_STRING:
			len = StringKeyLength(HalfKeyMap, KeyCode, &headerlen);
			FreeMem((UBYTE *)HalfKeyMap->KeyMap[KeyCode], len);
			break;
		case KCF_DEAD:
			len = DeadKeyLength(HalfKeyMap, KeyCode, &headerlen);
			FreeMem((UBYTE *)HalfKeyMap->KeyMap[KeyCode], len);
	} /* switch */
	HalfKeyMap->KeyMap[KeyCode] = NULL;
	HalfKeyMap->KeyMapTypes[KeyCode] = KCF_NOP;
	HalfKeyMap->Capsable[KeyCode/8] &= ~(KeyCode % 8);
	HalfKeyMap->Repeatable[KeyCode/8] &= ~(KeyCode % 8);
	SetFlag(SF_Modified);
}

/*
 * String Key Length
 *
 * parameters:	HalfKeyMap - half of a key map structure
 *		KeyCode - Key Code
 *		HeaderLen - Location to place header length
 *
 * returns:	Length - length of key buffer
 */
UBYTE StringKeyLength(HalfKeyMap, KeyCode, HeaderLength)
struct HalfKeyMap *HalfKeyMap;
USHORT KeyCode;
UBYTE *HeaderLength;
{
	UBYTE KeyType;
	UBYTE *KeyMapPtr;
	UBYTE len, index;

	KeyType = HalfKeyMap->KeyMapTypes[KeyCode];
	KeyMapPtr = (UBYTE *)HalfKeyMap->KeyMap[KeyCode];

	len = 2 + KeyMapPtr[index = 0];
	if (KeyType & KCF_SHIFT)
		len += 2 + KeyMapPtr[index += 2];
	if (KeyType & KCF_ALT)
		len += 2 + KeyMapPtr[index += 2];
	if ((KeyType & (KCF_SHIFT|KCF_ALT)) == (KCF_SHIFT|KCF_ALT))
		len += 2 + KeyMapPtr[index += 2];
	if (KeyType & KCF_CONTROL)
		len += 2 + KeyMapPtr[index += 2];
	if ((KeyType & (KCF_CONTROL|KCF_SHIFT)) == (KCF_CONTROL|KCF_SHIFT))
		len += 2 + KeyMapPtr[index += 2];
	if ((KeyType & (KCF_CONTROL|KCF_ALT)) == (KCF_CONTROL|KCF_ALT))
		len += 2 + KeyMapPtr[index += 2];
	if ((KeyType & KC_VANILLA) == KC_VANILLA)
		len += 2 + KeyMapPtr[index += 2];
	*HeaderLength = index + 2;
	return(len);
}

/*
 * Copy String Key
 *
 * parameters:	HalfKeyMap - Half of a key map
 *		KeyCode - Key Code
 *		KeyBuff - location to place key data
 *		Header - length of key data header
 *
 * returns:	Length - length copied
 */
UBYTE CopyStringKey(HalfKeyMap, KeyCode, KeyBuff, HeaderLength)
struct HalfKeyMap *HalfKeyMap;
USHORT KeyCode;
UBYTE *KeyBuff;
UBYTE HeaderLength;
{
	UBYTE KeyType;
	UBYTE *KeyMapPtr;
	UBYTE len, index;

	KeyType = HalfKeyMap->KeyMapTypes[KeyCode];
	KeyMapPtr = (UBYTE *)HalfKeyMap->KeyMap[KeyCode];

	len = HeaderLength;
	KeyBuff[index = 0] = KeyMapPtr[index];
	KeyBuff[index+1] = len;
	memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
	len += KeyBuff[index];
	if (KeyType & KCF_SHIFT) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if (KeyType & KCF_ALT) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if ((KeyType & (KCF_SHIFT|KCF_ALT)) == (KCF_SHIFT|KCF_ALT)) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if (KeyType & KCF_CONTROL) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if ((KeyType & (KCF_CONTROL|KCF_SHIFT)) == (KCF_CONTROL|KCF_SHIFT)) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if ((KeyType & (KCF_CONTROL|KCF_ALT)) == (KCF_CONTROL|KCF_ALT)) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	if ((KeyType & KC_VANILLA) == KC_VANILLA) {
		KeyBuff[index += 2] = KeyMapPtr[index];
		KeyBuff[index+1] = len;
		memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), KeyMapPtr[index]);
		len += KeyBuff[index];
	}
	return(len);
}

/*
 * Dead Key Length
 *
 * parameters:	HalfKeyMap - half of a key map structure
 *		KeyCode - Key Code
 *		HeaderLength - Location to place header length
 *
 * returns:	Length - length of key buffer
 */
UBYTE DeadKeyLength(HalfKeyMap, KeyCode, HeaderLength)
struct HalfKeyMap *HalfKeyMap;
USHORT KeyCode;
UBYTE *HeaderLength;
{
	UBYTE KeyType;
	UBYTE *KeyMapPtr;
	UBYTE len, index;

	KeyType = HalfKeyMap->KeyMapTypes[KeyCode];
	KeyMapPtr = (UBYTE *)HalfKeyMap->KeyMap[KeyCode];
	
	switch (KeyMapPtr[index = 0]) {
		case KC_NOQUAL:
		case DPF_DEAD:
			len = 2;
			break;
		case DPF_MOD:
			len = 2 + 6;
	} /* switch */
	if (KeyType & KCF_SHIFT)
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if (KeyType & KCF_ALT)
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if ((KeyType & (KCF_SHIFT|KCF_ALT)) == (KCF_SHIFT|KCF_ALT))
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if (KeyType & KCF_CONTROL)
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if ((KeyType & (KCF_CONTROL|KCF_SHIFT)) == (KCF_CONTROL|KCF_SHIFT))
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if ((KeyType & (KCF_CONTROL|KCF_ALT)) == (KCF_CONTROL|KCF_ALT))
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	if ((KeyType & KC_VANILLA) == KC_VANILLA)
		switch (KeyMapPtr[index += 2]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				len += 2;
				break;
			case DPF_MOD:
				len += 2 + 6;
		} /* switch */
	*HeaderLength = index + 2;
	return(len);
}

/*
 * Copy Dead Key
 *
 * parameters:	HalfKeyMap - Half of a key map
 *		KeyCode - Key Code
 *		KeyBuff - location to place key data
 *		HeaderLength - length of key data header
 *
 * returns:	Length - length copied
 */
UBYTE CopyDeadKey(HalfKeyMap, KeyCode, KeyBuff, HeaderLength)
struct HalfKeyMap *HalfKeyMap;
USHORT KeyCode;
UBYTE *KeyBuff;
UBYTE HeaderLength;
{
	UBYTE KeyType;
	UBYTE *KeyMapPtr;
	UBYTE len, index;

	KeyType = HalfKeyMap->KeyMapTypes[KeyCode];
	KeyMapPtr = (UBYTE *)HalfKeyMap->KeyMap[KeyCode];

	len = HeaderLength;	
	switch (KeyBuff[index = 0] = KeyMapPtr[index]) {
		case KC_NOQUAL:
		case DPF_DEAD:
			KeyBuff[index+1] = KeyMapPtr[index+1];
			break;
		case DPF_MOD:
			KeyBuff[index+1] = len;
			memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
			len += 6;
	} /* switch */
	if (KeyType & KCF_SHIFT)
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if (KeyType & KCF_ALT)
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if ((KeyType & (KCF_SHIFT|KCF_ALT)) == (KCF_SHIFT|KCF_ALT))
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if (KeyType & KCF_CONTROL)
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if ((KeyType & (KCF_CONTROL|KCF_SHIFT)) == (KCF_CONTROL|KCF_SHIFT))
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if ((KeyType & (KCF_CONTROL|KCF_ALT)) == (KCF_CONTROL|KCF_ALT))
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	if ((KeyType & KC_VANILLA) == KC_VANILLA)
		switch (KeyBuff[index += 2] = KeyMapPtr[index]) {
			case KC_NOQUAL:
			case DPF_DEAD:
				KeyBuff[index+1] = KeyMapPtr[index+1];
				break;
			case DPF_MOD:
				KeyBuff[index+1] = len;
				memcpy(&KeyBuff[len], (KeyMapPtr+KeyMapPtr[index+1]), 6);
				len += 6;
		} /* switch */
	return(len);
}
