aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Miika Turkia <miika.turkia@gmail.com>2015-08-27 17:36:23 +0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-08-27 08:59:44 -0700
commit8e08fdcc85a95fa31f47478f20cb6fa9579162fb (patch)
tree1337a245461fce7cefdd7c70b19ecc75a8c67e74
parentc5f92c750157be9aa11a2a3bc3619269e11d7c70 (diff)
downloadsubsurface-8e08fdcc85a95fa31f47478f20cb6fa9579162fb.tar.gz
Clean up CSV import parameters
Continuing the crusade against excessive number of parameters for some functions. This should be the last of the import functions to be cleaned up. Signed-off-by: Miika Turkia <miika.turkia@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--dive.h2
-rw-r--r--file.c28
-rw-r--r--qt-ui/divelogimportdialog.cpp97
-rw-r--r--qt-ui/divelogimportdialog.h1
4 files changed, 76 insertions, 52 deletions
diff --git a/dive.h b/dive.h
index 2585555ea..308a23155 100644
--- a/dive.h
+++ b/dive.h
@@ -668,7 +668,7 @@ extern int parse_divinglog_buffer(sqlite3 *handle, const char *url, const char *
extern int parse_dlf_buffer(unsigned char *buffer, size_t size);
extern int parse_file(const char *filename);
-extern int parse_csv_file(const char *filename, int timef, int depthf, int tempf, int po2f, int o2Sensor1f, int o2Sensor2f, int o2Sensor3f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int setpointf, int sepidx, const char *csvtemplate, int unitidx, const char *hw);
+extern int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
extern int parse_seabear_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate);
extern int parse_txt_file(const char *filename, const char *csv);
extern int parse_manual_file(const char *filename, char **params, int pnr);
diff --git a/file.c b/file.c
index 5ea6bb2e5..cd3d3cad4 100644
--- a/file.c
+++ b/file.c
@@ -922,14 +922,14 @@ int init_csv_file_parsing(char **params, time_t *now, struct tm *timep, int time
return pnr - 1;
}
-int parse_csv_file(const char *filename, int timef, int depthf, int tempf, int po2f, int o2sensor1f, int o2sensor2f, int o2sensor3f, int cnsf, int ndlf, int ttsf, int stopdepthf, int pressuref, int setpointf, int sepidx, const char *csvtemplate, int unitidx, const char *hw)
+int parse_csv_file(const char *filename, char **params, int pnr, const char *csvtemplate)
{
int ret, i;
struct memblock mem;
- char *params[37];
time_t now;
struct tm *timep = NULL;
int previous;
+ char tmpbuf[MAXCOLDIGITS];
/* Increase the limits for recursion and variables on XSLT
* parsing */
@@ -938,19 +938,23 @@ int parse_csv_file(const char *filename, int timef, int depthf, int tempf, int p
xsltMaxVars = 150000;
#endif
- if (timef >= MAXCOLS || depthf >= MAXCOLS || tempf >= MAXCOLS || po2f >= MAXCOLS || o2sensor1f >= MAXCOLS || o2sensor2f >= MAXCOLS || o2sensor3f >= MAXCOLS || cnsf >= MAXCOLS || ndlf >= MAXCOLS || cnsf >= MAXCOLS || stopdepthf >= MAXCOLS || pressuref >= MAXCOLS || setpointf >= MAXCOLS)
- return report_error(translate("gettextFromC", "Maximum number of supported columns on CSV import is %d"), MAXCOLS);
+ if (filename == NULL)
+ return report_error("No CSV filename");
- ret = init_csv_file_parsing(params, &now, timep, timef, depthf, tempf, po2f, o2sensor1f, o2sensor2f, o2sensor3f, cnsf, ndlf, ttsf, stopdepthf, pressuref, setpointf, sepidx, csvtemplate, unitidx);
+ time(&now);
+ timep = localtime(&now);
- if (strlen(hw)) {
- params[ret++] = "hw";
- params[ret++] = strdup(hw);
- params[ret++] = NULL;
- }
+ strftime(tmpbuf, MAXCOLDIGITS, "%Y%m%d", timep);
+ params[pnr++] = "date";
+ params[pnr++] = strdup(tmpbuf);
- if (filename == NULL)
- return report_error("No CSV filename");
+ /* As the parameter is numeric, we need to ensure that the leading zero
+ * is not discarded during the transform, thus prepend time with 1 */
+
+ strftime(tmpbuf, MAXCOLDIGITS, "1%H%M", timep);
+ params[pnr++] = "time";
+ params[pnr++] = strdup(tmpbuf);
+ params[pnr++] = NULL;
mem.size = 0;
if (try_to_xslt_open_csv(filename, &mem, csvtemplate))
diff --git a/qt-ui/divelogimportdialog.cpp b/qt-ui/divelogimportdialog.cpp
index 39bcc3423..12e36662a 100644
--- a/qt-ui/divelogimportdialog.cpp
+++ b/qt-ui/divelogimportdialog.cpp
@@ -623,6 +623,50 @@ char *intdup(int index)
return strdup(tmpbuf);
}
+int DiveLogImportDialog::setup_csv_params(QStringList r, char **params, int pnr)
+{
+ params[pnr++] = strdup("timeField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample time")));
+ params[pnr++] = strdup("depthField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample depth")));
+ params[pnr++] = strdup("tempField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample temperature")));
+ params[pnr++] = strdup("po2Field");
+ params[pnr++] = intdup(r.indexOf(tr("Sample pO₂")));
+ params[pnr++] = strdup("o2sensor1Field");
+ params[pnr++] = intdup(r.indexOf(tr("Sample sensor1 pO₂")));
+ params[pnr++] = strdup("o2sensor2Field");
+ params[pnr++] = intdup(r.indexOf(tr("Sample sensor2 pO₂")));
+ params[pnr++] = strdup("o2sensor3Field");
+ params[pnr++] = intdup(r.indexOf(tr("Sample sensor3 pO₂")));
+ params[pnr++] = strdup("cnsField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample CNS")));
+ params[pnr++] = strdup("ndlField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample NDL")));
+ params[pnr++] = strdup("ttsField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample TTS")));
+ params[pnr++] = strdup("stopdepthField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample stopdepth")));
+ params[pnr++] = strdup("pressureField");
+ params[pnr++] = intdup(r.indexOf(tr("Sample pressure")));
+ params[pnr++] = strdup("setpointFiend");
+ params[pnr++] = intdup(r.indexOf(tr("Sample setpoint")));
+ params[pnr++] = strdup("separatorIndex");
+ params[pnr++] = intdup(ui->CSVSeparator->currentIndex());
+ params[pnr++] = strdup("units");
+ params[pnr++] = intdup(ui->CSVUnits->currentIndex());
+ if (hw.length()) {
+ params[pnr++] = strdup("hw");
+ params[pnr++] = strdup(hw.toUtf8().data());
+ } else if (ui->knownImports->currentText().length() > 0) {
+ params[pnr++] = strdup("hw");
+ params[pnr++] = strdup(ui->knownImports->currentText().prepend("\"").append("\"").toUtf8().data());
+ }
+ params[pnr++] = NULL;
+
+ return pnr;
+}
+
void DiveLogImportDialog::on_buttonBox_accepted()
{
QStringList r = resultModel->result();
@@ -682,25 +726,12 @@ void DiveLogImportDialog::on_buttonBox_accepted()
sample->tts.seconds *= 60;
}
} else {
- parse_csv_file(fileNames[i].toUtf8().data(),
- r.indexOf(tr("Sample time")),
- r.indexOf(tr("Sample depth")),
- r.indexOf(tr("Sample temperature")),
- r.indexOf(tr("Sample pO₂")),
- r.indexOf(tr("Sample sensor1 pO₂")),
- r.indexOf(tr("Sample sensor2 pO₂")),
- r.indexOf(tr("Sample sensor3 pO₂")),
- r.indexOf(tr("Sample CNS")),
- r.indexOf(tr("Sample NDL")),
- r.indexOf(tr("Sample TTS")),
- r.indexOf(tr("Sample stopdepth")),
- r.indexOf(tr("Sample pressure")),
- r.indexOf(tr("Sample setpoint")),
- ui->CSVSeparator->currentIndex(),
- specialCSV.contains(ui->knownImports->currentIndex()) ? CSVApps[ui->knownImports->currentIndex()].name.toUtf8().data() : "csv",
- ui->CSVUnits->currentIndex(),
- ui->knownImports->currentText().prepend("\"").append("\"").toUtf8().data()
- );
+ char *params[37];
+ int pnr = 0;
+
+ pnr = setup_csv_params(r, params, pnr);
+ parse_csv_file(fileNames[i].toUtf8().data(), params, pnr - 1,
+ specialCSV.contains(ui->knownImports->currentIndex()) ? CSVApps[ui->knownImports->currentIndex()].name.toUtf8().data() : "csv");
}
}
} else {
@@ -761,26 +792,14 @@ void DiveLogImportDialog::on_buttonBox_accepted()
params[pnr++] = NULL;
parse_manual_file(fileNames[i].toUtf8().data(), params, pnr - 1);
- } else
- parse_csv_file(fileNames[i].toUtf8().data(),
- r.indexOf(tr("Sample time")),
- r.indexOf(tr("Sample depth")),
- r.indexOf(tr("Sample temperature")),
- r.indexOf(tr("Sample pO₂")),
- r.indexOf(tr("Sample sensor1 pO₂")),
- r.indexOf(tr("Sample sensor2 pO₂")),
- r.indexOf(tr("Sample sensor3 pO₂")),
- r.indexOf(tr("Sample CNS")),
- r.indexOf(tr("Sample NDL")),
- r.indexOf(tr("Sample TTS")),
- r.indexOf(tr("Sample stopdepth")),
- r.indexOf(tr("Sample pressure")),
- r.indexOf(tr("Sample setpoint")),
- ui->CSVSeparator->currentIndex(),
- specialCSV.contains(ui->knownImports->currentIndex()) ? CSVApps[ui->knownImports->currentIndex()].name.toUtf8().data() : "csv",
- ui->CSVUnits->currentIndex(),
- ui->knownImports->currentText().prepend("\"").append("\"").toUtf8().data()
- );
+ } else {
+ char *params[37];
+ int pnr = 0;
+
+ pnr = setup_csv_params(r, params, pnr);
+ parse_csv_file(fileNames[i].toUtf8().data(), params, pnr - 1,
+ specialCSV.contains(ui->knownImports->currentIndex()) ? CSVApps[ui->knownImports->currentIndex()].name.toUtf8().data() : "csv");
+ }
}
}
diff --git a/qt-ui/divelogimportdialog.h b/qt-ui/divelogimportdialog.h
index 9840c94d1..03bb14029 100644
--- a/qt-ui/divelogimportdialog.h
+++ b/qt-ui/divelogimportdialog.h
@@ -86,6 +86,7 @@ slots:
void loadFileContentsSeperatorSelected(int value);
void loadFileContentsKnownTypesSelected(int value);
void loadFileContents(int value, enum whatChanged triggeredBy);
+ int setup_csv_params(QStringList r, char **params, int pnr);
private:
bool selector;