Upgrade from 0.5.1 to 0.6. Don't need gmake (any longer?).

Add a big patch, that's also submitted to the vendor --
fixing a number of bugs and inefficiencies.
This commit is contained in:
Mikhail Teterin 2003-08-20 19:25:25 +00:00
parent 3d6a464e4d
commit 2e8d02816b
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=87399
4 changed files with 909 additions and 4 deletions

View file

@ -7,7 +7,7 @@
#
PORTNAME= dbf
PORTVERSION= 0.5.1
PORTVERSION= 0.6
CATEGORIES= databases
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@ -16,8 +16,7 @@ DISTNAME= ${PORTNAME}-${PORTVERSION}.src
MAINTAINER= ports@FreeBSD.org
COMMENT= Show and convert the content of dBASE III, IV, and 5.0 files
WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}
USE_GMAKE= yes
WRKSRC= ${WRKDIR}/${PORTNAME}-${PORTVERSION}/src
do-install:
${INSTALL_PROGRAM} ${WRKSRC}/dbf ${PREFIX}/bin

View file

@ -1 +1 @@
MD5 (dbf-0.5.1.src.tar.gz) = 26266874ea4b5030e3b000f0a6263df7
MD5 (dbf-0.6.src.tar.gz) = 6048a2c8096e3f4d9a17639a8646b738

View file

