diff options
-rw-r--r-- | aclocal/project-root.m4 | 4 | ||||
-rw-r--r-- | bsps/m68k/mrm332/config/mrm332.cfg | 9 | ||||
-rw-r--r-- | bsps/m68k/mvme147/config/mvme147.cfg | 8 | ||||
-rw-r--r-- | bsps/m68k/mvme147s/config/mvme147s.cfg | 10 | ||||
-rw-r--r-- | bsps/mips/hurricane/config/hurricane.cfg | 7 | ||||
-rw-r--r-- | bsps/mips/rbtx4925/config/rbtx4925.cfg | 7 | ||||
-rw-r--r-- | c/src/make/host.cfg.in | 3 | ||||
-rw-r--r-- | testsuites/aclocal/project-root.m4 | 4 | ||||
-rw-r--r-- | tools/build/Makefile.am | 4 | ||||
-rw-r--r-- | tools/build/configure.ac | 6 | ||||
-rw-r--r-- | tools/build/packhex.c | 561 |
11 files changed, 0 insertions, 623 deletions
diff --git a/aclocal/project-root.m4 b/aclocal/project-root.m4 index 5240f5f465..6233d8db3a 100644 --- a/aclocal/project-root.m4 +++ b/aclocal/project-root.m4 @@ -11,10 +11,6 @@ dnl AC_DEFUN([RTEMS_PROJECT_ROOT], [dnl AC_REQUIRE([RTEMS_TOP]) - -PACKHEX="\$(PROJECT_TOPdir)/tools/build/packhex" -AC_SUBST(PACKHEX) - BIN2C=rtems-bin2c AC_SUBST(BIN2C) ]) diff --git a/bsps/m68k/mrm332/config/mrm332.cfg b/bsps/m68k/mrm332/config/mrm332.cfg index 979f331399..7df1c189fa 100644 --- a/bsps/m68k/mrm332/config/mrm332.cfg +++ b/bsps/m68k/mrm332/config/mrm332.cfg @@ -17,12 +17,3 @@ CFLAGS_OPTIMIZE_V = -Os -g -fomit-frame-pointer # The following two lines enable compiling and linking on per element. # CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections # LDFLAGS = -Wl,--gc-sections - -define bsp-post-link - $(OBJCOPY) -O srec $(basename $@)$(EXEEXT) $(basename $@).srec - sed -e 's/.$$//' -e '/^S0/d' $(basename $@).srec | \ - $(PACKHEX) > $(basename $@)$(DOWNEXT) - rm -f $(basename $@).srec - $(default-bsp-post-link) -endef - diff --git a/bsps/m68k/mvme147/config/mvme147.cfg b/bsps/m68k/mvme147/config/mvme147.cfg index 18e9f28b71..6271e138f2 100644 --- a/bsps/m68k/mvme147/config/mvme147.cfg +++ b/bsps/m68k/mvme147/config/mvme147.cfg @@ -15,11 +15,3 @@ CFLAGS_OPTIMIZE_V = -O2 -g -fomit-frame-pointer CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections LDFLAGS = -Wl,--gc-sections - -define bsp-post-link - $(OBJCOPY) -O srec $(basename $@)$(EXEEXT) $(basename $@).srec - sed -e 's/.$$//' -e '/^S0/d' $(basename $@).srec | \ - $(PACKHEX) > $(basename $@)$(DOWNEXT) - rm -f $(basename $@).srec - $(default-bsp-post-link) -endef diff --git a/bsps/m68k/mvme147s/config/mvme147s.cfg b/bsps/m68k/mvme147s/config/mvme147s.cfg index 89922a518e..1f6f3c84a8 100644 --- a/bsps/m68k/mvme147s/config/mvme147s.cfg +++ b/bsps/m68k/mvme147s/config/mvme147s.cfg @@ -15,13 +15,3 @@ CFLAGS_OPTIMIZE_V = -O2 -g -fomit-frame-pointer CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections LDFLAGS = -Wl,--gc-sections - -define bsp-post-link - $(OBJCOPY) -O srec $(basename $@)$(EXEEXT) $(basename $@).srec - sed -e 's/.$$//' -e '/^S0/d' $(basename $@).srec | \ - $(PACKHEX) > $(basename $@)$(DOWNEXT) - rm -f $(basename $@).srec - $(default-bsp-post-link) -endef - -# Miscellaneous additions go here diff --git a/bsps/mips/hurricane/config/hurricane.cfg b/bsps/mips/hurricane/config/hurricane.cfg index b1c050b966..7b1119e054 100644 --- a/bsps/mips/hurricane/config/hurricane.cfg +++ b/bsps/mips/hurricane/config/hurricane.cfg @@ -13,10 +13,3 @@ CFLAGS_OPTIMIZE_V = -O2 -g -fomit-frame-pointer CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections LDFLAGS = -Wl,--gc-sections - -define bsp-post-link - $(OBJCOPY) -O srec $@ $(basename $@).srec1 - $(PACKHEX) < $(basename $@).srec1 > $(basename $@)$(DOWNEXT) - $(RM) $(basename $@).srec1 - $(default-bsp-post-link) -endef diff --git a/bsps/mips/rbtx4925/config/rbtx4925.cfg b/bsps/mips/rbtx4925/config/rbtx4925.cfg index 744fdb4240..b3d04cff37 100644 --- a/bsps/mips/rbtx4925/config/rbtx4925.cfg +++ b/bsps/mips/rbtx4925/config/rbtx4925.cfg @@ -13,10 +13,3 @@ CFLAGS_OPTIMIZE_V = -O2 -g -fomit-frame-pointer CFLAGS_OPTIMIZE_V += -ffunction-sections -fdata-sections LDFLAGS = -Wl,--gc-sections - -define bsp-post-link - $(OBJCOPY) -O srec $@ $(basename $@).srec1 - $(PACKHEX) < $(basename $@).srec1 > $(basename $@)$(DOWNEXT) - $(RM) $(basename $@).srec1 - $(default-bsp-post-link) -endef diff --git a/c/src/make/host.cfg.in b/c/src/make/host.cfg.in index 17bf017b99..04bc04a6fb 100644 --- a/c/src/make/host.cfg.in +++ b/c/src/make/host.cfg.in @@ -22,9 +22,6 @@ CHMOD=chmod SED=sed # Global tools -ifndef PACKHEX -PACKHEX=$(PROJECT_BIN)/packhex -endif ifndef BIN2C BIN2C=rtems-bin2c diff --git a/testsuites/aclocal/project-root.m4 b/testsuites/aclocal/project-root.m4 index 950ff6b5ad..641baee021 100644 --- a/testsuites/aclocal/project-root.m4 +++ b/testsuites/aclocal/project-root.m4 @@ -1,10 +1,6 @@ AC_DEFUN([RTEMS_PROJECT_ROOT], [dnl AC_REQUIRE([RTEMS_TOP]) - -PACKHEX="\$(PROJECT_TOPdir)/tools/build/packhex" -AC_SUBST(PACKHEX) - BIN2C=rtems-bin2c AC_SUBST(BIN2C) ]) diff --git a/tools/build/Makefile.am b/tools/build/Makefile.am index e788d57da0..e9fdd2602a 100644 --- a/tools/build/Makefile.am +++ b/tools/build/Makefile.am @@ -1,9 +1,5 @@ ACLOCAL_AMFLAGS = -I ../../aclocal -bin_PROGRAMS = packhex - -packhex_SOURCES = packhex.c - bin_SCRIPTS = install-if-change noinst_SCRIPTS = doxy-filter diff --git a/tools/build/configure.ac b/tools/build/configure.ac index 5d752c62f7..7af73a2684 100644 --- a/tools/build/configure.ac +++ b/tools/build/configure.ac @@ -10,14 +10,8 @@ AC_CANONICAL_HOST AM_INIT_AUTOMAKE([no-define foreign subdir-objects 1.12.2]) AM_MAINTAINER_MODE -AC_PROG_CC -AC_CHECK_HEADERS([getopt.h libgen.h]) -AC_CHECK_FUNCS(strerror strtol basename strnlen) - RTEMS_PATH_KSH -AC_CONFIG_HEADERS([config.h]) - # Explicitly list all Makefiles here AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([install-if-change],[chmod +x install-if-change]) diff --git a/tools/build/packhex.c b/tools/build/packhex.c deleted file mode 100644 index 45565faaeb..0000000000 --- a/tools/build/packhex.c +++ /dev/null @@ -1,561 +0,0 @@ -/***** P A C K H E X . C ************************************************ - * - * Packhex is a hex-file compaction utility. It attempts to concatenate - * hex records to produce more size-efficient packaging. - * - * Limitations: Input files must be correctly formatted. This utility - * is not robust enough to detect hex-record formatting - * errors. - * - * Published: May 1993 Embedded Systems Programming magazine - * "Creating Faster Hex Files" - * - * URL: ESP magazine: http://www.embedded.com - * Source Code: ftp://ftp.mfi.com/pub/espmag/1993/pakhex.zip - * - * Author: Mark Gringrich - * - * Compiler: Microsoft C 6.0 - * cl /F 1000 packhex.c - * - **************************************************************************/ - - -/* #define SMALLER_RECORDS */ -#ifdef SMALLER_RECORDS -#define MAX_LEN_S1_RECS 128 -#define MAX_LEN_S2_RECS 128 -#define MAX_LEN_S3_RECS 128 -#else -#define MAX_LEN_S1_RECS 252 -#define MAX_LEN_S2_RECS 251 -#define MAX_LEN_S3_RECS 250 -#endif - - -/*--------------------------------- includes ---------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" - -#ifndef VMS -#ifndef HAVE_STRERROR -extern int sys_nerr; -extern char *sys_errlist[]; - -#define strerror( _err ) \ - ((_err) < sys_nerr) ? sys_errlist [(_err)] : "unknown error" - -#else /* HAVE_STRERROR */ -char *strerror (); -#endif -#else /* VMS */ -char *strerror (int,...); -#endif - -#if defined(__unix__) && !defined(EXIT_FAILURE) -#define EXIT_FAILURE -1 -#define EXIT_SUCCESS 0 -#endif - -/*--------------------------------- defines ----------------------------------*/ - -#define YES 1 -#define MAX_LINE_SIZE 600 -#define EOS '\0' - - -/*---------------------------------- macros ----------------------------------*/ - -/* Convert ASCII hexadecimal digit to value. */ - -#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF ) - - -/*--------------------------------- typedefs ---------------------------------*/ - -typedef unsigned char Boolean; -typedef unsigned char Uchar; -typedef unsigned int Uint; -typedef unsigned long Ulong; - -typedef struct /* Functions and constant returning Hex-record vital stats. */ -{ - Boolean ( *is_data_record )( char * ); - Ulong ( *get_address )( char * ); - Uint ( *get_data_count )( char * ); - const Uint max_data_count; - char *( *get_data_start )( char * ); - void ( *put_data_record )( Uint, Ulong, char * ); -} Rec_vitals; - - -/*--------------------------- function prototypes ----------------------------*/ - -Rec_vitals * identify_first_data_record( char *, int ); -Ulong get_ndigit_hex( char *, int ); - - -/*----------------------------- Intel Hex format -----------------------------*/ - -/* - * Intel Hex data-record layout - * - * :aabbbbccd...dee - * - * : - header character - * aa - record data byte count, a 2-digit hex value - * bbbb - record address, a 4-digit hex value - * cc - record type, a 2-digit hex value: - * "00" is a data record - * "01" is an end-of-data record - * "02" is an extended-address record - * "03" is a start record - * d...d - data (always an even number of chars) - * ee - record checksum, a 2-digit hex value - * checksum = 2's complement - * [ (sum of bytes: aabbbbccd...d) modulo 256 ] - */ - - -Boolean is_intel_data_rec( char * rec_str ) -{ - return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) ); -} - -Uint get_intel_rec_data_count( char * rec_str ) -{ - return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) ); -} - -Ulong get_intel_rec_address( char * rec_str ) -{ - return( get_ndigit_hex( rec_str + 3, 4 ) ); -} - -char * get_intel_rec_data_start( char * rec_str ) -{ - return( rec_str + 9 ); -} - -void put_intel_data_rec( Uint count, Ulong address, char * data_str ) -{ - char *ptr; - Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff ); - - for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) - sum += ( Uint ) get_ndigit_hex( ptr, 2 ); - - printf( - ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff - ); -} - - -Rec_vitals intel_hex = -{ - is_intel_data_rec, - get_intel_rec_address, - get_intel_rec_data_count, - 255, /* Maximum data bytes in a record. */ - get_intel_rec_data_start, - put_intel_data_rec -}; - - -/*------------------------- Motorola S1-record format ------------------------*/ - -/* - * Motorola S-record data-record layout - * - * Sabbc...cd...dee - * - * S - header character - * a - record type, a 1-digit value: - * "0" is a header record - * "1" is a 2-byte-address data record - * "2" is a 3-byte-address data record - * "3" is a 4-byte-address data record - * "7" is a 4-byte-address end-of-data record - * "8" is a 3-byte-address end-of-data record - * "9" is a 2-byte-address end-of-data record - * bb - record length in bytes, a 2-digit hex value - * (record length doesn't count the header/type - * chars and checksum byte) - * c...c - record address, a 4-, 6-, or 8-digit value, - * depending on record type - * d...d - data (always an even number of chars) - * ee - record checksum, a 2-digit hex value - * checksum = 1's complement - * [ (sum of all bytes: bbc..cd...d) modulo 256 ] - */ - -#define S1_COUNT_OFFSET 3 - - -Boolean is_moto_s1_data_rec( char * rec_str ) -{ - return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) ); -} - -Uint get_moto_s1_rec_data_count( char * rec_str ) -{ - return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET ); -} - -Ulong get_moto_s1_rec_address( char * rec_str ) -{ - return( get_ndigit_hex( rec_str + 4, 4 ) ); -} - -char * get_moto_s1_rec_data_start( char * rec_str ) -{ - return( rec_str + 8 ); -} - -void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str ) -{ - char *ptr; - Uint sum = S1_COUNT_OFFSET + count + - ( address >> 8 & 0xff ) + ( address & 0xff ); - - for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) - sum += ( Uint ) get_ndigit_hex( ptr, 2 ); - - printf( - "S1%02X%04lX%s%02X\n", - count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff - ); -} - - -Rec_vitals motorola_s1_rec = -{ - is_moto_s1_data_rec, - get_moto_s1_rec_address, - get_moto_s1_rec_data_count, - MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */ - get_moto_s1_rec_data_start, - put_moto_s1_data_rec -}; - - -/*------------------------- Motorola S2-record format ------------------------*/ - -#define S2_COUNT_OFFSET 4 - -Boolean is_moto_s2_data_rec( char * rec_str ) -{ - return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) ); -} - -Uint get_moto_s2_rec_data_count( char * rec_str ) -{ - return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET ); -} - -Ulong get_moto_s2_rec_address( char * rec_str ) -{ - return( get_ndigit_hex( rec_str + 4, 6 ) ); -} - -char * get_moto_s2_rec_data_start( char * rec_str ) -{ - return( rec_str + 10 ); -} - -void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str ) -{ - char *ptr; - Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) + - ( address >> 8 & 0xff ) + - ( address & 0xff ); - - for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) - sum += ( Uint ) get_ndigit_hex( ptr, 2 ); - - printf( - "S2%02X%06lX%s%02X\n", - count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff - ); -} - - -Rec_vitals motorola_s2_rec = -{ - is_moto_s2_data_rec, - get_moto_s2_rec_address, - get_moto_s2_rec_data_count, - MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */ - get_moto_s2_rec_data_start, - put_moto_s2_data_rec -}; - - -/*------------------------- Motorola S3-record format ------------------------*/ - -#define S3_COUNT_OFFSET 5 - -Boolean is_moto_s3_data_rec( char * rec_str ) -{ - return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) ); -} - -Uint get_moto_s3_rec_data_count( char * rec_str ) -{ - return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET ); -} - -Ulong get_moto_s3_rec_address( char * rec_str ) -{ - return( get_ndigit_hex( rec_str + 4, 8 ) ); -} - -char * get_moto_s3_rec_data_start( char * rec_str ) -{ - return( rec_str + 12 ); -} - -void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str ) -{ - char *ptr; - Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) + - ( address >> 16 & 0xff ) + - ( address >> 8 & 0xff ) + - ( address & 0xff ); - - for ( ptr = data_str ; *ptr != EOS ; ptr += 2 ) - sum += ( Uint ) get_ndigit_hex( ptr, 2 ); - - printf( - "S3%02X%08lX%s%02X\n", - count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff - ); -} - - -Rec_vitals motorola_s3_rec = -{ - is_moto_s3_data_rec, - get_moto_s3_rec_address, - get_moto_s3_rec_data_count, - MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */ - get_moto_s3_rec_data_start, - put_moto_s3_data_rec -}; - - -/*-------------------- Put your favorite hex format here ---------------------*/ - -/* - * * * * The following is a template for an additional hex format: * * * - * - * - * Boolean is_X_data_rec( char * rec_str ) {} - * - * Uint get_X_rec_data_count( char * rec_str ) {} - * - * Ulong get_X_rec_address( char * rec_str ) {} - * - * char * get_X_rec_data_start( char * rec_str ) {} - * - * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {} - * - * Rec_vitals X_rec = - * { - * is_X_data_rec, - * get_X_rec_address, - * get_X_rec_data_count, - * MAXIMUM DATA BYTES IN A RECORD, - * get_X_rec_data_start, - * put_X_data_rec - * }; - * - */ - -/*----------------------------------------------------------------------------*/ - - -/* - * Put address of additional Rec_vitals structures - * in this array, before the NULL entry. - */ - -Rec_vitals *formats[] = -{ - &intel_hex, - &motorola_s1_rec, - &motorola_s2_rec, - &motorola_s3_rec, - ( Rec_vitals * ) NULL -}; - - -/**** main ***************************************************************** -* -* -* Expects: Nothing (no command-line parameters). -* -* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE). -* -* Reads hex records on the standard input and attempts to -* splice adjacent data fields together. Results appear on -* the standard output. -* -*******************************************************************************/ - -int main( - int argc, - char **argv -) -{ - - char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ]; - char *in_dptr, *out_dptr; - int d_total, d_count, d_excess, n; - int length; - Ulong in_rec_addr, out_rec_addr = 0; - Rec_vitals *rptr; - - - /* Sift through file until first hex record is identified. */ - - rptr = identify_first_data_record( inbuff, MAX_LINE_SIZE ); - if ( rptr == NULL ) - { - fputs( "No hex records found.\n", stderr ); - exit( EXIT_FAILURE ); - } - - - /* Attempt data-record splicing until end-of-file is reached. */ - d_total = 0; - for (;;) { - if ( rptr->is_data_record( inbuff ) == YES ) - { /* Input record is a data record. */ - d_count = rptr->get_data_count( inbuff ); - in_rec_addr = rptr->get_address( inbuff ); - in_dptr = rptr->get_data_start( inbuff ); - - if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total ) - { /* Begin a new output record. */ - if ( d_total != 0 ) - rptr->put_data_record( d_total, out_rec_addr, outbuff ); - out_dptr = outbuff; - n = d_total = d_count; - out_rec_addr = in_rec_addr; - } - else if - ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 ) - { /* Output a maximum-length record, then start a new record. */ - strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) ); - rptr->put_data_record( - rptr->max_data_count, out_rec_addr, outbuff - ); - in_dptr += 2 * ( d_count - d_excess ); - out_dptr = outbuff; - n = d_total = d_excess; - out_rec_addr += rptr->max_data_count; - } - else - { /* Append input record's data field with accumulated data. */ - out_dptr = outbuff + ( 2 * d_total ); - d_total += n = d_count; - } - strncpy( out_dptr, in_dptr, 2 * n ); - out_dptr[ 2 * n ] = EOS; - } - else - { /* Not a data record; - * flush accumulated data then echo non-data record. - */ - if ( d_total != 0 ) - { - rptr->put_data_record( d_total, out_rec_addr, outbuff ); - d_total = 0; - } - puts( inbuff ); - } - - inbuff[ MAX_LINE_SIZE - 1 ] = '\0'; - if ( !fgets( inbuff, MAX_LINE_SIZE, stdin ) ) - break; - if ( inbuff[ MAX_LINE_SIZE - 1 ] ) { - fprintf( stderr, "Input line too long" ); - exit( 1 ); - } - length = strlen(inbuff); - inbuff[length - 1] = '\0'; - - } - - - return ( EXIT_SUCCESS ); - -} - - -/**** identify_first_data_record ******************************************* -* -* Expects: Pointer to hex-record line buffer. -* -* Returns: Pointer to hex-record structure (NULL if no match found). -* -* Reads the standard input, line by line, searching for a valid -* record header character. If a valid header is found, a pointer -* to the hex-record's type structure is returned, otherwise NULL. -* -* The input-stream pointer is left pointing to the first valid hex record. -* -*******************************************************************************/ - -Rec_vitals * identify_first_data_record( char * buff_ptr, int max_length ) -{ - Rec_vitals ** ptr; - int length; - - - - for ( ;; ) { - - buff_ptr[ max_length - 1 ] = '\0'; - if ( !fgets( buff_ptr, max_length, stdin ) ) - break; - if ( buff_ptr[ max_length - 1 ] ) { - fprintf( stderr, "Input line too long" ); - exit( 1 ); - } - length = strlen(buff_ptr); - buff_ptr[length - 1] = '\0'; - - for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ ) - if ( ( *ptr )->is_data_record( buff_ptr ) == YES ) - return( *ptr ); /* Successful return. */ - - puts( buff_ptr ); /* Echo non-hex-record line. */ - } - - return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */ -} - - -/**** get_ndigit_hex ******************************************************* -* -* Expects: Pointer to first ASCII hexadecimal digit, number of digits. -* -* Returns: Value of hexadecimal string as an unsigned long. -* -*******************************************************************************/ - -Ulong get_ndigit_hex( char * cptr, int digits ) -{ - Ulong value; - - for ( value = 0 ; --digits >= 0 ; cptr++ ) - value = ( value * 16L ) + HEX_DIGIT( *cptr ); - - return( value ); -} |