Index: trunk/rtcm3torinex/lib/rtcm3torinex.c
===================================================================
--- trunk/rtcm3torinex/lib/rtcm3torinex.c	(revision 6599)
+++ trunk/rtcm3torinex/lib/rtcm3torinex.c	(revision 6604)
@@ -2626,15 +2626,14 @@
     while((r = RTCM3Parser(Parser)))
     {
+      double ver = Parser->rinex3 ? 3.02 : 2.11;
       if(r == 1020 || r == RTCM3ID_BDS || r == 1019 || r == 1044 || r == 1043)
       {
         FILE *file = 0;
 
-        if(Parser->rinex3 && !(file = Parser->gpsfile))
-        {
-          const char *n = Parser->gpsephemeris ? Parser->gpsephemeris
-          : Parser->qzssephemeris ? Parser->qzssephemeris : Parser->glonassephemeris;
-          if(n)
-          {
-            if(!(Parser->gpsfile = fopen(n, "w")))
+        if(Parser->mixedephemeris)
+        {
+          if(Parser->mixedephemeris != (const char *)1)
+          {
+            if(!(Parser->mixedfile = fopen(Parser->mixedephemeris, "w")))
             {
               RTCM3Error("Could not open ephemeris output file.\n");
@@ -2643,15 +2642,12 @@
             {
               char buffer[100];
-              fprintf(Parser->gpsfile,
-              "%9.2f%11sN: GNSS NAV DATA    M: Mixed%12sRINEX VERSION / TYPE\n", 3.0, "", "");
+              fprintf(Parser->mixedfile,
+              "%9.2f%11sN: GNSS NAV DATA    M: Mixed%12sRINEX VERSION / TYPE\n", ver, "", "");
               HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
-              fprintf(Parser->gpsfile, "%s\n%60sEND OF HEADER\n", buffer, "");
-            }
-            Parser->qzssephemeris = 0;
-            Parser->gpsephemeris = 0;
-            Parser->glonassephemeris = 0;
-            Parser->sbasephemeris = 0;
-            file = Parser->gpsfile;
-          }
+              fprintf(Parser->mixedfile, "%s\n%60sEND OF HEADER\n", buffer, "");
+            }
+            Parser->mixedephemeris = (const char *)1;
+          }
+          file = Parser->mixedfile;
         }
         else
@@ -2669,5 +2665,5 @@
                 char buffer[100];
                 fprintf(Parser->glonassfile,
-                "%9.2f%11sG: GLONASS NAV DATA%21sRINEX VERSION / TYPE\n", 2.1, "", "");
+                "%9.2f%11sG: GLONASS NAV DATA%21sRINEX VERSION / TYPE\n", ver, "", "");
                 HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
                 fprintf(Parser->glonassfile, "%s\n%60sEND OF HEADER\n", buffer, "");
@@ -2689,5 +2685,5 @@
                 char buffer[100];
                 fprintf(Parser->gpsfile,
-                "%9.2f%11sN: GPS NAV DATA%25sRINEX VERSION / TYPE\n", 2.1, "", "");
+                "%9.2f%11sN: GPS NAV DATA%25sRINEX VERSION / TYPE\n", ver, "", "");
                 HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
                 fprintf(Parser->gpsfile, "%s\n%60sEND OF HEADER\n", buffer, "");
@@ -2709,5 +2705,5 @@
                 char buffer[100];
                 fprintf(Parser->sbasfile,
-                "%9.2f%11sN: SBAS NAV DATA%24sRINEX VERSION / TYPE\n", 2.1, "", "");
+                "%9.2f%11sN: SBAS NAV DATA%24sRINEX VERSION / TYPE\n", ver, "", "");
                 HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
                 fprintf(Parser->sbasfile, "%s\n%60sEND OF HEADER\n", buffer, "");
@@ -2729,5 +2725,5 @@
                 char buffer[100];
                 fprintf(Parser->qzssfile,
-                "%9.2f%11sN: QZSS NAV DATA%24sRINEX VERSION / TYPE\n", 2.1, "", "");
+                "%9.2f%11sN: QZSS NAV DATA%24sRINEX VERSION / TYPE\n", ver, "", "");
                 HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
                 fprintf(Parser->qzssfile, "%s\n%60sEND OF HEADER\n", buffer, "");
