/* ------------------------------------------------------------------
    PSTEXT.C -- text converter for A6 cross assembler
     This is free software, please see the file
     "COPYING" for copyright and licence details
   ------------------------------------------------------------------ */

#include <stdio.h>

#include "error.h"
#include "outf.h"
#include "pstext.h"

int cset;

unsigned char petscii[] = {
/*0x00*/ 0x20,0x20,0x20,0xD3,0xDA,0xD8,0xC1,0xD1,
/*0x08*/ 0xD1,0x77,0x20,0x20,0x20,0x20,0x20,0x2A,
/*0x10*/ 0x20,0x20,0x20,0x21,0x20,0x20,0xAF,0x20,
/*0x18*/ 0x5E,0x20,0x20,0x5F,0x20,0x20,0x20,0x20,
/*0x20*/ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
/*0x28*/ 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
/*0x30*/ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
/*0x38*/ 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
/*0x40*/ 0x40,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,
/*0x48*/ 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
/*0x50*/ 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,
/*0x58*/ 0xD8,0xD9,0xDA,0x5B,0x20,0x5D,0x5E,0x5F,
/*0x60*/ 0x20,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
/*0x68*/ 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
/*0x70*/ 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
/*0x78*/ 0x58,0x59,0x5A,0x27,0xDD,0x28,0x20,0x20,
/*0x80*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x88*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x90*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x98*/ 0x20,0x20,0x20,0x20,0x5C,0x20,0x20,0x20,
/*0xA0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xA8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xB0*/ 0xA6,0xA6,0xA6,0xDD,0xB3,0x20,0x20,0x20,
/*0xB8*/ 0x20,0xB3,0xDD,0xAE,0xBD,0x20,0x20,0xAE,
/*0xC0*/ 0xAD,0xB1,0xB2,0xAB,0xC0,0xDB,0x20,0x20,
/*0xC8*/ 0xAD,0xB0,0xB1,0xB2,0xAB,0x60,0x7B,0x20,
/*0xD0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xD8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xE0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xE8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xF0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xF8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
};

unsigned char scrl[] = {
/*0x00*/ 0x00,0x00,0x00,0x53,0x5a,0x58,0x41,0x51,
/*0x08*/ 0xD1,0x57,0xD7,0x20,0x20,0x20,0x20,0x2A,
/*0x10*/ 0x20,0x20,0x20,0x21,0x20,0x20,0x79,0x20,
/*0x18*/ 0x1E,0x20,0x20,0x1F,0x20,0x20,0x20,0x20,
/*0x20*/ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
/*0x28*/ 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
/*0x30*/ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
/*0x38*/ 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
/*0x40*/ 0x00,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
/*0x48*/ 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
/*0x50*/ 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
/*0x58*/ 0x58,0x59,0x5A,0x1B,0x20,0x1D,0x1E,0x64,
/*0x60*/ 0x20,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
/*0x68*/ 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
/*0x70*/ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
/*0x78*/ 0x18,0x19,0x1A,0x28,0x42,0x29,0x20,0x20,
/*0x80*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x88*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x90*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x98*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xa0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xa8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xb0*/ 0x66,0x66,0x66,0x5D,0x73,0x20,0x20,0x20,
/*0xb8*/ 0x20,0x73,0x5D,0x6E,0x7D,0x20,0x20,0x6E,
/*0xc0*/ 0x6D,0x71,0x72,0x6B,0x40,0x5B,0x20,0x20,
/*0xc8*/ 0x6D,0x70,0x71,0x72,0x6B,0x40,0x5B,0x20,
/*0xd0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xd8*/ 0x20,0x7D,0x70,0x20,0x20,0x20,0x20,0x20,
/*0xe0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xe8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xf0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xf8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
};

unsigned char scru[] = {
/*0x00*/ 0x00,0x00,0x00,0x53,0x5a,0x58,0x41,0x51,
/*0x08*/ 0xD1,0x57,0xD7,0x20,0x20,0x20,0x20,0x2A,
/*0x10*/ 0x20,0x20,0x20,0x21,0x20,0x20,0x79,0x20,
/*0x18*/ 0x1E,0x20,0x20,0x1F,0x20,0x20,0x20,0x20,
/*0x20*/ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
/*0x28*/ 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
/*0x30*/ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
/*0x38*/ 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
/*0x40*/ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
/*0x48*/ 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
/*0x50*/ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
/*0x58*/ 0x18,0x19,0x1A,0x1B,0x20,0x1D,0x1E,0x64,
/*0x60*/ 0x20,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
/*0x68*/ 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
/*0x70*/ 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
/*0x78*/ 0x18,0x19,0x1A,0x28,0x42,0x29,0x20,0x20,
/*0x80*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x88*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x90*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0x98*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xa0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xa8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xb0*/ 0x66,0x66,0x66,0x5D,0x73,0x20,0x20,0x20,
/*0xb8*/ 0x20,0x73,0x5D,0x6E,0x7D,0x20,0x20,0x6E,
/*0xc0*/ 0x6D,0x71,0x72,0x6B,0x40,0x5B,0x20,0x20,
/*0xc8*/ 0x6D,0x70,0x71,0x72,0x6B,0x40,0x5B,0x20,
/*0xd0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xd8*/ 0x20,0x7D,0x70,0x20,0x20,0x20,0x20,0x20,
/*0xe0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xe8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xf0*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
/*0xf8*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
};

/* --------------------------------------------------------------- */
unsigned char pstext_convchar(unsigned char c)
{
	switch(cset) {
		case CSET_ASCII:
			return c;
		case CSET_PETSCII:
			return petscii[c & 0x7f];
		case CSET_SCRL:
			return scrl[c & 0x7f];
		case CSET_SCRU:
			return scru[c & 0x7f];
	}

	/* In case of unknown set */
	return(0x20);
}

char *parsetext(char *s,int mode)
{
	char quote=*s++;

	while(*s!='\0') {
#ifdef DEBUG
		printf("parsetext: *s=%c, s=%p\n",*s,s);
#endif

		if(*s=='\0') {
			error("unterminated string",0);
			return(s);
		}

		if(*s==quote) {
			if(*(s+1)==quote) {
				outf_wbyte(quote);
				s+=2;
			} else
				return(s+1);
		} else
			if(mode==2 && (s[1]=='\0' || (s[1]==quote && s[2]!=quote)))
				outf_wbyte(pstext_convchar(*s++) | 0x80);
			else
				outf_wbyte(pstext_convchar(*s++));
#ifdef DEBUG
		printf("(endloop) parsetext: *s=%c, s=%p\n",*s,s);
#endif

	}

	if(mode==1)
		outf_wbyte(0);

#ifdef DEBUG
		printf("(exit) parsetext: *s=%c, s=%p\n",*s,s);
#endif

	return(s);
}

int pstext_getcset(void)
{
	return(cset);
}

void pstext_setcset(int z)
{
	cset=z;
}
