/**
  * for AVR-GCC
  * add by wentao  http://blog.liuwentao.net
  * date: 2007.4.22
  * last modify: 2007.4.22
**/

dp.sh.Brushes.AVRGCC = function()
{
	var datatypes = 
	'signed unsigned char int float double long ' +
    'int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t ' +
    'prog_char prog_int prog_long prog_long_long';

	var keywords = 
	'SIGNAL INTERRUPT _VECTORS_SIZE SPM_PAGESIZE volatile ' +
	'auto break case const continue default do else extern for goto if return ' +
	'sizeof static struct switch typedef union void while';
	
	var register =
    'TWBR TWSR TWPS0 TWPS1 TWS3 TWS4 TWS5 TWS6 TWS7 ' +
    'TWAR TWGCE TWA0 TWA1 TWA2 TWA3 TWA4 TWA5 TWA6 TWDR ' +
    'ADC ADCW ADCL ADCH ADCSRA ADPS0 ADPS1 ADPS2 ADIE ADIF ADATE ADSC ADEN ' +
    'ADMUX MUX0 MUX1 MUX2 MUX3 MUX4 ADLAR REFS0 REFS1 ' +
    'ACSR ACIS0 ACIS1 ACIC ACIE ACI ACO ACBG ACD ' +
    'UBRRL UCSRB TXB8 RXB8 UCSZ2 TXEN RXEN UDRIE TXCIE RXCIE ' +
    'UCSRA MPCM U2X PE DOR FE UDRE TXC RXC UDR ' +
    'SPCR SPR0 SPR1 CPHA CPOL MSTR DORD SPE SPIE SPSR SPI2X WCOL SPIF SPDR ' +
    'PIND PIND0 PIND1 PIND2 PIND3 PIND4 PIND5 PIND6 PIND7 ' +
    'DDRD DDD0 DDD1 DDD2 DDD3 DDD4 DDD5 DDD6 DDD7 ' +
    'PORTD PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 ' +
    'PINC PINC0 PINC1 PINC2 PINC3 PINC4 PINC5 PINC6 PINC7 ' +
    'DDRC DDC0 DDC1 DDC2 DDC3 DDC4 DDC5 DDC6 DDC7 ' +
    'PORTC PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7 ' +
    'PINB PINB0 PINB1 PINB2 PINB3 PINB4 PINB5 PINB6 PINB7 ' +
    'DDRB DDB0 DDB1 DDB2 DDB3 DDB4 DDB5 DDB6 DDB7 ' +
    'PORTB PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 ' +
    'PINA PINA0 PINA1 PINA2 PINA3 PINA4 PINA5 PINA6 PINA7 ' +
    'DDRA DDA0 DDA1 DDA2 DDA3 DDA4 DDA5 DDA6 DDA7 ' +
    'PORTA PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 ' +
    'EECR EERE EEWE EEMWE EERIE EEDR EEAR EEARL EEARH ' +
    'UCSRC UCPOL UCSZ0 UCSZ1 USBS UPM0 UPM1 UMSEL URSEL UBRRH URSEL ' +
    'WDTCR WDP0 WDP1 WDP2 WDE WDTOE ASSR TCR2UB OCR2UB TCN2UB AS2 ' +
    'OCR2 TCNT2 TCCR2 CS20 CS21 CS22 WGM21 COM20 COM21 WGM20 FOC2 ' +
    'ICR1 ICR1L ICR1H OCR1B OCR1BL OCR1BH OCR1A OCR1AL OCR1AH ' +
    'TCNT1 TCNT1L TCNT1H TCCR1B CS10 CS11 CS12 WGM12 WGM13 ICES1 ICNC1 ' +
    'TCCR1A WGM10 WGM11 FOC1B FOC1A COM1B0 COM1B1 COM1A0 COM1A1 ' +
    'SFIOR PSR10 PSR2 PUD ACME ADTS0 ADTS1 ADTS2 OSCCAL OCDR ' +
    'TCNT0 TCCR0 CS00 CS01 CS02 WGM01 COM00 COM01 WGM00 FOC0 ' +
    'MCUCSR PORF EXTRF BORF WDRF JTRF ISC2 JTD ' +
    'MCUCR ISC00 ISC01 ISC10 ISC11 SM0 SM1 SE SM2 ' +
    'TWCR TWIE TWEN TWWC TWSTO TWSTA TWEA TWINT ' +
    'SPMCR SPMEN PGERS PGWRT BLBSET RWWSRE RWWSB SPMIE ' +
    'TIFR TOV0 OCF0 TOV1 OCF1B OCF1A ICF1 TOV2 OCF2 ' +
    'TIMSK TOIE0 OCIE0 TOIE1 OCIE1B OCIE1A TICIE1 TOIE2 OCIE2 ' +
    'GIFR INTF2 INTF0 INTF1 GICR IVCE IVSEL INT2 INT0 INT1 OCR0 ' +
    'RAMEND XRAMEND E2END FLASHEND';

	var interrupt =
	'INT0_vect SIG_INTERRUPT0 INT1_vect SIG_INTERRUPT1 TIMER2_COMP_vect SIG_OUTPUT_COMPARE2 ' +
	'TIMER2_OVF_vect SIG_OVERFLOW2 TIMER1_CAPT_vect SIG_INPUT_CAPTURE1 TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A ' +
	'TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B TIMER1_OVF_vect SIG_OVERFLOW1 TIMER0_OVF_vect SIG_OVERFLOW0 ' +
	'SPI_STC_vect SIG_SPI USART_RXC_vect SIG_USART_RECV SIG_UART_RECV USART_UDRE_vect SIG_USART_DATA SIG_UART_DATA ' +
	'USART_TXC_vect SIG_USART_TRANS SIG_UART_TRANS ADC_vect SIG_ADC EE_RDY_vect SIG_EEPROM_READY ' +
	'ANA_COMP_vect SIG_COMPARATOR TWI_vect SIG_2WIRE_SERIAL INT2_vect SIG_INTERRUPT2 ' +
	'TIMER0_COMP_vect SIG_OUTPUT_COMPARE0 SPM_RDY_vect SIG_SPM_READY';

	var ownfunc =
	'sbi cbi bit_is_set bit_is_clear loop_until_bit_is_set loop_until_bit_is_clear ' +
	'eeprom_read_byte eeprom_read_word eeprom_read_block ' +
	'eeprom_write_byte eeprom_write_word eeprom_write_block ' +
	'eeprom_is_ready eeprom_busy_wait _EEPUT _EEGET ' +
	'_delay_ms _delay_us _delay_loop_1 _delay_loop_2' +
	'sei';
	

	this.regexList = [
		{ regex: dp.sh.RegexLib.SingleLineCComments,				css: 'comment' },			// one line comments
		{ regex: dp.sh.RegexLib.MultiLineCComments,					css: 'comment' },			// multiline comments
		{ regex: dp.sh.RegexLib.DoubleQuotedString,					css: 'string' },			// strings
		{ regex: dp.sh.RegexLib.SingleQuotedString,					css: 'string' },			// strings
		{ regex: new RegExp('^ *#.*', 'gm'),						css: 'preprocessor' },
		{ regex: new RegExp(this.GetKeywords(datatypes), 'gm'),		css: 'datatypes' },
		{ regex: new RegExp(this.GetKeywords(keywords), 'gm'),		css: 'keyword' },
		{ regex: new RegExp(this.GetKeywords(register), 'gm'),		css: 'register' },
		{ regex: new RegExp(this.GetKeywords(interrupt), 'gm'),		css: 'interrupt' }, 
		{ regex: new RegExp(this.GetKeywords(ownfunc), 'gm'),		css: 'ownfunc' }
		];

	this.CssClass = 'dp-avrgcc';
}

dp.sh.Brushes.AVRGCC.prototype	= new dp.sh.Highlighter();
dp.sh.Brushes.AVRGCC.Aliases	= ['avrgcc'];
