#!/usr/bin/perl -w -I/home/brock/Update
use strict ;

# Perl script to test for matches for valid C integers for
# students working on CSCI 255 / ECE 109 assignment.
#
# Because this script uses regular expressions there is no
# straightforward way to modify it for the class assignment.
#
# (c) 2009 J Dean Brock, UNC Asheville
#

sub encodeChar {
    my ($inChar) = @_ ;
    if (length($inChar) != 1) {
	return '111' ;        # being ridiculously careful
    } elsif ($inChar eq '0') {
	return '000' ;        # 0
    } elsif ('1' le $inChar && $inChar le '7') {
	return '001' ;        # 1 to 7
    } elsif ('8' eq $inChar || $inChar eq '9') {
	return '010' ;        # 8 or 9
    } elsif ('A' le $inChar && $inChar le 'F'
	     || 'a' le $inChar && $inChar le 'f') {
	return '011' ;        # A to F or a to 
    } elsif ('u' eq $inChar || $inChar eq 'U') {
	return '100' ;        # u or U
    } elsif ('l' eq $inChar || $inChar eq 'L') {
	return '101' ;        # l or L
    } elsif ('x' eq $inChar || $inChar eq 'X') {
	return '110' ;        # x or X
    } else {
	return '111' ;
    }
}

print "Enter an empty line when you've had enough\n\n" ;
my $line ;
while ($line = <STDIN>) {
    chomp $line ;
    if ($line eq '') {
	exit 0 ;
    }
    print "\nstring=>   " ;
    for(my $i=0; $i<length($line); ++$i) {
	printf "%s ", substr($line, $i, 1) ;
    }
    print "\nin2bit=>   " ;
    for(my $i=0; $i<length($line); ++$i) {
	printf "%s ", substr(&encodeChar(substr($line, $i, 1)),0,1) ;
    }
    print "\nin1bit=>   " ;
    for(my $i=0; $i<length($line); ++$i) {
	printf "%s ", substr(&encodeChar(substr($line, $i, 1)),1,1) ;
    }
    print "\nin0bit=>   " ;
    for(my $i=0; $i<length($line); ++$i) {
	printf "%s ", substr(&encodeChar(substr($line, $i, 1)),2,1) ;
    }
    print "\noutbit=>  0" ;
    for(my $i=1; $i<=length($line); ++$i) {
	printf " %s",
	((substr($line, 0, $i)
	  =~ /^(0[xX][0-9A-Fa-f]+|0[0-7]*|[1-9][0-9]*)([uU]|[lL]|[uU][lL]|[lL][uU])?$/)
	 ? '1' : '0' ) ;
    }
    print "\n\n" ;
}
