/*
 * A n t l r  T r a n s l a t i o n  H e a d e r
 *
 * Terence Parr, Will Cohen, and Hank Dietz: 1989-1994
 * Purdue University Electrical Engineering
 * With AHPCRC, University of Minnesota
 * ANTLR Version 1.33
 */
#include <stdio.h>
#define ANTLR_VERSION	133
#define zzparser NSStringPropertyListParser
#include "remap.h"

#include <objc/objc.h>

#ifndef __Attrib_def__
#define __Attrib_def__
typedef id Attrib;
#endif

#define USER_ZZSYN
#define zzcr_attr NSStringPropertyListParser_zzcr_attr
void zzcr_attr(Attrib* attr, int token, char* text);
#define zzSET_SIZE 8
#include "antlr.h"
#include "tokens.h"
#include "dlgdef.h"
#include "mode.h"
#ifndef PURIFY
#define PURIFY(r,s)
#endif
ANTLR_INFO

static zzchar_t	*zzlextext;	/* text of most recently matched token */
static zzchar_t	*zzbegexpr;	/* beginning of last reg expr recogn. */
static zzchar_t	*zzendexpr;	/* beginning of last reg expr recogn. */
static int	zzbufsize;	/* number of characters in zzlextext */

#include "err.m"
#include "NSStringScanner.m"

#include <ctype.h>
#include <Foundation/NSString.h>
#include <Foundation/NSData.h>
#include <Foundation/NSArray.h>
#include <Foundation/NSDictionary.h>
#include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSUtilities.h>
#include <Foundation/NSException.h>
#include <Foundation/exceptions/GeneralExceptions.h>

static NSMutableString* NSStringPropertyListParser_errors;

id readPropertyListFrom(NSString* string)
{
	id plist = nil;
	id pool = [NSAutoreleasePool new];
	
    NSStringPropertyListParser_errors = [[NSMutableString new] autorelease];
	ANTLRs(plist = propertyList(), (char*)[string cString]);
	
    if(*[NSStringPropertyListParser_errors cString])
	THROW([[SyntaxErrorException new]
	setReason:NSStringPropertyListParser_errors]);
	[plist retain];
	[pool release];
	
    return [[[plist autorelease] copy] autorelease];
}

id readDictionary(NSString *string)
{
	id plist = nil;
	id pool = [NSAutoreleasePool new];
	
    NSStringPropertyListParser_errors = [[NSMutableString new] autorelease];
	ANTLRs(plist = strings(), (char*)[string cString]);
	
    if(*[NSStringPropertyListParser_errors cString])
	THROW([[SyntaxErrorException new]
	setReason:NSStringPropertyListParser_errors]);
	plist = [plist copy];
	[pool release];
	
    return [plist autorelease];
}

static char make_hexa(char a, char b);

void zzcr_attr(Attrib* attr, int token, char* text)
{
	switch(token) {
		case DATA: {
			int i, pos, len = strlen(text);
			for(i = pos = 0; i < len; i += 2, pos++)
			text[pos] = make_hexa(text[i],
			text[i + 1] ? text[i + 1] : '0');
			*attr = [NSData dataWithBytes:text length:pos];
			break;
		}
		case STRING:
		*attr = [NSString stringWithCString:text];
		break;
	}
}

void zzsyn(char* text, int tok, char* egroup,
SetWordType* eset, int etok, int k, char*bad_text)
{
	[NSStringPropertyListParser_errors appendFormat:
	@"line %d: syntax error at \"%s\"",
	zzline, (tok == zzEOF_TOKEN) ? "EOF" : bad_text];
	if(!etok && !eset) {
		[NSStringPropertyListParser_errors appendString:@"\n"];
		return;
	}
	if (k==1)
	[NSStringPropertyListParser_errors appendString:@" missing"];
	else {
		[NSStringPropertyListParser_errors
		appendFormat:@"; \"%s\" not", bad_text];
		if(zzset_deg(eset) > 1)
		[NSStringPropertyListParser_errors appendString:@" in"];
	}
	if(zzset_deg(eset) > 0)
	zzedecode(eset);
	else
	[NSStringPropertyListParser_errors
	appendFormat:@" %s", zztokens[etok]];
	if(strlen(egroup) > 0)
	[NSStringPropertyListParser_errors appendFormat:@" in %s", egroup];
	[NSStringPropertyListParser_errors appendString:@"\n"];
}

static char make_hexa(char a, char b)
{
	char c = 0;
	
    if(isdigit(a))
	c = (a - '0') << 4;
	else if(isalpha(a))
	c = (tolower(a) - 'a' + 10) << 4;
	
    if(isdigit(b))
	c += b - '0';
	else if(isalpha(b))
	c += tolower(b) - 'a' + 10;
	
    return c;
}

 id  
