|
|
|
@ -496,33 +496,37 @@ unsigned long int maps_readpos (unsigned long int pos, struct map_search_data *d
|
|
|
|
if (readsize <= 0) return -1;
|
|
|
|
if (readsize <= 0) return -1;
|
|
|
|
|
|
|
|
|
|
|
|
/* search where the current line starts (go to the left) */
|
|
|
|
/* search where the current line starts (go to the left) */
|
|
|
|
for (start = pos-realpos; start > 0; start--)
|
|
|
|
// d_printf ("start at: pos:%ld realpos:%d start:%d", pos, realpos, pos-realpos);
|
|
|
|
|
|
|
|
for (start = pos-realpos; start > 0; start--) {
|
|
|
|
|
|
|
|
// d_printf (" found:start:%-4d %x '%c' delta:%d", start, maps_line[start], maps_line[start], realpos+start-pos);
|
|
|
|
if (maps_line[start] == '\n') {
|
|
|
|
if (maps_line[start] == '\n') {
|
|
|
|
start++;
|
|
|
|
start++;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
if (start < 0) { /* underrun buffer? */
|
|
|
|
if (start < 0) { /* underrun buffer? */
|
|
|
|
d_printf ("maps_readpos: found no start. pos:%ld realpos:%lld", pos, realpos);
|
|
|
|
d_printf ("maps_readpos: found no start. pos:%ld realpos:%lld", pos, realpos);
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// d_printf ("start:%d", start);
|
|
|
|
// d_printf (" maps_readpos pos:%ld start:%d delta:%d", pos, start, (realpos+start)-pos);
|
|
|
|
|
|
|
|
|
|
|
|
/* search where the current line ends */
|
|
|
|
/* search where the current line ends */
|
|
|
|
for (end = start; end < readsize && maps_line[end] != '\n'; end++);
|
|
|
|
for (end = start; end < readsize && maps_line[end] != '\n'; end++);
|
|
|
|
if (end >= readsize) {
|
|
|
|
if (end >= readsize) {
|
|
|
|
// d_printf ("maps_readpos: found no end.");
|
|
|
|
d_printf ("maps_readpos: found no end.");
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
*data = map_search_line2data (maps_line+start);
|
|
|
|
*data = map_search_line2data (maps_line+start);
|
|
|
|
*size = end-start;
|
|
|
|
*size = end-start;
|
|
|
|
|
|
|
|
// d_printf (" size:%d", *size);
|
|
|
|
|
|
|
|
|
|
|
|
return start;
|
|
|
|
return realpos+start;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int map_search (char *name, struct map_search_data *data, int datasize) {
|
|
|
|
int map_search (char *name, struct map_search_data *data, int datasize) {
|
|
|
|
uint64_t blocksize, blockstart;
|
|
|
|
uint64_t blocksize, blockstart, realstart;
|
|
|
|
struct stat buf;
|
|
|
|
struct stat buf;
|
|
|
|
int i, j, cmpres, k;
|
|
|
|
int i, j, cmpres, k;
|
|
|
|
|
|
|
|
|
|
|
|
@ -535,34 +539,63 @@ int map_search (char *name, struct map_search_data *data, int datasize) {
|
|
|
|
blocksize = buf.st_size;
|
|
|
|
blocksize = buf.st_size;
|
|
|
|
blockstart = 0;
|
|
|
|
blockstart = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* search for name inside the data */
|
|
|
|
do {
|
|
|
|
do {
|
|
|
|
i = maps_readpos (blocksize/2+blockstart, data, &j);
|
|
|
|
realstart = maps_readpos (blocksize/2+blockstart, data, &j);
|
|
|
|
if (i < 0) {
|
|
|
|
if (realstart < 0) {
|
|
|
|
d_printf ("map_search something went wrong. i < 0 name:%s", name);
|
|
|
|
d_printf ("map_search something went wrong. realstart < 0 name:%s", name);
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_printf ("search blocksize:%lld blockstart:%lld i:%d j:%d", blocksize, blockstart, i, j, data->name);
|
|
|
|
d_printf ("search blocksize:%lld blockstart:%lld realstart:%d j:%d", blocksize, blockstart, realstart, j, data->name);
|
|
|
|
d_printf ("compare: '%s' with '%s'", name, data->name);
|
|
|
|
|
|
|
|
if ((cmpres = strncasecmp (name, data->name, strlen (name)))> 0) {
|
|
|
|
if ((cmpres = strncasecmp (name, data->name, strlen (name)))> 0) {
|
|
|
|
/* name is lager than data */
|
|
|
|
/* name is lager than data */
|
|
|
|
blocksize = blocksize - ((i+j) - blockstart);
|
|
|
|
blocksize = blocksize - (realstart+j-blockstart);
|
|
|
|
blockstart = i+j;
|
|
|
|
blockstart = realstart+j+1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (cmpres < 0) {
|
|
|
|
else if (cmpres < 0) {
|
|
|
|
/* name is smaller than data */
|
|
|
|
/* name is smaller than data */
|
|
|
|
blocksize = i - blockstart;
|
|
|
|
blocksize = realstart - blockstart;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
d_printf ("cmpres: %d", cmpres);
|
|
|
|
d_printf ("compare: '%s' with '%s' returns:%d", name, data->name, cmpres);
|
|
|
|
} while (cmpres != 0 && blocksize > MAP_SEARCHLINE_LEN*2);
|
|
|
|
} while (cmpres != 0 && blocksize > MAP_SEARCHLINE_LEN*2);
|
|
|
|
|
|
|
|
|
|
|
|
d_printf ("found blockstart:%lld datasize:%d, i:%d text:'%-12s'", blockstart, datasize, i, data->name);
|
|
|
|
|
|
|
|
blockstart = i-MAP_SEARCHLINE_LEN;
|
|
|
|
/* find first data inside list, go backwards until no match found */
|
|
|
|
|
|
|
|
d_printf ("found blockstart:%lld blocksize:%d, realstart:%ld text:'%-12s'", blockstart, blocksize, realstart, data->name);
|
|
|
|
|
|
|
|
j = 0;
|
|
|
|
|
|
|
|
if (cmpres <= 0) {
|
|
|
|
|
|
|
|
blockstart = realstart;
|
|
|
|
|
|
|
|
d_printf ("<=0 blockstart:%ld realstart:%ld name:%s", blockstart, realstart, name);
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
realstart = maps_readpos (blockstart, data, &j);
|
|
|
|
|
|
|
|
d_printf ("blockstart:%ld realstart:%ld data->name:%s", blockstart, realstart, data->name);
|
|
|
|
|
|
|
|
blockstart = realstart-2;
|
|
|
|
|
|
|
|
cmpres = strncasecmp (name, data->name, strlen (name));
|
|
|
|
|
|
|
|
d_printf (" cmpres:%d", cmpres);
|
|
|
|
|
|
|
|
} while (blockstart >= 0 && cmpres <= 0 && realstart >= 0);
|
|
|
|
|
|
|
|
blockstart = realstart+j;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (cmpres > 0) {
|
|
|
|
|
|
|
|
blockstart = realstart;
|
|
|
|
|
|
|
|
d_printf (">0 blockstart:%ld realstart:%ld name:%s", blockstart, realstart, name);
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
|
|
|
realstart = maps_readpos (blockstart, data, &j);
|
|
|
|
|
|
|
|
d_printf ("blockstart:%ld realstart:%ld data->name:%s", blockstart, realstart, data->name);
|
|
|
|
|
|
|
|
blockstart = realstart+j;
|
|
|
|
|
|
|
|
cmpres = strncasecmp (name, data->name, strlen (name));
|
|
|
|
|
|
|
|
d_printf (" cmpres:%d", cmpres);
|
|
|
|
|
|
|
|
} while (cmpres > 0 && realstart >= 0);
|
|
|
|
|
|
|
|
blockstart = realstart;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (realstart < 0) return 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (blockstart < 0) blockstart = 0;
|
|
|
|
if (blockstart < 0) blockstart = 0;
|
|
|
|
for (i = 0, k = 0; i < datasize*2 && k < datasize; i++) {
|
|
|
|
for (i = 0, k = 0; i < datasize*2 && k < datasize; i++) {
|
|
|
|
blockstart = maps_readpos (blockstart, data+k, &j);
|
|
|
|
realstart = maps_readpos (blockstart, data+k, &j);
|
|
|
|
d_printf ("create list: k:%d i:%d blockstart:%lld j:%d", k, i, blockstart, j);
|
|
|
|
d_printf ("create list: k:%d i:%d blockstart:%lld j:%d '%s'", k, i, blockstart, j, data[k].name);
|
|
|
|
if (blockstart < 0) break;
|
|
|
|
if (realstart < 0) break;
|
|
|
|
blockstart += j;
|
|
|
|
blockstart = realstart + j;
|
|
|
|
if (strncasecmp (name, data[k].name, strlen (name)) == 0) k++;
|
|
|
|
if (strncasecmp (name, data[k].name, strlen (name)) == 0) k++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|