Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
struct {
const char *name;
void *data;
} data;
size_t byte;
size_t node;
} spot_t;
typedef struct {
struct {
struct {
const spot_t *data;
} data;
size_t used;
} list;
} pool_t;
void* GetSpotByName( pool_t pool, spot_t *spot, char const *name ) {
size_t i = 0;
static int called = 0;
++called;
spot_t *spots = (spot_t*)pool.list.data.data;
printf( "Call: %d, Name: %s\n", called, name );
for ( ; i < pool.list.used; ++i ) {
if ( !spots[i].data.name ) continue;
printf( "Call: %d, Byte: %zu, Node: %zu, Name: %s\n",
called, spots[i].byte, spots[i].node, spots[i].data.name );
if ( strcmp( spots[i].data.name, name ) == 0 ) {
puts("This one was returned");
if ( spot ) *spot = spots[i];
return spots[i].data.data;
}
}
if ( spot ) memset( spot, 0, sizeof(spot_t) );
return NULL;
}
int main()
{
spot_t spots[] = {
{ .byte = 18446744073709551615LLU, .node = 0, .data.name = "test.c", },
{ .byte = 0LLU, .node = 1, .data.name = "_start", },
{ .byte = 10LLU, .node = 2, .data.name = "exit", },
{ .byte = 18446744073709551615LLU, .node = 3, .data.name = "__db", },
{ .byte = 18446744073709551615LLU, .node = 4, .data.name = "__dw", },
{ .byte = 18446744073709551615LLU, .node = 5, .data.name = "__dd", },
{ .byte = 18446744073709551615LLU, .node = 6, .data.name = "__dq", },
{ .byte = 18446744073709551615LLU, .node = 7, .data.name = "char", },
{ .byte = 18446744073709551615LLU, .node = 8, .data.name = "short", },
{ .byte = 18446744073709551615LLU, .node = 9, .data.name = "int", },
{ .byte = 18446744073709551615LLU, .node = 10, .data.name = "signed", },
{ .byte = 18446744073709551615LLU, .node = 11, .data.name = "unsigned", },
{ .byte = 18446744073709551615LLU, .node = 12, .data.name = "long long", },
{ .byte = 18446744073709551615LLU, .node = 13, .data.name = "float", },
{ .byte = 18446744073709551615LLU, .node = 14, .data.name = "double", },
{ .byte = 18446744073709551615LLU, .node = 15, .data.name = "long", },
};
pool_t pool = {
.list = {
.data.data = spots,
.used = 16,
},
};
GetSpotByName(pool, NULL, "int");
return 0;
}
Output:
Code:
Call: 1, Name: int
Call: 1, Byte: 18446744073709551615, Node: 0, Name: test.c
Call: 1, Byte: 0, Node: 1, Name: _start
Call: 1, Byte: 10, Node: 2, Name: exit
Call: 1, Byte: 18446744073709551615, Node: 3, Name: __db
Call: 1, Byte: 18446744073709551615, Node: 4, Name: __dw
Call: 1, Byte: 18446744073709551615, Node: 5, Name: __dd
Call: 1, Byte: 18446744073709551615, Node: 6, Name: __dq
Call: 1, Byte: 18446744073709551615, Node: 7, Name: char
Call: 1, Byte: 18446744073709551615, Node: 8, Name: short
Call: 1, Byte: 18446744073709551615, Node: 9, Name: int
This one was returned
So there must be something wrong (whitespace?) with the name in your spot_t structure or in the string you're passing in to GetSpotByName (or there could be undefined behavior caused by some code that you didn't post).