``` #include <stdio.h> ``` morph_digit_as_char_to_uint8 (Radix:ℤ) <Digit Radix> ~ Char ~ Ascii ~ native.UInt8 --> <Digit Radix> ~ native.UInt8 ``` if( *src >= '0' && *src <= '9' ) *dst = *src - '0'; else if( *src >= 'a' && *src <= 'f') *dst = 0xa + *src - 'a'; else if( *src >= 'A' && *src <= 'F') *dst = 0xa + *src - 'A'; else { fprintf(stderr, "invalid digit 0x%x\n", *src); return -1; } if( *dst < Radix ) { return 0; } else { fprintf(stderr, "digit %u is out of range for radix %u\n", *dst, Radix); return -1; } ``` morph_digit_as_char_to_uint64 (Radix:ℤ) <Digit Radix> ~ Char ~ Ascii ~ native.UInt8 --> <Digit Radix> ~ native.UInt64 ``` if( *src >= '0' && *src <= '9' ) *dst = *src - '0'; else if( *src >= 'a' && *src <= 'f') *dst = 0xa + *src - 'a'; else if( *src >= 'A' && *src <= 'F') *dst = 0xa + *src - 'A'; else { fprintf(stderr, "invalid digit 0x%x\n", *src); return -1; } if( *dst < Radix ) { return 0; } else { fprintf(stderr, "digit %u is out of range for radix %u\n", *dst, Radix); return -1; } ``` morph_digit_as_uint8_to_char (Radix:ℤ_16) <Digit Radix> ~ native.UInt8 --> <Digit Radix> ~ Char ~ Ascii ~ native.UInt8 ``` if ( *src < 10 ) *dst = *src + '0'; else if( *dst < 16 ) *dst = *src - 0xa + 'a'; else { fprintf(stderr, "digit %u is out of rage for char\n", *dst); return -1; } return 0; ``` morph_digit_as_uint64_to_char (Radix:ℤ_16) <Digit Radix> ~ native.UInt64 --> <Digit Radix> ~ Char ~ Ascii ~ native.UInt8 ``` if ( *src < 10 ) *dst = *src + '0'; else if( *dst < 16 ) *dst = *src - 0xa + 'a'; else { fprintf(stderr, "digit %u is out of rage for char\n", *dst); return -1; } return 0; ```