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); }
int parseHexByte(char *hex) { return (parseHexDigit(hex[0])<<4)|parseHexDigit(hex[1]); }
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); }
int parseHexByte( const char *s ) { return( (parseHexDigit( *s ) *16 ) + parseHexDigit( *(s+1)) ); }