@ -0,0 +1,18 @@
--- ../Makefile.rules Thu May 8 14:53:12 2003
+++ ../Makefile.rules Tue Aug 19 15:22:20 2003
@@ -4,4 +4,3 @@
# Compiler flags
-CC = /usr/bin/gcc
-CFLAGS = -Wall
+CFLAGS += -Wall
@@ -12,3 +11,3 @@
VERSION = 0.6
-PREFIX = /usr/local/bin
+PREFIX := ${PREFIX}/bin
@@ -19,4 +18 @@
RED = \033[1;31m
-
-.c.o:
- $(CC) $(CFLAGS) -c $<

View file

@ -0,0 +1,888 @@
This patch was submitted to the dbf project at SourceForge.net.
Hopefully, their next release will include these hunks.
-mi
--- an_string.c Thu May 8 14:53:15 2003
+++ an_string.c Wed Aug 20 14:57:14 2003
@@ -17,19 +17,28 @@
************************************************************************************/
+#include <assert.h>
#include "an_string.h"
/* * * * TRIM_SPACES
- * removes sequently spaces in a string (most time two and more) */
-void trim_spaces (char *q, char *p)
+ * removes sequently spaces in a string (most time two and more)
+ * returns the address of the character following the last in the
+ * new string */
+unsigned char *
+trim_spaces(unsigned char *q, const unsigned char *p, size_t len)
{
- unsigned int i;
-
- for(i=0; i < strlen(p); i++) {
- if( *(p+i) != ' ')
- *q++ = *(p+i);
- if( *(p+(i-1)) != ' ' && *(p+i) == ' ' && *(p+(i+1)) != ' ')
- *q++ = *(p+i);
- }
+ size_t i;
+
+ assert(len > 0);
+ if (p[0] != ' ')
+ *q++ = p[0];
+ len--;
+ for(i=1; i < len; i++)
+ if (p[i] != ' ' || p[i-1] != ' ' && p[i+1] != ' ')
+ *q++ = p[i];
+
+ if (p[i] != ' ')
+ *q++ = p[i];
+ return q;
}
@@ -37,11 +46,12 @@
* we use this function to get the number of umlauts in
* the string and decide if we have to convert or not */
-int countumlauts (char *src) {
+int
+countumlauts (const char *src)
+{
int count;
- int unsigned i;
count = 0;
- for(i=0; i < strlen(src); i++) {
- printf("%c\n",*(src+i));
- switch(*(src+i)) {
+ for(; *src; src++) {
+ printf("%c\n", *src);
+ switch(*src) {
case '\341':
printf("ß gefunden\n");
@@ -67,5 +77,6 @@
/* * * * CONVUML
* converts german special chars into standard chars */
-void convuml (char *dest, char *src)
+void
+convuml(char *dest, const char *src)
{
while(*src != '\0') {
--- an_string.h Thu May 8 14:53:15 2003
+++ an_string.h Wed Aug 20 14:20:02 2003
@@ -24,7 +24,7 @@
#include <string.h>
-void trim_spaces (char *q, char *p);
-int countumlauts (char *src);
-void convuml (char *dest, char *src);
+unsigned char * trim_spaces (unsigned char *dest, const unsigned char *src, size_t srclen);
+int countumlauts (const char *src);
+void convuml (char *dest, const char *src);
#endif
--- codepages.c Thu May 8 14:53:15 2003
+++ codepages.c Wed Aug 20 14:13:50 2003
@@ -24,117 +24,117 @@
void cp850convert (unsigned char *src)
{
- int unsigned i;
- for(i=0; i < strlen(src); i++) {
- switch(*(src+i)) {
+
+ while (*src) {
+ switch(*src++) {
case 0xE4:
- *(src+i) = (unsigned char)228; /*auml (GER)*/
+ *src = (unsigned char)228; /*auml (GER)*/
break;
case 0xC4:
- *(src+i) = (unsigned char)196; /*Auml (GER)*/
+ *src = (unsigned char)196; /*Auml (GER)*/
break;
case 0xF6:
- *(src+i) = (unsigned char)246; /*ouml (GER)*/
+ *src = (unsigned char)246; /*ouml (GER)*/
break;
case 0xD6:
- *(src+i) = (unsigned char)214; /*Ouml (GER)*/
+ *src = (unsigned char)214; /*Ouml (GER)*/
break;
case 0xFC:
- *(src+i) = (unsigned char)252; /*uuml (GER)*/
+ *src = (unsigned char)252; /*uuml (GER)*/
break;
case 0xDC:
- *(src+i) = (unsigned char)220; /*Uuml (GER)*/
+ *src = (unsigned char)220; /*Uuml (GER)*/
break;
case 0xDF:
- *(src+i) = (unsigned char)223; /*szlig (GER)*/
+ *src = (unsigned char)223; /*szlig (GER)*/
break;
case 0xE9:
- *(src+i) = (unsigned char)233; /*eacute (FR)*/
+ *src = (unsigned char)233; /*eacute (FR)*/
break;
case 0xE2:
- *(src+i) = (unsigned char)226; /*acirc (FR)*/
+ *src = (unsigned char)226; /*acirc (FR)*/
break;
case 0xE0:
- *(src+i) = (unsigned char)233; /*agrave (FR)*/
+ *src = (unsigned char)233; /*agrave (FR)*/
break;
case 0xEA:
- *(src+i) = (unsigned char)234; /*ecirc (FR)*/
+ *src = (unsigned char)234; /*ecirc (FR)*/
break;
case 0xE8:
- *(src+i) = (unsigned char)232; /*egrave (FR)*/
+ *src = (unsigned char)232; /*egrave (FR)*/
break;
case 0xEE:
- *(src+i) = (unsigned char)238; /*icirc (FR)*/
+ *src = (unsigned char)238; /*icirc (FR)*/
break;
case 0xEC:
- *(src+i) = (unsigned char)236; /*igrave (FR)*/
+ *src = (unsigned char)236; /*igrave (FR)*/
break;
case 0xC9:
- *(src+i) = (unsigned char)201; /*Eacute (FR)*/
+ *src = (unsigned char)201; /*Eacute (FR)*/
break;
case 0xF4:
- *(src+i) = (unsigned char)244; /*ocirc (FR)*/
+ *src = (unsigned char)244; /*ocirc (FR)*/
break;
case 0xF2:
- *(src+i) = (unsigned char)242; /*ograve (FR)*/
+ *src = (unsigned char)242; /*ograve (FR)*/
break;
case 0xFB:
- *(src+i) = (unsigned char)251; /*ucirc (FR)*/
+ *src = (unsigned char)251; /*ucirc (FR)*/
break;
case 0xF9:
- *(src+i) = (unsigned char)249; /*ugrave (FR)*/
+ *src = (unsigned char)249; /*ugrave (FR)*/
break;
case 0xE1:
- *(src+i) = (unsigned char)225; /*aacute (FR)*/
+ *src = (unsigned char)225; /*aacute (FR)*/
break;
case 0xED:
- *(src+i) = (unsigned char)237; /*iacute (FR)*/
+ *src = (unsigned char)237; /*iacute (FR)*/
break;
case 0xF3:
- *(src+i) = (unsigned char)243; /*oacute (FR)*/
+ *src = (unsigned char)243; /*oacute (FR)*/
break;
case 0xFA:
- *(src+i) = (unsigned char)250; /*uacute (FR)*/
+ *src = (unsigned char)250; /*uacute (FR)*/
break;
case 0xC1:
- *(src+i) = (unsigned char)193; /*Aacute (FR)*/
+ *src = (unsigned char)193; /*Aacute (FR)*/
break;
case 0xC2:
- *(src+i) = (unsigned char)194; /*Acirc (FR)*/
+ *src = (unsigned char)194; /*Acirc (FR)*/
break;
case 0xc0:
- *(src+i) = (unsigned char)192; /*Agrave (FR)*/
+ *src = (unsigned char)192; /*Agrave (FR)*/
break;
case 0xCA:
- *(src+i) = (unsigned char)202; /*Ecirc (FR)*/
+ *src = (unsigned char)202; /*Ecirc (FR)*/
break;
case 0xC8:
- *(src+i) = (unsigned char)200; /*Egrave (FR)*/
+ *src = (unsigned char)200; /*Egrave (FR)*/
break;
case 0xCD:
- *(src+i) = (unsigned char)205; /*Iacute (FR)*/
+ *src = (unsigned char)205; /*Iacute (FR)*/
break;
case 0xCE:
- *(src+i) = (unsigned char)206; /*Icirc (FR)*/
+ *src = (unsigned char)206; /*Icirc (FR)*/
break;
case 0xCC:
- *(src+i) = (unsigned char)204; /*Igrave (FR)*/
+ *src = (unsigned char)204; /*Igrave (FR)*/
break;
case 0xD3:
- *(src+i) = (unsigned char)211; /*Oacute (FR)*/
+ *src = (unsigned char)211; /*Oacute (FR)*/
break;
case 0xD4:
- *(src+i) = (unsigned char)212; /*Ocirc (FR)*/
+ *src = (unsigned char)212; /*Ocirc (FR)*/
break;
case 0xD2:
- *(src+i) = (unsigned char)210; /*Ograve (FR)*/
+ *src = (unsigned char)210; /*Ograve (FR)*/
break;
case 0xDA:
- *(src+i) = (unsigned char)218; /*Uacute (FR)*/
+ *src = (unsigned char)218; /*Uacute (FR)*/
break;
case 0xDB:
- *(src+i) = (unsigned char)219; /*Ucirc (FR)*/
+ *src = (unsigned char)219; /*Ucirc (FR)*/
break;
case 0xD9:
- *(src+i) = (unsigned char)217; /*Ugrave (FR)*/
+ *src = (unsigned char)217; /*Ugrave (FR)*/
break;
}
@@ -145,117 +145,117 @@
void ASCIInumbers (unsigned char *src)
{
- int unsigned i;
- for(i=0; i < strlen(src); i++) {
- switch(*(src+i)) {
+
+ while (*src) {
+ switch(*src++) {
case 0x84:
- *(src+i) = (unsigned char)228; /*auml (GER)*/
+ *src = (unsigned char)228; /*auml (GER)*/
break;
case 0x8E:
- *(src+i) = (unsigned char)196; /*Auml (GER)*/
+ *src = (unsigned char)196; /*Auml (GER)*/
break;
case 0x94:
- *(src+i) = (unsigned char)246; /*ouml (GER)*/
+ *src = (unsigned char)246; /*ouml (GER)*/
break;
case 0x99:
- *(src+i) = (unsigned char)214; /*Ouml (GER)*/
+ *src = (unsigned char)214; /*Ouml (GER)*/
break;
case 0x81:
- *(src+i) = (unsigned char)252; /*uuml (GER)*/
+ *src = (unsigned char)252; /*uuml (GER)*/
break;
case 0x9A:
- *(src+i) = (unsigned char)220; /*Uuml (GER)*/
+ *src = (unsigned char)220; /*Uuml (GER)*/
break;
case 0xE1:
- *(src+i) = (unsigned char)223; /*szlig (GER)*/
+ *src = (unsigned char)223; /*szlig (GER)*/
break;
case 0x82:
- *(src+i) = (unsigned char)233; /*eacute (FR)*/
+ *src = (unsigned char)233; /*eacute (FR)*/
break;
case 0x83:
- *(src+i) = (unsigned char)226; /*acirc (FR)*/
+ *src = (unsigned char)226; /*acirc (FR)*/
break;
case 0x85:
- *(src+i) = (unsigned char)233; /*agrave (FR)*/
+ *src = (unsigned char)233; /*agrave (FR)*/
break;
case 0x88:
- *(src+i) = (unsigned char)234; /*ecirc (FR)*/
+ *src = (unsigned char)234; /*ecirc (FR)*/
break;
case 0x8A:
- *(src+i) = (unsigned char)232; /*egrave (FR)*/
+ *src = (unsigned char)232; /*egrave (FR)*/
break;
case 0x8C:
- *(src+i) = (unsigned char)238; /*icirc (FR)*/
+ *src = (unsigned char)238; /*icirc (FR)*/
break;
case 0x8D:
- *(src+i) = (unsigned char)236; /*igrave (FR)*/
+ *src = (unsigned char)236; /*igrave (FR)*/
break;
case 0x90:
- *(src+i) = (unsigned char)201; /*Eacute (FR)*/
+ *src = (unsigned char)201; /*Eacute (FR)*/
break;
case 0x93:
- *(src+i) = (unsigned char)244; /*ocirc (FR)*/
+ *src = (unsigned char)244; /*ocirc (FR)*/
break;
case 0x95:
- *(src+i) = (unsigned char)242; /*ograve (FR)*/
+ *src = (unsigned char)242; /*ograve (FR)*/
break;
case 0x96:
- *(src+i) = (unsigned char)251; /*ucirc (FR)*/
+ *src = (unsigned char)251; /*ucirc (FR)*/
break;
case 0x97:
- *(src+i) = (unsigned char)249; /*ugrave (FR)*/
+ *src = (unsigned char)249; /*ugrave (FR)*/
break;
case 0xA0:
- *(src+i) = (unsigned char)225; /*aacute (FR)*/
+ *src = (unsigned char)225; /*aacute (FR)*/
break;
case 0xA1:
- *(src+i) = (unsigned char)237; /*iacute (FR)*/
+ *src = (unsigned char)237; /*iacute (FR)*/
break;
case 0xA2:
- *(src+i) = (unsigned char)243; /*oacute (FR)*/
+ *src = (unsigned char)243; /*oacute (FR)*/
break;
case 0xA3:
- *(src+i) = (unsigned char)250; /*uacute (FR)*/
+ *src = (unsigned char)250; /*uacute (FR)*/
break;
case 0xB5:
- *(src+i) = (unsigned char)193; /*Aacute (FR)*/
+ *src = (unsigned char)193; /*Aacute (FR)*/
break;
case 0xB6:
- *(src+i) = (unsigned char)194; /*Acirc (FR)*/
+ *src = (unsigned char)194; /*Acirc (FR)*/
break;
case 0xB7:
- *(src+i) = (unsigned char)192; /*Agrave (FR)*/
+ *src = (unsigned char)192; /*Agrave (FR)*/
break;
case 0xD2:
- *(src+i) = (unsigned char)202; /*Ecirc (FR)*/
+ *src = (unsigned char)202; /*Ecirc (FR)*/
break;
case 0xD3:
- *(src+i) = (unsigned char)200; /*Egrave (FR)*/
+ *src = (unsigned char)200; /*Egrave (FR)*/
break;
case 0xD6:
- *(src+i) = (unsigned char)205; /*Iacute (FR)*/
+ *src = (unsigned char)205; /*Iacute (FR)*/
break;
case 0xD7:
- *(src+i) = (unsigned char)206; /*Icirc (FR)*/
+ *src = (unsigned char)206; /*Icirc (FR)*/
break;
case 0xDE:
- *(src+i) = (unsigned char)204; /*Igrave (FR)*/
+ *src = (unsigned char)204; /*Igrave (FR)*/
break;
case 0xE0:
- *(src+i) = (unsigned char)211; /*Oacute (FR)*/
+ *src = (unsigned char)211; /*Oacute (FR)*/
break;
case 0xE2:
- *(src+i) = (unsigned char)212; /*Ocirc (FR)*/
+ *src = (unsigned char)212; /*Ocirc (FR)*/
break;
case 0xE3:
- *(src+i) = (unsigned char)210; /*Ograve (FR)*/
+ *src = (unsigned char)210; /*Ograve (FR)*/
break;
case 0xE9:
- *(src+i) = (unsigned char)218; /*Uacute (FR)*/
+ *src = (unsigned char)218; /*Uacute (FR)*/
break;
case 0xEA:
- *(src+i) = (unsigned char)219; /*Ucirc (FR)*/
+ *src = (unsigned char)219; /*Ucirc (FR)*/
break;
case 0xEB:
- *(src+i) = (unsigned char)217; /*Ugrave (FR)*/
+ *src = (unsigned char)217; /*Ugrave (FR)*/
break;
}
--- csv.c Thu May 8 14:53:15 2003
+++ csv.c Wed Aug 20 15:10:55 2003
@@ -18,24 +18,20 @@
/* writeCSVHeader */
/* creates the CSV Header with the information provided by DB_FIELD */
-int writeCSVHeader (int fh, struct DB_FIELD *header[], struct DB_FIELD *dbf, int header_length)
+int
+writeCSVHeader (int fh, struct DB_FIELD * const header[],
+ const struct DB_FIELD *dbf, int header_length)
{
int i;
- char *q;
- char buffer[65536];
for(i=1; i < header_length; i++) {
- memset(buffer, 0, 65535);
- dbf = header[i];
- strcpy(buffer,dbf->field_name);
- q = buffer+strlen(buffer);
- *q++ = ';';
- *q = '\0';
- if((write(fh, buffer, strlen(buffer))) == -1)
+ if ((write(fh, header[i]->field_name,
+ strlen((const char *)header[i]->field_name))) == -1
+ || write(fh, ";", 1) == -1)
{
- printf("Cannot write data to CSV File - Aborting!\n"); exit(1);
+ perror("Cannot write data to CSV File - Aborting!"); exit(1);
}
}
- if((write(fh, "\n", NEWLINE_LENGTH)) == -1) {
- printf("Cannot write data to CSV File - Aborting!\n"); exit(1);
+ if ((write(fh, "\n", NEWLINE_LENGTH)) == -1) {
+ perror("Cannot write data to CSV File - Aborting!"); exit(1);
}
@@ -45,32 +41,38 @@
/* writeCSVLine */
/* creates a line in the CSV document for each data set */
-int writeCSVLine (int fh, char *value, struct DB_FIELD *header[], struct DB_FIELD *dbf, int header_length) {
- char *p, *q;
- int i, x;
- char buffer[65536];
- char NewString[65536];
-
+int
+writeCSVLine(int fh, const unsigned char *value, struct DB_FIELD * const header[],
+ const struct DB_FIELD *dbf, int header_length) {
+ const unsigned char *p;
+ unsigned char *q, *end;
+ int i;
+
p = value;
+ q = NULL;
for (i=1; i < header_length; i++)
{
- memset(buffer, 0, 65535);
- memset(NewString, 0, 65535);
- dbf = header[i];
- q = buffer;
- x = dbf->field_length;
- while(x--)
- *q++ = *p++;
- *q++ = ';';
-
- trim_spaces(NewString, buffer);
-
- if((write(fh, NewString, strlen(NewString))) == -1) {
- printf("Cannot write data to CSV File - Aborting!\n");
+ dbf = header[i];
+
+ q = realloc(q, dbf->field_length + 2);
+ if (!q) {
+ perror("writeCSVLine");
+ exit(1);
+ }
+
+ end = trim_spaces(q, p, dbf->field_length);
+ p += dbf->field_length;
+ *end++ = ';';
+
+ if (write(fh, q, end - q) == -1) {
+ perror("Cannot write data to CSV File - Aborting!");
exit(1);
}
}
+ if (q)
+ free(q);
+
if((write(fh, "\n", NEWLINE_LENGTH)) == -1) {
- printf("Cannot write data to CSV File - Aborting!\n"); exit(1);
+ perror("Cannot write data to CSV File - Aborting!"); exit(1);
}
return 0;
--- csv.h Thu May 8 14:53:15 2003
+++ csv.h Wed Aug 20 14:18:02 2003
@@ -22,21 +22,19 @@
#include "tables.h"
#include "an_string.h"
+
#ifdef __unix__
- #include <sys/stat.h>
- #define NEWLINE_LENGTH 2
- #include <unistd.h>
-#elif __MSDOS__
- #include <io.h>
- #include <sys\stat.h>
-#elif _WIN32
- #include <io.h>
- #include <sys\stat.h>
- #define NEWLINE_LENGTH 2
+# include <sys/stat.h>
+# include <unistd.h>
+# define NEWLINE_LENGTH 1
+#elif __MSDOS__ || _WIN32
+# include <io.h>
+# include <sys\stat.h>
+# define NEWLINE_LENGTH 2
#else
- #define NEWLINE_LENGTH 1
+# define NEWLINE_LENGTH 1
#endif
-int writeCSVHeader (int fh, struct DB_FIELD *header[], struct DB_FIELD *dbf, int header_length);
-int writeCSVLine (int fh, char *value, struct DB_FIELD *header[], struct DB_FIELD *dbf, int
+int writeCSVHeader (int fh, struct DB_FIELD * const header[], const struct DB_FIELD *dbf, int header_length);
+int writeCSVLine (int fh, const unsigned char *value, struct DB_FIELD * const header[], const struct DB_FIELD *dbf, int
header_length);
#endif
--- dbf.c Thu May 8 14:53:15 2003
+++ dbf.c Wed Aug 20 14:25:27 2003
@@ -99,5 +99,5 @@
{
if ((read( fh, (char *)db, sizeof(struct DB_HEADER))) == -1 ) {
- printf("Error reading file %s.\n", file);
+ perror(file);
exit(1);
}
@@ -114,9 +114,9 @@
{
if((header[i] = (struct DB_FIELD *)malloc(sizeof(struct DB_FIELD))) == NULL) {
- printf("Fatal error: Cannot malloc.\n");
+ perror("malloc");
exit(1);
}
if((read(fh, (char *)header[i], sizeof(struct DB_FIELD))) == -1) {
- printf("Error reading file %s.\n", file);
+ perror(file);
exit(1);
}
@@ -205,9 +205,9 @@
{
int dbfhandle, handle;
- int header_length, i;
+ int header_length, record_length, i;
char *filename;
int ppc_override; // Big Endian Check Override
int type;
- char *foo, *p;
+ unsigned char *foo, *p;
int k;
ppc_override = 0;
@@ -218,5 +218,5 @@
if (argc < 2) {
- printf("Usage: %s [option][argument] dbf-file, -h for help\n", *argv);
+ fprintf(stderr, "Usage: %s [option][argument] dbf-file, -h for help\n", *argv);
exit(1);
}
@@ -246,6 +246,6 @@
/* Test if last argument is an option or a possible valid filename */
if(argv[(argc-1)][0] == 0x2D) {
- printf("\nERROR: Found no file for input\n");
- printf("Please make sure that the last argument is a valid dBASE file\n");
+ fprintf(stderr, "\nERROR: Found no file for input\n"
+ "Please make sure that the last argument is a valid dBASE file\n");
exit(1);
} else filename = argv[(argc-1)];
@@ -259,5 +259,5 @@
type = CSV_OUTPUT;
} else {
- printf("Usage: %s --csv export_filename dbf-file, -h for help\n", *argv);
+ fprintf(stderr, "Usage: %s --csv export_filename dbf-file, -h for help\n", *argv);
exit(1);
}
@@ -272,5 +272,5 @@
type = SQL_OUTPUT;
} else {
- printf("Usage: %s --sql export_filename dbf-file, -h for help\n", *argv);
+ fprintf(stderr, "Usage: %s --sql export_filename dbf-file, -h for help\n", *argv);
exit(1);
}
@@ -289,11 +289,11 @@
getHeaderValues(dbfhandle,filename,header_length);
dbf_field_stat(header,header_length);
- exit(1);
+ dbf_close(dbfhandle, filename);
+ exit(0);
} else {
- printf("Cannot open file %s\n", argv[(argc-1)]);
- printf("Usage: %s file --view-info\n", argv[0]);
+ fprintf(stderr, "Cannot open file %s\n"
+ "Usage: %s file --view-info\n", argv[(argc-1)], argv[0]);
exit(1);
}
- dbf_close(dbfhandle, filename);
}
}
@@ -304,9 +304,10 @@
dbf_read_header(dbfhandle, filename);
header_length = rotate2b(db->header_length) / 32;
+ record_length = rotate2b(db->record_length);
getHeaderValues(dbfhandle,filename,header_length);
lseek(dbfhandle, rotate2b(db->header_length) + 1, 0);
- if((foo = (char *)malloc(rotate2b(db->record_length))) == NULL) {
- printf("Fatal error: Cannot malloc.\n"); exit(1);
+ if ((foo = malloc(record_length + 1)) == NULL) {
+ perror("malloc"); exit(1);
}
@@ -319,15 +320,20 @@
writeSQLHeader(handle,header,dbf,header_length,filename,export_filename);
break;
- default:
+ default:
writeCSVHeader(handle,header,dbf,header_length); // added dbf, must be tested
break;
- }
+ }
}
/* foo, p inherits full data set */
- while ((read(dbfhandle, (p = foo), rotate2b(db->record_length))))
+ while ((i = read(dbfhandle, (p = foo), record_length)))
{
+ if (i == -1) {
+ perror("reading the next block");
+ exit(1);
+ }
+ p[record_length] = '\0'; /* So the converters know, where to stop */
/* automatic convert options */
- cp850convert(p);
+ cp850convert(p);
ASCIInumbers(p);
/* If export_filename is not set output data to screen, otherwise to export_filename */
@@ -345,5 +351,5 @@
} else {
switch(type) {
- case SQL_OUTPUT:
+ case SQL_OUTPUT:
writeSQLLine(handle,header,dbf,p,header_length,filename,export_filename);
break;
@@ -354,4 +360,5 @@
} /* End of --> inner if */
} /* End of --> while */
+ free(foo);
} /* End of --> if dbfhandle */
if (filename) dbf_close(dbfhandle,filename);
--- dbf.h Thu May 8 14:53:15 2003
+++ dbf.h Wed Aug 20 13:35:54 2003
@@ -16,18 +16,5 @@
#include <string.h>
#include <limits.h>
-#ifdef __unix__
- #include <sys/stat.h>
- #define NEWLINE_LENGTH 2
- #include <unistd.h>
-#elif __MSDOS__
- #include <io.h>
- #include <sys\stat.h>
-#elif _WIN32
- #include <io.h>
- #include <sys\stat.h>
- #define NEWLINE_LENGTH 2
-#else
- #define NEWLINE_LENGTH 1
-#endif
+
/*#define VERSION1 0
#define VERSION2 5
--- sql.c Sat May 24 14:38:46 2003
+++ sql.c Wed Aug 20 14:19:09 2003
@@ -24,32 +24,35 @@
/* writeSQLHeader */
/* creates the SQL Header with the information provided by DB_FIELD */
-int writeSQLHeader (int handle,struct DB_FIELD *header[], struct DB_FIELD *dbf, int header_length,char *filename,char *export_filename)
+int writeSQLHeader (int handle, struct DB_FIELD * const header[],
+ const struct DB_FIELD *dbf, int header_length,
+ const char *filename, const char *export_filename)
{
int unsigned i,l1,l2;
- char *q;
- char buffer[65536], table[32],lg[12];
+ FILE *fp;
+ size_t tablelen;
- strncpy(table,export_filename,strlen(export_filename)-4);
- memset(buffer, 0, 65535);
- q = buffer;
- strcat(q,"-- ");
- strcat(q,export_filename);
- strcat(q," -- \n--\n-- SQL code with the contents of dbf file ");
- strcat(q,filename);
- strcat(q,"\n\ndrop table ");
- strcat(q,table);
- strcat(q,";\n\nCREATE TABLE ");
- strcat(q,table);
- strcat(q,"(\n");
+ fp = fdopen(handle, "w");
+ if (!fp) {
+ perror("writeSQLHeader");
+ exit(1);
+ }
+ tablelen = strlen(export_filename) - 4;
+
+ fprintf(fp, "-- %s -- \n--\n"
+ "-- SQL code with the contents of dbf file %s\n\n"
+ "\ndrop table %.*s\n"
+ "\nCREATE TABLE %.*s\n",
+ export_filename, filename,
+ tablelen, export_filename,
+ tablelen, export_filename);
for(i=1; i < (unsigned int)header_length; i++) {
dbf = header[i];
- strcat(q,dbf->field_name);
- strcat(q,"\t");
+ fprintf(fp, "%s\t", dbf->field_name);
switch(dbf->field_type) {
case 'C':
- strcat(q,"character varying(");
- sprintf(lg,"%d",dbf->field_length);
- strcat(q,lg);
- strcat(q,")");
+ case 'M':
+ fprintf(fp, "character varying(%d)",
+ dbf->field_type == 'M' ? 10 :
+ dbf->field_length);
field_type[i] = IS_STRING;
break;
@@ -58,26 +61,23 @@
l2 = dbf->field_decimals;
if((l1 < 10) && (l2 == 0))
- strcat(q, "int");
+ fputs("int", fp);
else
- sprintf(lg,"numeric(%d, %d)",l1,l2);
- strcat(q, lg);
+ fprintf(fp, "numeric(%d, %d)",
+ l1, l2);
field_type[i] = IS_NUMERIC;
break;
- case 'M':
- strcat(q, "character varying(10)");
- field_type[i] = IS_STRING;
- break;
+ case 'D':
+ fputs("date", fp);
+ break;
default:
- break;
+ fprintf(fp, "/* unsupported type ``%c'' */",
+ dbf->field_type);
}
if(i < header_length - 1)
- strcat(q,",");
- strcat(q,"\n");
- }
- strcat(q,");\n");
-printf("Writing %s\n", buffer);
- if((write(handle, buffer, strlen(buffer))) == -1) {
- printf("Cannot write data to SQL File - Aborting!\n"); exit(1);
+ fputc(',', fp);
+ fputs("\n", fp);
}
+ fputs(");\n", fp);
+ fflush(fp);
return 0;
@@ -86,51 +86,55 @@
/* writeSQLLine */
/* fills the SQL table */
-int writeSQLLine (int handle,struct DB_FIELD *header[], struct DB_FIELD *dbf,char *value, int header_length,char *filename, char *export_filename) {
- char *p, *q;
- int i, x;
- char buffer[65536];
- char NewString[65536];
- char table[32];
+int
+writeSQLLine (int handle, struct DB_FIELD * const header[],
+ const struct DB_FIELD *dbf, const unsigned char *value, int header_length,
+ const char *filename, const char *export_filename)
+{
+ const unsigned char *p;
+ unsigned char *q;
+ FILE *fp;
+ int i;
+ size_t tablelen;
- strncpy(table,export_filename,strlen(export_filename)-4);
+ fp = fdopen(handle, "w");
+ if (!fp) {
+ perror("writeSQLLine");
+ exit(1);
+ }
+ tablelen = strlen(export_filename) - 4;
p = value;
+ q = NULL;
- memset(buffer, 0, 65535);
- q = buffer;
- strcat(q,"INSERT INTO ");
- strcat(q,table);
- strcat(q," VALUES(\n");
- if((write(handle, buffer, strlen(buffer))) == -1) {
- printf("Cannot write data to SQL File - Aborting!\n"); exit(1);
- }
+ fprintf(fp, "INSERT INTO %.*s VALUES(\n",
+ tablelen, export_filename);
+
for (i=1; i < (unsigned int)header_length; i++)
{
- memset(buffer, 0, 65535);
- memset(NewString, 0, 65535);
+ unsigned char *end;
dbf = header[i];
- q = buffer;
- x = dbf->field_length;
+
+ q = realloc(q, dbf->field_length);
+
if(field_type[i] == IS_STRING)
- *q++ = '\'';
- while(x--){
- *q++ = *p++;
- }
- trim_spaces(NewString, buffer);
- if((field_type[i] == IS_NUMERIC) && (strlen(NewString) == 0))
- strcat(NewString,"0");
+ fputc('\'', fp);
+
+ end = trim_spaces(q, p, dbf->field_length);
+ p += dbf->field_length;
+
+ fprintf(fp, "%.*s", end - q, q);
+
+ if((field_type[i] == IS_NUMERIC) && end == q)
+ fputc('0', fp);
if(field_type[i] == IS_STRING)
- strcat(NewString,"\'");
+ fputc('\'', fp);
if(i < header_length - 1)
- strcat(NewString,",");
- if((write(handle, NewString, strlen(NewString))) == -1) {
- printf("Cannot write data to SQL File - Aborting!\n");
- exit(1);
- }
- }
- sprintf(buffer,");\n");
- if((write(handle, buffer, strlen(buffer))) == -1) {
- printf("Cannot write data to SQL File - Aborting!\n"); exit(1);
+ fputc(',', fp);
}
- return 0;
+ if (q)
+ free(q);
+ fputs(");\n", fp);
+ fflush(fp);
+
+ return 0;
}
--- sql.h Thu May 8 14:53:15 2003
+++ sql.h Wed Aug 20 14:17:46 2003
@@ -42,7 +42,7 @@
int field_type[MAX_FIELDS];
-int writeSQLHeader (int handle,struct DB_FIELD *header[], struct DB_FIELD *dbf, int header_length,char *filename,char
+int writeSQLHeader (int handle,struct DB_FIELD * const header[], const struct DB_FIELD *dbf, int header_length, const char *filename, const char
*export_filename);
-int writeSQLLine (int handle,struct DB_FIELD *header[], struct DB_FIELD *dbf,char *value, int header_length,char *filename, char *export_filename);
+int writeSQLLine (int handle,struct DB_FIELD * const header[], const struct DB_FIELD *dbf, const unsigned char *value, int header_length, const char *filename, const char *export_filename);
#endif