sort routines in appropriate order

This commit is contained in:
Paul Gardner-Stephen committed 2019-04-18 20:50:57 +09:30
1 parent de2139117a
commit ef4626e970
4 files changed
+60 -4

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
[submodule "Ophis"]
path = Ophis
url = git@github.com:gardners/Ophis.git
+1 -1
View File
@@ -4,7 +4,7 @@ src/collect_data: src/collect_data.c Makefile
gcc -Wall -o src/collect_data src/collect_data.c
src/preprocess: src/preprocess.c Makefile
gcc -Wall -o src/preprocess src/preprocess.c
gcc -g -Wall -o src/preprocess src/preprocess.c
c64/kernal-disasembly.html:
Submodule
+1
Submodule Ophis added at 15818e7666.
+55 -3
View File
@@ -13,6 +13,25 @@
#define DO_ERROR(X) { retVal=-1; fprintf(stderr,"%s:%d:%s():%s\n",__FILE__,__LINE__,__func__,X); break; }
#define MAX_FILES (128*1024)
typedef struct source_file {
char *file;
u_int32_t address;
} source_file;
source_file source_files[MAX_FILES];
int source_count=0;
static int compare_source(const void* a, const void* b)
{
source_file* aa = (source_file*)a;
source_file* bb = (source_file*)b;
if (aa->address<bb->address) return -1;
if (aa->address>bb->address) return 1;
return strcmp(aa->file,bb->file);
}
void usage(void)
{
fprintf(stderr,"usage: preprocess [-d <directory>]\n");
@@ -39,17 +58,50 @@ int main(int argc,char **argv)
exit(-1);
}
}
// Get list of files
d=opendir(directory);
if (!d) DO_ERROR("opendir() failed");
while((de=readdir(d))!=NULL) {
if (strlen(de->d_name)>2) {
if (!strcmp(&de->d_name[strlen(de->d_name)-2],".s")) {
printf("%s\n",de->d_name);
if (source_count>=MAX_FILES) DO_ERROR("Too many source files. Increase MAX_FILES?");
source_files[source_count].file=strdup(de->d_name);
source_files[source_count].address=0x7fffffff;
source_count++;
}
}
}
if (retVal) break;
closedir(d); d=NULL;
fprintf(stderr,"Found %d source files\n",source_count);
// Now get routine addresses of everything
for(int i=0;i<source_count;i++) {
u_int32_t addr;
char funcname[1024];
if (sscanf(source_files[i].file,"%x.%[^.]",&addr,funcname)==2) {
// Function must appear at specific address
source_files[i].address=addr;
}
}
fprintf(stderr,"Got fixed routine addresses\n");
// Sort files into order.
// The sorted order is the order the files will appear in the combined source file.
// This means that address prefixes on names will be in the right order, but function
// names will not.
qsort(source_files,source_count,sizeof(source_file),compare_source);
fprintf(stderr,"Sorted.\n");
for(int i=0;i<source_count;i++) {
printf("$%04X : %s\n",
source_files[i].address!=0x7ffffff?source_files[i].address:0,
source_files[i].file);
}
} while(0);