Ok, this is the system:
Debian Sparc
gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
Compiling SWRFuss from the fuss web site.
The code:
The warnings:
I've been trying to get it to compile on this system, and have corrected a few errors so far, but this one has me stumped. I have tried to search this though google, and from what I can understand it is an error that comes from the differnce in pointer sizes from this system compared to most. If anyone has some suggestions, please let me know.
Debian Sparc
gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
Compiling SWRFuss from the fuss web site.
The code:
/*
* Check hash table for existing occurance of string.
* If found, increase link count, and return pointer,
* otherwise add new string to hash table, and return pointer.
*/
char *str_alloc( char *str )
{
register int len, hash, psize;
register struct hashstr_data *ptr;
len = strlen( str );
psize = sizeof( struct hashstr_data );
hash = len % STR_HASH_SIZE;
for( ptr = string_hash[hash]; ptr; ptr = ptr->next )
if( len == ptr->length && !strcmp( str, ( char * )ptr + psize ) )
{
if( ptr->links < 65535 )
++ptr->links;
return ( char * )ptr + psize;
}
ptr = ( struct hashstr_data * )malloc( len + psize + 1 );
ptr->links = 1;
ptr->length = len;
if( len )
strcpy( ( char * )ptr + psize, str );
/* memcpy( (char *) ptr+psize, str, len+1 ); */
else
strcpy( ( char * )ptr + psize, "" );
ptr->next = string_hash[hash];
string_hash[hash] = ptr;
return ( char * )ptr + psize;
}
/*
* Used to make a quick copy of a string pointer that is known to be already
* in the hash table. Function increments the link count and returns the
* same pointer passed.
*/
char *quick_link( char *str )
{
register struct hashstr_data *ptr;
ptr = ( struct hashstr_data * )( str - sizeof( struct hashstr_data ) );/* Line 107 */
if( ptr->links == 0 )
{
fprintf( stderr, "quick_link: bad pointer\n" );
return NULL;
}
if( ptr->links < 65535 )
++ptr->links;
return str;
}
/*
* Used to remove a link to a string in the hash table.
* If all existing links are removed, the string is removed from the
* hash table and disposed of.
* returns how many links are left, or -1 if an error occurred.
*/
int str_free( char *str )
{
register int len, hash;
register struct hashstr_data *ptr, *ptr2, *ptr2_next;
len = strlen( str );
hash = len % STR_HASH_SIZE;
ptr = ( struct hashstr_data * )( str - sizeof( struct hashstr_data ) );/* Line 131 */
if( ptr->links == 65535 ) /* permanent */
return ptr->links;
if( ptr->links == 0 )
{
fprintf( stderr, "str_free: bad pointer\n" );
return -1;
}
if( --ptr->links == 0 )
{
if( string_hash[hash] == ptr )
{
string_hash[hash] = ptr->next;
free( ptr );
return 0;
}
for( ptr2 = string_hash[hash]; ptr2; ptr2 = ptr2_next )
{
ptr2_next = ptr2->next;
if( ptr2_next == ptr )
{
ptr2->next = ptr->next;
free( ptr );
return 0;
}
}
fprintf( stderr, "str_free: pointer not found for string: %s\n", str );
return -1;
}
return ptr->links;
}The warnings:
hashstr.c: In function `quick_link':
hashstr.c:107: warning: cast increases required alignment of target type
hashstr.c: In function `str_free':
hashstr.c:131: warning: cast increases required alignment of target typeI've been trying to get it to compile on this system, and have corrected a few errors so far, but this one has me stumped. I have tried to search this though google, and from what I can understand it is an error that comes from the differnce in pointer sizes from this system compared to most. If anyone has some suggestions, please let me know.