/* dbf2js ** Convert a DBF table to a Javascript multidimensional array ** Written by David Turover ** This needs to be linked with dbfopen.o from shapelib: ** http://gdal.velocet.ca/projects/shapelib/ */ #include #include #include /* from shapelib */ const char * help = " dbf2js 0.0.2 -- Convert a DBF table to a Javascript multidimensional array. Usage: dbf2j database.dbf [--options] Options: --help Print this screen "; /* Functions */ void mkFileBaseName(char *str){ /* Arg must be NUL-terminated */ int i; if(str == NULL) return; for(i=0; str[i] != '\0'; i++) if(str[i] == ' ' || str[i] == '.') /* More protections would be nice here */ str[i] = '\0'; } void printJSFieldNames(DBFHandle data, int numFields){ char fName[12]; /* Maximum field name returned by DBFGetFieldInfo is supposed to be 11 characters */ int i; /* Save the index number of each field in the table */ for(i=0; i 11){ fprintf(stderr, "Warn: DBFGetFieldInfo buggy: len %d > 11 \n", strlen(fName)); } else if(strlen(fName) == 0){ fprintf(stderr, "Warn: Field %d has no name\n",i); } else printf("var %sIndex = %d;\n",fName,i); } } void printJSData(DBFHandle data, int numFields, int numRecords){ int record, field; /* Print the data */ for(record = 0; record < numRecords; record ++){ printf("["); for(field = 0; field < numFields; field ++){ if(field != 0){ putchar(','); } printf("\"%s\"", DBFReadStringAttribute(data,record,field)); } printf("]\n"); } } /* Main */ int main(int argc, char ** argv){ char * filename = NULL; /* Name of the DBF file */ char * div = "msjsdiv"; /* Name of the html div to write to */ DBFHandle data = NULL; int argstrindex = 0; /* Used while parsing args */ int numFields = 0; /* Used for traversing the DBF file */ int numRecords = 0; /* int field = 0; int record = 0; */ /* Parse arguments */ /* Scrap this ugly thing and find a 3rd-party lib */ while(argc > 1){ argc--; if(argv[argc] != NULL && strlen(argv[argc]) > 0){ argstrindex = 0; while((argv[argc])[argstrindex] == '-'){ argstrindex ++; } if(argstrindex == 0){ /* Arg should be path to DBF file */ if(filename != NULL){ fprintf(stderr, "Error: two filenames (%s) (%s) present\n", filename, argv[argc]); exit(0); } filename = argv[argc]; } else { printf("%s", help); exit(0); } } } /* Check for needed values */ if(filename == NULL){ fprintf(stderr, "Error: You need to specify a DBF file. \n"); printf("%s", help); exit(0); } /* Done parsing arglist */ /* Prepare data */ data = DBFOpen(filename, "r"); if(data == NULL){ fprintf(stderr, "Error: Could not open file %s (not found or not a DBF)\n", filename); exit(0); } numFields = DBFGetFieldCount(data); if(numFields < 1){ fprintf(stderr, "Error: Empty Database (no fields)\n"); DBFClose(data); exit(0); } numRecords = DBFGetRecordCount(data); if(numRecords < 1){ fprintf(stderr, "Error: Empty Database (no records)\n"); DBFClose(data); exit(0); } /* Convert filename to the basename of the file */ mkFileBaseName(filename); /* Print the Javascript variables */ printJSFieldNames(data, numFields); printf("var %s [\n",filename); printJSData(data, numFields, numRecords); printf("];\n"); if(div != NULL){ printf("function msjscachewrite(table,record){\n"); printf("}\n"); } DBFClose(data); return 0; }