Exemplo n.º 1
0
int hexstring_parse(const char *hexstr, uint8_t *buf, size_t *buflen)
{
    size_t hexstrlen = strlen(hexstr);
    size_t i;

    if (hexstrlen & 0x1)
    {
        fprintf(stderr, "odd number of hex bytes!\n");
        return 1;
    }

    if (hexstrlen/2 > *buflen)
        hexstrlen = (*buflen) * 2;

    for (i=0;i<hexstrlen;i+=2)
    {
        int8_t a, b;
        if (-1 == (a = parseHexDigit(hexstr[i])))
            return 1;
        if (-1 == (b = parseHexDigit(hexstr[i+1])))
            return 1;
        *buf++ = (a << 4) | b;
    }

    *buflen = hexstrlen/2;

    return 0;
}
OlcbEvent* OlcbLink::txtEvent(const char* str) {
	unsigned short mti;
	byte  data[8];
	
	str++;
	switch(*str++) {
		case ':':
			mti  = (parseHexDigit(*str++)) << 12;
			mti |= (parseHexDigit(*str++)) << 8;
			mti |= (parseHexDigit(*str++)) << 4;
			mti |= (parseHexDigit(*str++));
			break;
		case 'R': // Report Event
			mti = OLCB_MIT_PCER;
			break;
		case 'T': // teach Event
			mti = OLCB_MIT_PTE;
			break;
		default:
			return NULL;
	}
			
	for(int i = 0; i < 8; ++i) {
		str++;
		data[i]  = (parseHexDigit(*str++)) << 4;
		data[i] |=  parseHexDigit(*str++);
	}
	return &event(mti, data);
}
CanMessage* CanAccess::txtMessage(const char* string) {
	boolean msg = false;
	boolean ext = false;
	long  eid = 0;
	short sid = 0;
	if (*string == 'X' || *string == 'R') {
		msg = (string[0] == 'X');
		ext = true;

		string += 2;
		eid  = ((long)parseHexDigit(*string++)) << 28;
		eid |= ((long)parseHexDigit(*string++)) << 24;
		++string;
		eid |= ((long)parseHexDigit(*string++)) << 20;
		eid |= ((long)parseHexDigit(*string++)) << 16;
		eid |= ((long)parseHexDigit(*string++)) << 12;
		++string;
		eid |= ((long)parseHexDigit(*string++)) << 8;
		eid |= ((long)parseHexDigit(*string++)) << 4;
		eid |= ((long)parseHexDigit(*string++));
	} else if (*string == 'S' || *string == 'r') {
		msg = (string[0] == 'S');
		ext = false;
		string += 2;
		sid |= ((short)parseHexDigit(*string++)) << 8;
		sid |= ((short)parseHexDigit(*string++)) << 4;
		sid |= ((short)parseHexDigit(*string++));
	} else {
		return NULL;
	}
	
	string += 3;
	byte length = parseHexDigit(*string++);
	if (length < 0 || 8 < length)
		return NULL;

	byte data[8];
	string += 3;
	for (int p = 0; p < length; ++p) {
		data[p]  = (parseHexDigit(*string++) << 4);
		data[p] |=  parseHexDigit(*string++);
		++string;
	}

	if (msg && ext) 
		return &extMessage(eid, length, data);
	else if (msg)
		return &stdMessage(sid, length, data);
	else if (ext)
		return &extRequest(eid, length, data);
	else		
		return &stdRequest(sid, length, data);
}
Exemplo n.º 4
0
Arquivo: recipe.c Projeto: Azizou/smac
int parseHexByte(char *hex)
{
  return (parseHexDigit(hex[0])<<4)|parseHexDigit(hex[1]);
}
Exemplo n.º 5
0
chartype *importFont( const char *fname ) {

    FILE *f = fopen( fname , "r" );
    if (!f) {
        printf(  "Could not open font file %s\r\n",fname);
        return(NULL);
    }

    chartype *font = (chartype *) calloc( 256 , sizeof( chartype));


    if (!font) {
        printf(  "Could not allocate font memory\r\n");
        return(NULL);
    }

    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    unsigned c=0;
    int r=0;									// Current Row

    while ((read = getline(&line, &len, f)) != -1) {

//		printf("Retrieved line of length %zu :\n", read);
//		printf("[%c]:>%s<", line[0] , line);


        if ( line[0] !='#' ) {		// ignore comments


            if ( !strncmp(  "CHAR=" , line , 5 ) ) {			// New char?


                if (isxdigit( line[5] ) && isxdigit(line[6] )) {

                    c =  (parseHexDigit(  line[5] ) * 16 ) + parseHexDigit( line[6]) ;
                    r =0;

                }

            } else {			// read bit data

                if (r==0) {			// first row of new char

                    // First discover the width of this new char

                    int w=0;

                    for(int l=0; l<strlen(line); l++) {
                        if (isprint( line[l])) {
                            w=l+1;
                        }
                    }

                    font[c].width = w;

                    if (font[c].cols != NULL ) {

                        free( font[c].cols );			// So we don't leak mem incase this char was defined multipule times
                    }

                    font[c].cols = (unsigned char *) calloc( w , 1 );

                    // Ok, the new char slot is all set up

                }

                if (r<7) {			// Reading in rows?

                    for(int col=0; col< font[c].width ; col++) {

                        if ( strchr( ONPIXELS , line[col] )) {

                            font[c].cols[col] |= (1<<r);
                        }
                    }

                    r++;
                }


            }


        }
    }

    fclose(f);

    if (line) {
        free(line);
    }

    return(font);

}
Exemplo n.º 6
0
int parseHexByte( const char *s ) {

    return( (parseHexDigit( *s ) *16 ) + parseHexDigit( *(s+1)) );
}