#ifdef __STDC__
propertyList(void)
#else
propertyList()
#endif
{
	 id  	 _retv;
	PURIFY(_retv,sizeof( id  	))
	zzRULE;
	zzBLOCK(zztasp1);
	zzMake0;
	{
	_retv=nil;  
	pobj();
	zzmatch(Eof);
	_retv=zzaArg(zztasp1,1);  
 zzCONSUME;

	zzEXIT(zztasp1);
	return _retv;
fail:
	zzEXIT(zztasp1);
	zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
	zzresynch(setwd1, 0x1);
	return _retv;
	}
}

void
#ifdef __STDC__
pobj(void)
#else
pobj()
#endif
{
	zzRULE;
	zzBLOCK(zztasp1);
	zzMake0;
	{
	if ( (LA(1)==29) ) {
		plist();
		zzaRet=zzaArg(zztasp1,1);  
	}
	else {
		if ( (LA(1)==32) ) {
			dict();
			zzaRet=zzaArg(zztasp1,1);  
		}
		else {
			if ( (LA(1)==STRING) ) {
				zzmatch(STRING);
				zzaRet=zzaArg(zztasp1,1);  
 zzCONSUME;

			}
			else {
				if ( (LA(1)==DATA) ) {
					zzmatch(DATA);
					zzaRet=zzaArg(zztasp1,1);  
 zzCONSUME;

				}
				else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
			}
		}
	}
	zzEXIT(zztasp1);
	return;
fail:
	zzEXIT(zztasp1);
	zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
	zzresynch(setwd1, 0x2);
	}
}

void
#ifdef __STDC__
plist(void)
#else
plist()
#endif
{
	zzRULE;
	zzBLOCK(zztasp1);
	zzMake0;
	{
	zzaRet=[NSMutableArray array];  
	zzmatch(29); zzCONSUME;
	{
		zzBLOCK(zztasp2);
		zzMake0;
		{
		if ( (setwd1[LA(1)]&0x4) ) {
			pobj();
			[zzaRet addObject:zzaArg(zztasp2,2)];  
			{
				zzBLOCK(zztasp3);
				zzMake0;
				{
				while ( (setwd1[LA(1)]&0x8) ) {
					{
						zzBLOCK(zztasp4);
						zzMake0;
						{
						if ( (LA(1)==30) ) {
							zzmatch(30); zzCONSUME;
						}
						zzEXIT(zztasp4);
						}
					}
					pobj();
					[zzaRet addObject:zzaArg(zztasp3,2)];  
					zzLOOP(zztasp3);
				}
				zzEXIT(zztasp3);
				}
			}
		}
		zzEXIT(zztasp2);
		}
	}
	zzmatch(31); zzCONSUME;
	zzEXIT(zztasp1);
	return;
fail:
	zzEXIT(zztasp1);
	zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
	zzresynch(setwd1, 0x10);
	}
}

void
#ifdef __STDC__
dict(void)
#else
dict()
#endif
{
	zzRULE;
	zzBLOCK(zztasp1);
	zzMake0;
	{
	zzaRet=[NSMutableDictionary dictionary];  
	zzmatch(32); zzCONSUME;
	{
		zzBLOCK(zztasp2);
		zzMake0;
		{
		while ( (setwd1[LA(1)]&0x20) ) {
			pobj();
			zzmatch(33); zzCONSUME;
			pobj();
			{
				zzBLOCK(zztasp3);
				zzMake0;
				{
				if ( (LA(1)==34) ) {
					zzmatch(34); zzCONSUME;
				}
				zzEXIT(zztasp3);
				}
			}
			[zzaRet setObject:zzaArg(zztasp2,3) forKey:zzaArg(zztasp2,1)];  
			zzLOOP(zztasp2);
		}
		zzEXIT(zztasp2);
		}
	}
	zzmatch(35); zzCONSUME;
	zzEXIT(zztasp1);
	return;
fail:
	zzEXIT(zztasp1);
	zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
	zzresynch(setwd1, 0x40);
	}
}

 id  
#ifdef __STDC__
strings(void)
#else
strings()
#endif
{
	 id  	 _retv;
	PURIFY(_retv,sizeof( id  	))
	zzRULE;
	zzBLOCK(zztasp1);
	zzMake0;
	{
	_retv=[NSMutableDictionary dictionary];  
	{
		zzBLOCK(zztasp2);
		zzMake0;
		{
		while ( (LA(1)==STRING) ) {
			zzmatch(STRING); zzCONSUME;
			zzmatch(33); zzCONSUME;
			zzmatch(STRING); zzCONSUME;
			{
				zzBLOCK(zztasp3);
				zzMake0;
				{
				if ( (LA(1)==34) ) {
					zzmatch(34); zzCONSUME;
				}
				zzEXIT(zztasp3);
				}
			}
			[_retv setObject:zzaArg(zztasp2,3) forKey:zzaArg(zztasp2,1)];  
			zzLOOP(zztasp2);
		}
		zzEXIT(zztasp2);
		}
	}
	zzEXIT(zztasp1);
	return _retv;
fail:
	zzEXIT(zztasp1);
	zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
	zzresynch(setwd1, 0x80);
	return _retv;
	}
}
