Use of functions in portability.c.
[gedcom-parse.git] / t / src / standalone.c
index 44483e7768bbc73a57755ea4ff82c50dea67c0aa..88b6a2854d85725b8018c6f39f61daca7617feb5 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "gedcom.h"
 #include "output.h"
+#include "portability.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -50,6 +51,7 @@ void show_help ()
   printf("  -3    Run the test parse 3 times instead of once\n");
   printf("  -b    Parse a bogus file before parsing the main file\n");
   printf("  -q    No output to standard output\n");
+  printf("  -o <outfile>  File to generate output to (def. testgedcom.out)\n");
 }
 
 Gedcom_ctxt header_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
@@ -62,7 +64,7 @@ Gedcom_ctxt header_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
 
 void header_end(Gedcom_rec rec, Gedcom_ctxt self)
 {
-  output(1, "Header end, context is %d\n", (int)self);
+  output(1, "Header end, context is %ld\n", void_ptr_to_int(self));
 }
 
 char family_xreftags[100][255];
@@ -75,8 +77,8 @@ Gedcom_ctxt family_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
   struct xref_value *xr = GEDCOM_XREF_PTR(xref);
   output(1, "Family start, xref is %s\n", xr->string);
   strcpy(family_xreftags[family_nr], xr->string);
-  xr->object = (Gedcom_ctxt)family_nr;
-  return (Gedcom_ctxt)(family_nr++);
+  xr->object = (Gedcom_ctxt)int_to_void_ptr(family_nr);
+  return (Gedcom_ctxt)int_to_void_ptr(family_nr++);
 }
 
 Gedcom_ctxt rec_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
@@ -87,7 +89,7 @@ Gedcom_ctxt rec_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
   if (! GEDCOM_IS_NULL(xref))
     xref_str = GEDCOM_XREF_PTR(xref)->string;
   output(1, "Rec %s start, xref is %s\n", tag, xref_str);
-  return (Gedcom_ctxt)tag_value;
+  return (Gedcom_ctxt)int_to_void_ptr(tag_value);
 }
 
 Gedcom_ctxt note_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
@@ -97,12 +99,13 @@ Gedcom_ctxt note_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
   output(1, "== %d %s (%d) %s (xref is %s)\n",
         level, tag, tag_value, GEDCOM_STRING(parsed_value),
         GEDCOM_XREF_PTR(xref)->string);
-  return (Gedcom_ctxt)tag_value;
+  return (Gedcom_ctxt)int_to_void_ptr(tag_value);
 }
 
 void family_end(Gedcom_rec rec, Gedcom_ctxt self)
 {
-  output(1, "Family end, xref is %s\n", family_xreftags[(int)self]);
+  output(1, "Family end, xref is %s\n",
+        family_xreftags[void_ptr_to_int(self)]);
 }
 
 Gedcom_ctxt submit_start(Gedcom_rec rec, int level, Gedcom_val xref, char *tag,
@@ -117,16 +120,18 @@ Gedcom_ctxt source_start(Gedcom_elt elt, Gedcom_ctxt parent, int level,
                         char *tag, char* raw_value,
                         int tag_value, Gedcom_val parsed_value)
 {
-  Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
-  output(1, "Source is %s (ctxt is %d, parent is %d)\n",
-        GEDCOM_STRING(parsed_value), (int) self, (int) parent);
+  Gedcom_ctxt self = (Gedcom_ctxt)(void_ptr_to_int(parent) + 1000);
+  output(1, "Source is %s (ctxt is %ld, parent is %ld)\n",
+        GEDCOM_STRING(parsed_value), void_ptr_to_int(self),
+        void_ptr_to_int(parent));
   return self;
 }
 
 void source_end(Gedcom_elt elt, Gedcom_ctxt parent, Gedcom_ctxt self,
                Gedcom_val parsed_value)
 {
-  output(1, "Source context %d in parent %d\n", (int)self, (int)parent);
+  output(1, "Source context %ld in parent %ld\n",
+        void_ptr_to_int(self), void_ptr_to_int(parent));
 }
 
 Gedcom_ctxt date_start(Gedcom_elt elt, Gedcom_ctxt parent, int level,
@@ -134,7 +139,7 @@ Gedcom_ctxt date_start(Gedcom_elt elt, Gedcom_ctxt parent, int level,
                       int tag_value, Gedcom_val parsed_value)
 {
   struct date_value dv;
-  Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
+  Gedcom_ctxt self = (Gedcom_ctxt)(void_ptr_to_int(parent) + 1000);
   dv = GEDCOM_DATE(parsed_value);
   output(1, "Contents of the date_value:\n");
   output(1, "  raw value: %s\n", raw_value);
@@ -164,7 +169,7 @@ Gedcom_ctxt age_start(Gedcom_elt elt, Gedcom_ctxt parent, int level,
                      int tag_value, Gedcom_val parsed_value)
 {
   struct age_value age;
-  Gedcom_ctxt self = (Gedcom_ctxt)((int) parent + 1000);
+  Gedcom_ctxt self = (Gedcom_ctxt)(void_ptr_to_int(parent) + 1000);
   age = GEDCOM_AGE(parsed_value);
   output(1, "Contents of the age_value:\n");
   output(1, "  raw value: %s\n", raw_value);
@@ -184,8 +189,8 @@ void default_cb(Gedcom_elt elt, Gedcom_ctxt ctxt, int level, char *tag,
   int    conv_fails = 0;
   if (raw_value)
     converted = convert_utf8_to_locale(raw_value, &conv_fails);
-  output(0, "== %d %s (%d) %s (ctxt is %d, conversion failures: %d)\n",
-        level, tag, tag_value, converted, (int)ctxt, conv_fails);
+  output(0, "== %d %s (%d) %s (ctxt is %ld, conversion failures: %d)\n",
+        level, tag, tag_value, converted, void_ptr_to_int(ctxt), conv_fails);
   total_conv_fails += conv_fails;
 }
 
@@ -227,6 +232,7 @@ int main(int argc, char* argv[])
   int run_times   = 1;
   int bogus       = 0;
   int result      = 0;
+  char* outfilename = NULL;
   char* file_name = NULL;
 
   if (argc > 1) {
@@ -260,6 +266,17 @@ int main(int argc, char* argv[])
       else if (!strncmp(argv[i], "-q", 3)) {
        output_set_quiet(1);
       }
+      else if (!strncmp(argv[i], "-o", 3)) {
+       i++;
+       if (i < argc) {
+         outfilename = argv[i];
+       }
+       else {
+         printf ("Missing output file name\n");
+         show_help();
+         exit(1);
+       }
+      }
       else if (strncmp(argv[i], "-", 1)) {
        file_name = argv[i];
        break;
@@ -287,7 +304,7 @@ int main(int argc, char* argv[])
   gedcom_set_default_callback(default_cb);
   
   subscribe_callbacks();
-  output_open();
+  output_open(outfilename);
   if (bogus) {
     output(0, "\n=== Parsing bogus file %s\n", BOGUS_FILE_NAME);
     gedcom_parse_file(BOGUS_FILE_NAME);