@@ -2749,5 +2745,5 @@
                 char buffer[100];
                 fprintf(Parser->bdsfile,
-                "%9.2f%11sN: BDS NAV DATA%25sRINEX VERSION / TYPE\n", 2.1, "", "");
+                "%9.2f%11sN: BDS NAV DATA%25sRINEX VERSION / TYPE\n", ver, "", "");
                 HandleRunBy(buffer, sizeof(buffer), 0, Parser->rinex3);
                 fprintf(Parser->bdsfile, "%s\n%60sEND OF HEADER\n", buffer, "");
@@ -2837,5 +2833,5 @@
               sep = "    ";
             }
-            else
+            else /* actually this is never used, as BDS is undefined for 2.x */
             {
               ConvLine(file,
@@ -3524,4 +3520,5 @@
   const char *glonassephemeris;
   const char *bdsephemeris;
+  const char *mixedephemeris;
 };
 
@@ -3544,4 +3541,5 @@
 { "glonassephemeris", required_argument, 0, 'G'},
 { "sbasephemeris",    required_argument, 0, 'B'},
+{ "mixedephemeris",   required_argument, 0, 'P'},
 { "rinex3",           no_argument,       0, '3'},
 { "changeobs",        no_argument,       0, 'O'},
@@ -3553,5 +3551,5 @@
 {0,0,0,0}};
 #endif
-#define ARGOPT "-d:s:p:r:t:f:u:E:C:G:B:Q:M:S:R:n:h3O"
+#define ARGOPT "-d:s:p:r:t:f:u:E:C:G:B:P:Q:M:S:R:n:h3O"
 
 enum MODE { HTTP = 1, RTSP = 2, NTRIP1 = 3, AUTO = 4, END };
@@ -3687,4 +3685,5 @@
   args->glonassephemeris = 0;
   args->bdsephemeris = 0;
+  args->mixedephemeris = 0;
   args->rinex3 = 0;
   args->nmea = 0;
@@ -3714,4 +3713,5 @@
     case 'G': args->glonassephemeris = optarg; break;
     case 'Q': args->qzssephemeris = optarg; break;
+    case 'P': args->mixedephemeris = optarg; break;
     case 'r': args->port = optarg; break;
     case '3': args->rinex3 = 1; break;
@@ -3769,8 +3769,19 @@
   datestr[10] = 0;
 
-  if(args->gpsephemeris && args->glonassephemeris && args->rinex3)
+  if(args->mixedephemeris && !args->rinex3)
   {
-    RTCM3Error("RINEX3 produces a combined ephemeris file, but 2 files were specified.\n"
+    RTCM3Error("RINEX2 cannot created combined ephemeris file.\n");
+    res = 0;
+  }
+  else if(args->mixedephemeris && (args->gpsephemeris || args->glonassephemeris
+  || args->bdsephemeris || args->qzssephemeris || args->sbasephemeris))
+  {
+    RTCM3Error("Combined ephemeris file specified with another one.\n"
     "Please specify only one navigation file.\n");
+    res = 0;
+  }
+  else if(args->bdsephemeris && !args->rinex3)
+  {
+    RTCM3Error("RINEX2 cannot produce BDS ephemeris.\n");
     res = 0;
   }
@@ -3791,4 +3802,5 @@
     " -Q " LONG_OPT("--qzssephemeris    ") "output file for QZSS ephemeris data\n"
     " -B " LONG_OPT("--sbasephemeris    ") "output file for SBAS ephemeris data\n"
+    " -P " LONG_OPT("--mixedephemeris   ") "output file for all ephemeris data\n"
     " -3 " LONG_OPT("--rinex3           ") "output RINEX type 3 data\n"
     " -S " LONG_OPT("--proxyhost        ") "proxy name or address\n"
@@ -3898,4 +3910,5 @@
     Parser.qzssephemeris = args.qzssephemeris;
     Parser.sbasephemeris = args.sbasephemeris;
+    Parser.mixedephemeris = args.mixedephemeris;
     Parser.rinex3 = args.rinex3;
     Parser.changeobs = args.changeobs;
Index: trunk/rtcm3torinex/lib/rtcm3torinex.h
===================================================================
--- trunk/rtcm3torinex/lib/rtcm3torinex.h	(revision 6599)
+++ trunk/rtcm3torinex/lib/rtcm3torinex.h	(revision 6604)
@@ -552,4 +552,5 @@
   const char * sbasephemeris;
   const char * bdsephemeris;
+  const char * mixedephemeris;
   FILE *       glonassfile;
   FILE *       gpsfile;
@@ -557,4 +558,5 @@
   FILE *       sbasfile;
   FILE *       bdsfile;
+  FILE *       mixedfile;
 };
 
