Index: trunk/rtcm3torinex/lib/rtcm3torinex.c
===================================================================
--- trunk/rtcm3torinex/lib/rtcm3torinex.c	(revision 4366)
+++ trunk/rtcm3torinex/lib/rtcm3torinex.c	(revision 4367)
@@ -227,5 +227,6 @@
 static const int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
 static const struct leapseconds leap[] = {
-/*{31, 12, 1971, 11},*/
+/*{31, 12, 1971, 10},*/
+/*{30, 06, 1972, 11},*/
 /*{31, 12, 1972, 12},*/
 /*{31, 12, 1973, 13},*/
@@ -904,11 +905,11 @@
       }
       break;
-    case 1071: case 1081: case 1091:
-    case 1072: case 1082: case 1092:
-    case 1073: case 1083: case 1093:
-    case 1074: case 1084: case 1094:
-    case 1075: case 1085: case 1095:
-    case 1076: case 1086: case 1096:
-    case 1077: case 1087: case 1097:
+    case 1071: case 1081: case 1091: case 1101: case 1111: case 1121:
+    case 1072: case 1082: case 1092: case 1102: case 1112: case 1122:
+    case 1073: case 1083: case 1093: case 1103: case 1113: case 1123:
+    case 1074: case 1084: case 1094: case 1104: case 1114: case 1124:
+    case 1075: case 1085: case 1095: case 1105: case 1115: case 1125:
+    case 1076: case 1086: case 1096: case 1106: case 1116: case 1126:
+    case 1077: case 1087: case 1097: case 1107: case 1117: case 1127:
       if(handle->GPSWeek)
       {
@@ -967,10 +968,10 @@
           {0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0},
-          {GNSSENTRY_C1DATA,GNSSENTRY_L1CDATA,GNSSENTRY_D1CDATA,
-          GNSSENTRY_S1CDATA,GNSSDF2_LOCKLOSSL1,0.0,"1S"},
-          {GNSSENTRY_C1DATA,GNSSENTRY_L1CDATA,GNSSENTRY_D1CDATA,
-          GNSSENTRY_S1CDATA,GNSSDF2_LOCKLOSSL1,0.0,"1L"},
-          {GNSSENTRY_C1DATA,GNSSENTRY_L1CDATA,GNSSENTRY_D1CDATA,
-          GNSSENTRY_S1CDATA,GNSSDF2_LOCKLOSSL1,0.0,"1X"}
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1S"},
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1L"},
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1X"}
         };
         /* NOTE: Uses 0.0, 1.0 for wavelength as sat index dependence is done later! */
@@ -1059,4 +1060,90 @@
           {GNSSENTRY_C5DATA,GNSSENTRY_L5DATA,GNSSENTRY_D5DATA,
           GNSSENTRY_S5DATA,GNSSDF2_LOCKLOSSL5,GAL_WAVELENGTH_E5A,"5X"}/**/,
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+        };
+        struct CodeData qzss[RTCM3_MSM_NUMSIG] =
+        {
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_C1DATA,GNSSENTRY_L1CDATA,GNSSENTRY_D1CDATA,
+          GNSSENTRY_S1CDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1C"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_CSAIFDATA,GNSSENTRY_LSAIFDATA,GNSSENTRY_DSAIFDATA,
+          GNSSENTRY_SSAIFDATA,GNSSDF2_LOCKLOSSSAIF,GPS_WAVELENGTH_L1,"1Z"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_CLEXDATA,GNSSENTRY_LLEXDATA,GNSSENTRY_DLEXDATA,
+          GNSSENTRY_SLEXDATA,GNSSDF2_LOCKLOSSLEX,QZSS_WAVELENGTH_LEX,"6S"},
+          {GNSSENTRY_CLEXDATA,GNSSENTRY_LLEXDATA,GNSSENTRY_DLEXDATA,
+          GNSSENTRY_SLEXDATA,GNSSDF2_LOCKLOSSLEX,QZSS_WAVELENGTH_LEX,"6L"},
+          {GNSSENTRY_CLEXDATA,GNSSENTRY_LLEXDATA,GNSSENTRY_DLEXDATA,
+          GNSSENTRY_SLEXDATA,GNSSDF2_LOCKLOSSLEX,QZSS_WAVELENGTH_LEX,"6X"},
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1D"},
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1P"},
+          {GNSSENTRY_C1NDATA,GNSSENTRY_L1NDATA,GNSSENTRY_D1NDATA,
+          GNSSENTRY_S1NDATA,GNSSDF2_LOCKLOSSL1,GPS_WAVELENGTH_L1,"1X"},
+          {GNSSENTRY_C2DATA,GNSSENTRY_L2CDATA,GNSSENTRY_D2CDATA,
+          GNSSENTRY_S2CDATA,GNSSDF2_LOCKLOSSL2,GPS_WAVELENGTH_L2,"2S"},
+          {GNSSENTRY_C2DATA,GNSSENTRY_L2CDATA,GNSSENTRY_D2CDATA,
+          GNSSENTRY_S2CDATA,GNSSDF2_LOCKLOSSL2,GPS_WAVELENGTH_L2,"2L"},
+          {GNSSENTRY_C2DATA,GNSSENTRY_L2CDATA,GNSSENTRY_D2CDATA,
+          GNSSENTRY_S2CDATA,GNSSDF2_LOCKLOSSL2,GPS_WAVELENGTH_L2,"2X"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_C5DATA,GNSSENTRY_L5DATA,GNSSENTRY_D5DATA,
+          GNSSENTRY_S5DATA,GNSSDF2_LOCKLOSSL5,GPS_WAVELENGTH_L5,"5I"},
+          {GNSSENTRY_C5DATA,GNSSENTRY_L5DATA,GNSSENTRY_D5DATA,
+          GNSSENTRY_S5DATA,GNSSDF2_LOCKLOSSL5,GPS_WAVELENGTH_L5,"5Q"},
+          {GNSSENTRY_C5DATA,GNSSENTRY_L5DATA,GNSSENTRY_D5DATA,
+          GNSSENTRY_S5DATA,GNSSDF2_LOCKLOSSL5,GPS_WAVELENGTH_L5,"5X"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0}
+        };
+        struct CodeData compass[RTCM3_MSM_NUMSIG] =
+        {
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_CB1DATA,GNSSENTRY_LB1DATA,GNSSENTRY_DB1DATA,
+          GNSSENTRY_SB1DATA,GNSSDF2_LOCKLOSSB1,COMPASS_WAVELENGTH_B1,"2I"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_CB3DATA,GNSSENTRY_LB3DATA,GNSSENTRY_DB3DATA,
+          GNSSENTRY_SB3DATA,GNSSDF2_LOCKLOSSB3,COMPASS_WAVELENGTH_B3,"6I"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {GNSSENTRY_CB2DATA,GNSSENTRY_LB2DATA,GNSSENTRY_DB2DATA,
+          GNSSENTRY_SB2DATA,GNSSDF2_LOCKLOSSB2,COMPASS_WAVELENGTH_B2,"7I"},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
+          {0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0},
           {0,0,0,0,0,0,0},
@@ -1082,5 +1169,11 @@
 
         SKIPBITS(12)
-        if(type >= 1091)
+        if(type >= 1121)
+          sys = RTCM3_MSM_COMPASS;
+        else if(type >= 1111)
+          sys = RTCM3_MSM_QZSS;
+        else if(type >= 1101)
+          sys = RTCM3_MSM_SBAS;
+        else if(type >= 1091)
           sys = RTCM3_MSM_GALILEO;
         else if(type >= 1081)
@@ -1089,5 +1182,8 @@
         switch(sys)
         {
+        case RTCM3_MSM_COMPASS:
         case RTCM3_MSM_GALILEO: /* use DF004 instead of DF248 */
+        case RTCM3_MSM_QZSS:
+        case RTCM3_MSM_SBAS:
         case RTCM3_MSM_GPS:
           GETBITS(i,30)
@@ -1284,5 +1380,14 @@
               switch(sys)
               {
-              case RTCM3_MSM_GPS: cd = gps[RTCM3_MSM_NUMSIG-j-1];
+              case RTCM3_MSM_QZSS:
+                cd = qzss[RTCM3_MSM_NUMSIG-j-1];
+                wl = cd.wl;
+                break;
+              case RTCM3_MSM_COMPASS:
+                cd = compass[RTCM3_MSM_NUMSIG-j-1];
+                wl = cd.wl;
+                break;
+              case RTCM3_MSM_GPS:  case RTCM3_MSM_SBAS:
+                cd = gps[RTCM3_MSM_NUMSIG-j-1];
                 wl = cd.wl;
                 break;
@@ -1323,4 +1428,6 @@
                 if(num == gnss->numsats)
                   gnss->satellites[gnss->numsats++] = fullsat;
+
+                gnss->codetype[num] = cd.code;
 
                 switch(type % 10)
@@ -1518,4 +1625,6 @@
   const char *typesofobsS; /* should not be modified outside */
   const char *typesofobsE; /* should not be modified outside */
+  const char *typesofobsC; /* should not be modified outside */
+  const char *typesofobsJ; /* should not be modified outside */
   const char *timeoffirstobs; /* should not be modified outside */
 };
@@ -1602,7 +1711,7 @@
   return 1+snprintf(buffer, buffersize,
   rinex3 ?
-  "RTCM3TORINEX %-7.7s%-20.20s%04d%02d%02d %02d%02d%02d UTC "
+  "RTCM3TOR. %-10.10s%-20.20s%04d%02d%02d %02d%02d%02d UTC "
   "PGM / RUN BY / DATE" :
-  "RTCM3TORINEX %-7.7s%-20.20s%04d-%02d-%02d %02d:%02d    "
+  "RTCM3TOR. %-10.10s%-20.20s%04d-%02d-%02d %02d:%02d    "
   "PGM / RUN BY / DATE", revisionstr, user, 1900+t2->tm_year,
   t2->tm_mon+1, t2->tm_mday, t2->tm_hour, t2->tm_min, t2->tm_sec);
@@ -1705,12 +1814,12 @@
     CHECKFLAGS(D5,D5)
     CHECKFLAGS(S5,S5)
-    CHECKFLAGS(C5AB,C5AB)
-    CHECKFLAGS(L5AB,L5AB)
-    CHECKFLAGS(D5AB,D5AB)
-    CHECKFLAGS(S5AB,S5AB)
-    CHECKFLAGS(C5B,C5B)
-    CHECKFLAGS(L5B,L5B)
-    CHECKFLAGS(D5B,D5B)
-    CHECKFLAGS(S5B,S5B)
+    CHECKFLAGS(C5AB,C8)
+    CHECKFLAGS(L5AB,L8)
+    CHECKFLAGS(D5AB,D8)
+    CHECKFLAGS(S5AB,S8)
+    CHECKFLAGS(C5B,C7)
+    CHECKFLAGS(L5B,L7)
+    CHECKFLAGS(D5B,D7)
+    CHECKFLAGS(S5B,S7)
     CHECKFLAGS(C6,C6)
     CHECKFLAGS(L6,L6)
@@ -1773,4 +1882,6 @@
   "WAVELENGTH FACT L1/2";
 
+  hdata.numheaders = 18;
+
   if(Parser->rinex3)
   {
@@ -1799,4 +1910,8 @@
     CHECKFLAGSNEW(GPS, D1P, D1W)
     CHECKFLAGSNEW(GPS, S1P, S1W)
+    CHECKFLAGSNEW(GPS, C5,  C5)
+    CHECKFLAGSNEW(GPS, L5,  L5)
+    CHECKFLAGSNEW(GPS, D5,  D5)
+    CHECKFLAGSNEW(GPS, S5,  S5)
 
     hdata.data.named.typesofobsS = buffer;
@@ -1813,8 +1928,8 @@
     CHECKFLAGSNEW(GPS, D2C, D2X)
     CHECKFLAGSNEW(GPS, S2C, S2X)
-    CHECKFLAGSNEW(GPS, C5,  C5)
-    CHECKFLAGSNEW(GPS, L5,  L5)
-    CHECKFLAGSNEW(GPS, D5,  D5)
-    CHECKFLAGSNEW(GPS, S5,  S5)
+    CHECKFLAGSNEW(GPS, C1N, C1X)
+    CHECKFLAGSNEW(GPS, L1N, L1X)
+    CHECKFLAGSNEW(GPS, D1N, D1X)
+    CHECKFLAGSNEW(GPS, S1N, S1X)
 
     hdata.data.named.typesofobsG = buffer;
@@ -1884,4 +1999,71 @@
     "E  %3d%-52.52s  SYS / # / OBS TYPES", Parser->numdatatypesGAL, tbuffer);
     if(Parser->numdatatypesGAL>13)
+    {
+      i += snprintf(buffer+i-1, buffersize,
+      "\n      %-52.52s  SYS / # / OBS TYPES", tbuffer+13*4);
+    }
+    buffer += i; buffersize -= i;
+
+    tbufferpos = 0;
+
+    CHECKFLAGSNEW(COM, CB1,  C2I)
+    CHECKFLAGSNEW(COM, LB1,  L2I)
+    CHECKFLAGSNEW(COM, DB1,  D2I)
+    CHECKFLAGSNEW(COM, SB1,  S2I)
+    CHECKFLAGSNEW(COM, CB2,  C7I)
+    CHECKFLAGSNEW(COM, LB2,  L7I)
+    CHECKFLAGSNEW(COM, DB2,  D7I)
+    CHECKFLAGSNEW(COM, SB2,  S7I)
+    CHECKFLAGSNEW(COM, CB3,  C6I)
+    CHECKFLAGSNEW(COM, LB3,  L6I)
+    CHECKFLAGSNEW(COM, DB3,  D6I)
+    CHECKFLAGSNEW(COM, SB3,  S6I)
+
+    hdata.data.named.typesofobsC = buffer;
+    i = 1+snprintf(buffer, buffersize,
+    "C  %3d%-52.52s  SYS / # / OBS TYPES", Parser->numdatatypesCOM, tbuffer);
+    if(Parser->numdatatypesCOM>13)
+    {
+      i += snprintf(buffer+i-1, buffersize,
+      "\n      %-52.52s  SYS / # / OBS TYPES", tbuffer+13*4);
+    }
+    buffer += i; buffersize -= i;
+
+    tbufferpos = 0;
+
+    CHECKFLAGSNEW(QZS, C1,  C1C)
+    CHECKFLAGSNEW(QZS, L1C, L1C)
+    CHECKFLAGSNEW(QZS, D1C, D1C)
+    CHECKFLAGSNEW(QZS, S1C, S1C)
+
+    CHECKFLAGSNEW(QZS, CSAIF, C1Z)
+    CHECKFLAGSNEW(QZS, LSAIF, L1Z)
+    CHECKFLAGSNEW(QZS, DSAIF, D1Z)
+    CHECKFLAGSNEW(QZS, SSAIF, S1Z)
+
+    CHECKFLAGSNEW(QZS, C1N, C1X)
+    CHECKFLAGSNEW(QZS, L1N, L1X)
+    CHECKFLAGSNEW(QZS, D1N, D1X)
+    CHECKFLAGSNEW(QZS, S1N, S1X)
+
+    CHECKFLAGSNEW(QZS, C6, C6)
+    CHECKFLAGSNEW(QZS, L6, L6)
+    CHECKFLAGSNEW(QZS, D6, D6)
+    CHECKFLAGSNEW(QZS, S6, S6)
+
+    CHECKFLAGSNEW(QZS, C2,  C2X)
+    CHECKFLAGSNEW(QZS, L2C, L2X)
+    CHECKFLAGSNEW(QZS, D2C, D2X)
+    CHECKFLAGSNEW(QZS, S2C, S2X)
+
+    CHECKFLAGSNEW(QZS, C5,  C5)
+    CHECKFLAGSNEW(QZS, L5,  L5)
+    CHECKFLAGSNEW(QZS, D5,  D5)
+    CHECKFLAGSNEW(QZS, S5,  S5)
+
+    hdata.data.named.typesofobsJ = buffer;
+    i = 1+snprintf(buffer, buffersize,
+    "J  %3d%-52.52s  SYS / # / OBS TYPES", Parser->numdatatypesQZS, tbuffer);
+    if(Parser->numdatatypesQZS>13)
     {
       i += snprintf(buffer+i-1, buffersize,
@@ -1939,12 +2121,12 @@
     CHECKFLAGS(D5,D5)
     CHECKFLAGS(S5,S5)
-    CHECKFLAGS(C5AB,C5AB)
-    CHECKFLAGS(L5AB,L5AB)
-    CHECKFLAGS(D5AB,D5AB)
-    CHECKFLAGS(S5AB,S5AB)
-    CHECKFLAGS(C5B,C5B)
-    CHECKFLAGS(L5B,L5B)
-    CHECKFLAGS(D5B,D5B)
-    CHECKFLAGS(S5B,S5B)
+    CHECKFLAGS(C5AB,C8)
+    CHECKFLAGS(L5AB,L8)
+    CHECKFLAGS(D5AB,D8)
+    CHECKFLAGS(S5AB,S8)
+    CHECKFLAGS(C5B,C7)
+    CHECKFLAGS(L5B,L7)
+    CHECKFLAGS(D5B,D7)
+    CHECKFLAGS(S5B,S7)
     CHECKFLAGS(C6,C6)
     CHECKFLAGS(L6,L6)
@@ -1959,4 +2141,9 @@
       i += snprintf(buffer+i-1, buffersize,
       "\n      %-54.54s# / TYPES OF OBSERV", tbuffer+9*6);
+    }
+    if(Parser->numdatatypesGPS>18)
+    {
+      i += snprintf(buffer+i-1, buffersize,
+      "\n      %-54.54s# / TYPES OF OBSERV", tbuffer+18*6);
     }
     buffer += i; buffersize -= i;
@@ -1975,6 +2162,4 @@
     buffer += i; buffersize -= i;
   }
-
-  hdata.numheaders = 15;
 
   if(Parser->headerfile)
@@ -2273,5 +2458,5 @@
           for(i = 0; i < Parser->Data.numsats; ++i)
           {
-            int glo = 0, gal = 0;
+            int glo = 0, gal = 0, qzs = 0, com = 0;
             if(Parser->Data.satellites[i] <= PRN_GPS_END)
               RTCM3Text("G%02d", Parser->Data.satellites[i]);
@@ -2294,7 +2479,19 @@
               gal = 1;
             }
-            else if(Parser->Data.satellites[i] >= PRN_WAAS_START
-            && Parser->Data.satellites[i] <= PRN_WAAS_END)
-              RTCM3Text("S%02d", Parser->Data.satellites[i] - PRN_WAAS_START+20);
+            else if(Parser->Data.satellites[i] >= PRN_QZSS_START
+            && Parser->Data.satellites[i] <= PRN_QZSS_END)
+            {
+              RTCM3Text("J%02d", Parser->Data.satellites[i] - (PRN_QZSS_START-1));
+              qzs = 1;
+            }
+            else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
+            && Parser->Data.satellites[i] <= PRN_COMPASS_END)
+            {
+              RTCM3Text("C%02d", Parser->Data.satellites[i] - (PRN_COMPASS_START-1));
+              com = 1;
+            }
+            else if(Parser->Data.satellites[i] >= PRN_SBAS_START
+            && Parser->Data.satellites[i] <= PRN_SBAS_END)
+              RTCM3Text("S%02d", Parser->Data.satellites[i] - PRN_SBAS_START+20);
             else
               RTCM3Text("%3d", Parser->Data.satellites[i]);
@@ -2384,4 +2581,79 @@
               }
             }
+            else if(com)
+            {
+              for(j = 0; j < Parser->numdatatypesCOM; ++j)
+              {
+                int df = Parser->dataflagCOM[j];
+                int pos = Parser->dataposCOM[j];
+                if((Parser->Data.dataflags[i] & df)
+                && !isnan(Parser->Data.measdata[i][pos])
+                && !isinf(Parser->Data.measdata[i][pos]))
+                {
+                  char lli = ' ';
+                  char snr = ' ';
+                  if(df & GNSSDF_LB1DATA)
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSB1)
+                      lli = '1';
+                  }
+                  if(df & GNSSDF_LB2DATA)
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSB2)
+                      lli = '1';
+                  }
+                  if(df & GNSSDF_LB3DATA)
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSB3)
+                      lli = '1';
+                  }
+                  RTCM3Text("%14.3f%c%c",
+                  Parser->Data.measdata[i][pos],lli,snr);
+                }
+                else
+                { /* no or illegal data */
+                  RTCM3Text("                ");
+                }
+              }
+            }
+            else if(qzs)
+            {
+              for(j = 0; j < Parser->numdatatypesQZS; ++j)
+              {
+                int df = Parser->dataflagQZS[j];
+                int pos = Parser->dataposQZS[j];
+                if((Parser->Data.dataflags[i] & df)
+                && !isnan(Parser->Data.measdata[i][pos])
+                && !isinf(Parser->Data.measdata[i][pos]))
+                {
+                  char lli = ' ';
+                  char snr = ' ';
+                  if(df & GNSSDF_L1CDATA)
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSL1)
+                      lli = '1';
+                    snr = '0'+Parser->Data.snrL1[i];
+                  }
+                  if(df & (GNSSDF_L2CDATA|GNSSDF_L2PDATA))
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSL2)
+                      lli = '1';
+                    snr = '0'+Parser->Data.snrL2[i];
+                  }
+                  if(df & GNSSDF_L5DATA)
+                  {
+                    if(Parser->Data.dataflags2[i] & GNSSDF2_LOCKLOSSL5)
+                      lli = '1';
+                    snr = ' ';
+                  }
+                  RTCM3Text("%14.3f%c%c",
+                  Parser->Data.measdata[i][pos],lli,snr);
+                }
+                else
+                { /* no or illegal data */
+                  RTCM3Text("                ");
+                }
+              }
+            }
             else
             {
@@ -2439,8 +2711,8 @@
               RTCM3Text("R%02d", Parser->Data.satellites[i]
               - (PRN_GLONASS_START-1));
-            else if(Parser->Data.satellites[i] >= PRN_WAAS_START
-            && Parser->Data.satellites[i] <= PRN_WAAS_END)
+            else if(Parser->Data.satellites[i] >= PRN_SBAS_START
+            && Parser->Data.satellites[i] <= PRN_SBAS_END)
               RTCM3Text("S%02d", Parser->Data.satellites[i]
-              - PRN_WAAS_START+20);
+              - PRN_SBAS_START+20);
             else if(Parser->Data.satellites[i] >= PRN_GALILEO_START
             && Parser->Data.satellites[i] <= PRN_GALILEO_END)
@@ -2451,4 +2723,12 @@
               RTCM3Text("E%02d", Parser->Data.satellites[i]
               - (PRN_GIOVE_START-PRN_GIOVE_OFFSET));
+            else if(Parser->Data.satellites[i] >= PRN_QZSS_START
+            && Parser->Data.satellites[i] <= PRN_QZSS_END)
+              RTCM3Text("J%02d", Parser->Data.satellites[i]
+              - (PRN_QZSS_START-1));
+            else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
+            && Parser->Data.satellites[i] <= PRN_COMPASS_END)
+              RTCM3Text("C%02d", Parser->Data.satellites[i]
+              - (PRN_COMPASS_START-1));
             else
               RTCM3Text("%3d", Parser->Data.satellites[i]);
@@ -2468,8 +2748,8 @@
                 RTCM3Text("R%02d", Parser->Data.satellites[i]
                 - (PRN_GLONASS_START-1));
-              else if(Parser->Data.satellites[i] >= PRN_WAAS_START
-              && Parser->Data.satellites[i] <= PRN_WAAS_END)
+              else if(Parser->Data.satellites[i] >= PRN_SBAS_START
+              && Parser->Data.satellites[i] <= PRN_SBAS_END)
                 RTCM3Text("S%02d", Parser->Data.satellites[i]
-                - PRN_WAAS_START+20);
+                - PRN_SBAS_START+20);
               else if(Parser->Data.satellites[i] >= PRN_GALILEO_START
               && Parser->Data.satellites[i] <= PRN_GALILEO_END)
@@ -2480,4 +2760,12 @@
                 RTCM3Text("E%02d", Parser->Data.satellites[i]
                 - (PRN_GIOVE_START-PRN_GIOVE_OFFSET));
+              else if(Parser->Data.satellites[i] >= PRN_QZSS_START
+              && Parser->Data.satellites[i] <= PRN_QZSS_END)
+                RTCM3Text("J%02d", Parser->Data.satellites[i]
+                - (PRN_QZSS_START-1));
+              else if(Parser->Data.satellites[i] >= PRN_COMPASS_START
+              && Parser->Data.satellites[i] <= PRN_COMPASS_END)
+                RTCM3Text("C%02d", Parser->Data.satellites[i]
+                - (PRN_COMPASS_START-1));
               else
                 RTCM3Text("%3d", Parser->Data.satellites[i]);
Index: trunk/rtcm3torinex/lib/rtcm3torinex.h
===================================================================
--- trunk/rtcm3torinex/lib/rtcm3torinex.h	(revision 4366)
+++ trunk/rtcm3torinex/lib/rtcm3torinex.h	(revision 4367)
@@ -36,8 +36,12 @@
 #define PRN_GALILEO_START         71
 #define PRN_GALILEO_END           100
-#define PRN_WAAS_START            120
-#define PRN_WAAS_END              138
+#define PRN_SBAS_START            120
+#define PRN_SBAS_END              138
 #define PRN_GIOVE_START           139
 #define PRN_GIOVE_END             140
+#define PRN_COMPASS_START         141
+#define PRN_COMPASS_END           170
+#define PRN_QZSS_START            193
+#define PRN_QZSS_END              202
 
 #define PRN_GLONASS_NUM           (PRN_GLONASS_END-PRN_GLONASS_START+1)
@@ -51,58 +55,106 @@
 #define RTCM3_MSM_GLONASS PRN_GLONASS_START
 #define RTCM3_MSM_GALILEO PRN_GALILEO_START
-
-#define GNSSENTRY_C1DATA     0
-#define GNSSENTRY_C2DATA     1
-#define GNSSENTRY_P1DATA     2
-#define GNSSENTRY_P2DATA     3
-#define GNSSENTRY_L1CDATA    4
-#define GNSSENTRY_L1PDATA    5
-#define GNSSENTRY_L2CDATA    6
-#define GNSSENTRY_L2PDATA    7
-#define GNSSENTRY_D1CDATA    8
-#define GNSSENTRY_D1PDATA    9
-#define GNSSENTRY_D2CDATA    10
-#define GNSSENTRY_D2PDATA    11
-#define GNSSENTRY_S1CDATA    12
-#define GNSSENTRY_S1PDATA    13
-#define GNSSENTRY_S2CDATA    14
-#define GNSSENTRY_S2PDATA    15
-
-#define GNSSENTRY_C5DATA     16
-#define GNSSENTRY_L5DATA     17
-#define GNSSENTRY_D5DATA     18
-#define GNSSENTRY_S5DATA     19
-#define GNSSENTRY_C6DATA     20
-#define GNSSENTRY_L6DATA     21
-#define GNSSENTRY_D6DATA     22
-#define GNSSENTRY_S6DATA     23
-#define GNSSENTRY_C5BDATA    24
-#define GNSSENTRY_L5BDATA    25
-#define GNSSENTRY_D5BDATA    26
-#define GNSSENTRY_S5BDATA    27
-#define GNSSENTRY_C5ABDATA   28
-#define GNSSENTRY_L5ABDATA   29
-#define GNSSENTRY_D5ABDATA   30
-#define GNSSENTRY_S5ABDATA   31
-
-#define GNSSENTRY_NUMBER     32 /* number of types!!! */
+#define RTCM3_MSM_SBAS    PRN_SBAS_START
+#define RTCM3_MSM_QZSS    PRN_QZSS_START
+#define RTCM3_MSM_COMPASS PRN_COMPASS_START
+
+#define GNSSENTRY_CODE    0
+#define GNSSENTRY_PHASE   1
+#define GNSSENTRY_DOPPLER 2
+#define GNSSENTRY_SNR     3
+
+#define GNSSENTRY_C1DATA     ((0<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L1CDATA    ((0<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D1CDATA    ((0<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S1CDATA    ((0<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_C2DATA     ((1<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L2CDATA    ((1<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D2CDATA    ((1<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S2CDATA    ((1<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_CB1DATA    GNSSENTRY_C2DATA
+#define GNSSENTRY_LB1DATA    GNSSENTRY_L2CDATA
+#define GNSSENTRY_DB1DATA    GNSSENTRY_D2CDATA
+#define GNSSENTRY_SB1DATA    GNSSENTRY_S2CDATA
+
+#define GNSSENTRY_P1DATA     ((2<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L1PDATA    ((2<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D1PDATA    ((2<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S1PDATA    ((2<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_P2DATA     ((3<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L2PDATA    ((3<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D2PDATA    ((3<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S2PDATA    ((3<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_C5DATA     ((4<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L5DATA     ((4<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D5DATA     ((4<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S5DATA     ((4<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_C6DATA     ((5<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L6DATA     ((5<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D6DATA     ((5<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S6DATA     ((5<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_CB3DATA    GNSSENTRY_C6DATA
+#define GNSSENTRY_LB3DATA    GNSSENTRY_L6DATA
+#define GNSSENTRY_DB3DATA    GNSSENTRY_D6DATA
+#define GNSSENTRY_SB3DATA    GNSSENTRY_S6DATA
+
+#define GNSSENTRY_CLEXDATA   GNSSENTRY_C6DATA
+#define GNSSENTRY_LLEXDATA   GNSSENTRY_L6DATA
+#define GNSSENTRY_DLEXDATA   GNSSENTRY_D6DATA
+#define GNSSENTRY_SLEXDATA   GNSSENTRY_S6DATA
+
+#define GNSSENTRY_C5BDATA    ((6<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L5BDATA    ((6<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D5BDATA    ((6<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S5BDATA    ((6<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_CB2DATA    GNSSENTRY_C5BDATA
+#define GNSSENTRY_LB2DATA    GNSSENTRY_L5BDATA
+#define GNSSENTRY_DB2DATA    GNSSENTRY_D5BDATA
+#define GNSSENTRY_SB2DATA    GNSSENTRY_S5BDATA
+
+#define GNSSENTRY_C5ABDATA   ((7<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L5ABDATA   ((7<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D5ABDATA   ((7<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S5ABDATA   ((7<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_CSAIFDATA  ((8<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_LSAIFDATA  ((8<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_DSAIFDATA  ((8<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_SSAIFDATA  ((8<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_C1NDATA    ((8<<2)+GNSSENTRY_CODE)
+#define GNSSENTRY_L1NDATA    ((8<<2)+GNSSENTRY_PHASE)
+#define GNSSENTRY_D1NDATA    ((8<<2)+GNSSENTRY_DOPPLER)
+#define GNSSENTRY_S1NDATA    ((8<<2)+GNSSENTRY_SNR)
+
+#define GNSSENTRY_NUMBER     40 /* number of types!!! */
 
 /* Data flags. These flags are used in the dataflags field of gpsdata structure
    and are required to determine, which data fields are filled with valid data. */
 #define GNSSDF_C1DATA         (1<<GNSSENTRY_C1DATA)
+#define GNSSDF_L1CDATA        (1<<GNSSENTRY_L1CDATA)
+#define GNSSDF_D1CDATA        (1<<GNSSENTRY_D1CDATA)
+#define GNSSDF_S1CDATA        (1<<GNSSENTRY_S1CDATA)
 #define GNSSDF_C2DATA         (1<<GNSSENTRY_C2DATA)
+#define GNSSDF_L2CDATA        (1<<GNSSENTRY_L2CDATA)
+#define GNSSDF_D2CDATA        (1<<GNSSENTRY_D2CDATA)
+#define GNSSDF_S2CDATA        (1<<GNSSENTRY_S2CDATA)
+#define GNSSDF_CB1DATA        (1<<GNSSENTRY_CB1DATA)
+#define GNSSDF_LB1DATA        (1<<GNSSENTRY_LB1DATA)
+#define GNSSDF_DB1DATA        (1<<GNSSENTRY_DB1DATA)
+#define GNSSDF_SB1DATA        (1<<GNSSENTRY_SB1DATA)
 #define GNSSDF_P1DATA         (1<<GNSSENTRY_P1DATA)
+#define GNSSDF_L1PDATA        (1<<GNSSENTRY_L1PDATA)
+#define GNSSDF_D1PDATA        (1<<GNSSENTRY_D1PDATA)
+#define GNSSDF_S1PDATA        (1<<GNSSENTRY_S1PDATA)
 #define GNSSDF_P2DATA         (1<<GNSSENTRY_P2DATA)
-#define GNSSDF_L1CDATA        (1<<GNSSENTRY_L1CDATA)
-#define GNSSDF_L1PDATA        (1<<GNSSENTRY_L1PDATA)
-#define GNSSDF_L2CDATA        (1<<GNSSENTRY_L2CDATA)
 #define GNSSDF_L2PDATA        (1<<GNSSENTRY_L2PDATA)
-#define GNSSDF_D1CDATA        (1<<GNSSENTRY_D1CDATA)
-#define GNSSDF_D1PDATA        (1<<GNSSENTRY_D1PDATA)
-#define GNSSDF_D2CDATA        (1<<GNSSENTRY_D2CDATA)
 #define GNSSDF_D2PDATA        (1<<GNSSENTRY_D2PDATA)
-#define GNSSDF_S1CDATA        (1<<GNSSENTRY_S1CDATA)
-#define GNSSDF_S1PDATA        (1<<GNSSENTRY_S1PDATA)
-#define GNSSDF_S2CDATA        (1<<GNSSENTRY_S2CDATA)
 #define GNSSDF_S2PDATA        (1<<GNSSENTRY_S2PDATA)
 
@@ -115,12 +167,30 @@
 #define GNSSDF_D6DATA         (1<<GNSSENTRY_D6DATA)
 #define GNSSDF_S6DATA         (1<<GNSSENTRY_S6DATA)
+#define GNSSDF_CB3DATA        (1<<GNSSENTRY_CB3DATA)
+#define GNSSDF_LB3DATA        (1<<GNSSENTRY_LB3DATA)
+#define GNSSDF_DB3DATA        (1<<GNSSENTRY_DB3DATA)
+#define GNSSDF_SB3DATA        (1<<GNSSENTRY_SB3DATA)
 #define GNSSDF_C5BDATA        (1<<GNSSENTRY_C5BDATA)
 #define GNSSDF_L5BDATA        (1<<GNSSENTRY_L5BDATA)
 #define GNSSDF_D5BDATA        (1<<GNSSENTRY_D5BDATA)
 #define GNSSDF_S5BDATA        (1<<GNSSENTRY_S5BDATA)
+#define GNSSDF_CB2DATA        (1<<GNSSENTRY_CB2DATA)
+#define GNSSDF_LB2DATA        (1<<GNSSENTRY_LB2DATA)
+#define GNSSDF_DB2DATA        (1<<GNSSENTRY_DB2DATA)
+#define GNSSDF_SB2DATA        (1<<GNSSENTRY_SB2DATA)
 #define GNSSDF_C5ABDATA       (1<<GNSSENTRY_C5ABDATA)
 #define GNSSDF_L5ABDATA       (1<<GNSSENTRY_L5ABDATA)
 #define GNSSDF_D5ABDATA       (1<<GNSSENTRY_D5ABDATA)
 #define GNSSDF_S5ABDATA       (1<<GNSSENTRY_S5ABDATA)
+
+#define GNSSDF_CSAIFDATA      (1LL<<GNSSENTRY_CSAIFDATA)
+#define GNSSDF_LSAIFDATA      (1LL<<GNSSENTRY_LSAIFDATA)
+#define GNSSDF_DSAIFDATA      (1LL<<GNSSENTRY_DSAIFDATA)
+#define GNSSDF_SSAIFDATA      (1LL<<GNSSENTRY_SSAIFDATA)
+
+#define GNSSDF_C1NDATA        (1LL<<GNSSENTRY_C1NDATA)
+#define GNSSDF_L1NDATA        (1LL<<GNSSENTRY_L1NDATA)
+#define GNSSDF_D1NDATA        (1LL<<GNSSENTRY_D1NDATA)
+#define GNSSDF_S1NDATA        (1LL<<GNSSENTRY_S1NDATA)
 
 #define RINEXENTRY_C1DATA     0
@@ -143,12 +213,12 @@
 #define RINEXENTRY_D6DATA     16
 #define RINEXENTRY_S6DATA     17
-#define RINEXENTRY_C5BDATA    18
-#define RINEXENTRY_L5BDATA    19
-#define RINEXENTRY_D5BDATA    20
-#define RINEXENTRY_S5BDATA    21
-#define RINEXENTRY_C5ABDATA   22
-#define RINEXENTRY_L5ABDATA   23
-#define RINEXENTRY_D5ABDATA   24
-#define RINEXENTRY_S5ABDATA   25
+#define RINEXENTRY_C7DATA    18 /* 5B */
+#define RINEXENTRY_L7DATA    19
+#define RINEXENTRY_D7DATA    20
+#define RINEXENTRY_S7DATA    21
+#define RINEXENTRY_C8DATA    22 /* 5AB */
+#define RINEXENTRY_L8DATA    23
+#define RINEXENTRY_D8DATA    24
+#define RINEXENTRY_S8DATA    25
 
 #define RINEXENTRY_NUMBER     26
@@ -182,4 +252,20 @@
 #define GAL_WAVELENGTH_E6     (LIGHTSPEED / GAL_FREQU_E6) /* m */
 
+#define QZSS_FREQU_L1       1575420000.0  /* Hz */
+#define QZSS_FREQU_L2       1227600000.0  /* Hz */
+#define QZSS_FREQU_L5       1176450000.0  /* Hz */
+#define QZSS_FREQU_LEX      1278750000.0 /* Hz */
+#define QZSS_WAVELENGTH_L1  (LIGHTSPEED / QZSS_FREQU_L1) /* m */
+#define QZSS_WAVELENGTH_L2  (LIGHTSPEED / QZSS_FREQU_L2) /* m */
+#define QZSS_WAVELENGTH_L5  (LIGHTSPEED / QZSS_FREQU_L5) /* m */
+#define QZSS_WAVELENGTH_LEX (LIGHTSPEED / QZSS_FREQU_LEX) /* m */
+
+#define COMPASS_FREQU_B1       1561098000.0  /* Hz */
+#define COMPASS_FREQU_B2       1207140000.0  /* Hz */
+#define COMPASS_FREQU_B3       1268520000.0  /* Hz */
+#define COMPASS_WAVELENGTH_B1  (LIGHTSPEED / COMPASS_FREQU_B1) /* m */
+#define COMPASS_WAVELENGTH_B2  (LIGHTSPEED / COMPASS_FREQU_B2) /* m */
+#define COMPASS_WAVELENGTH_B3  (LIGHTSPEED / COMPASS_FREQU_B3) /* m */
+
 #define PRN_GIOVE_OFFSET 51
 
@@ -192,4 +278,9 @@
 #define GNSSDF2_LOCKLOSSE5B    (1<<5)  /* lost lock on E5B */
 #define GNSSDF2_LOCKLOSSE5AB   (1<<6)  /* lost lock on E5AB */
+#define GNSSDF2_LOCKLOSSB1     GNSSDF2_LOCKLOSSL2
+#define GNSSDF2_LOCKLOSSB2     GNSSDF2_LOCKLOSSE5B
+#define GNSSDF2_LOCKLOSSB3     GNSSDF2_LOCKLOSSE6
+#define GNSSDF2_LOCKLOSSLEX    GNSSDF2_LOCKLOSSE6
+#define GNSSDF2_LOCKLOSSSAIF   (1<<9)  /* lost lock on SAIF signal */
 
 #define UINT64(c) c ## ULL
@@ -210,9 +301,10 @@
   double timeofweek;         /* milliseconds in GPS week */
   double measdata[GNSS_MAXSATS][GNSSENTRY_NUMBER];  /* data fields */ 
-  unsigned int dataflags[GNSS_MAXSATS];      /* GNSSDF_xxx */
+  unsigned long long dataflags[GNSS_MAXSATS];      /* GNSSDF_xxx */
   unsigned int dataflags2[GNSS_MAXSATS];     /* GNSSDF2_xxx */
   int    satellites[GNSS_MAXSATS];     /* SV - IDs */
-  int    snrL1[GNSS_MAXSATS];          /* Important: all the 5 SV-specific fields must */
+  int    snrL1[GNSS_MAXSATS];          /* Important: all the 6 SV-specific fields must */
   int    snrL2[GNSS_MAXSATS];          /* have the same SV-order */
+  const char * codetype[GNSS_MAXSATS]; 
 };
 
@@ -352,15 +444,21 @@
 #endif /* NO_RTCM3_MAIN */
   int    datapos[RINEXENTRY_NUMBER];
-  int    dataflag[RINEXENTRY_NUMBER];
+  long long dataflag[RINEXENTRY_NUMBER];
   /* for RINEX2 GPS and GLO are both handled in GPS */
   int    dataposGPS[RINEXENTRY_NUMBER]; /* SBAS has same entries */
-  int    dataflagGPS[RINEXENTRY_NUMBER];
+  long long dataflagGPS[RINEXENTRY_NUMBER];
   int    dataposGLO[RINEXENTRY_NUMBER]; /* only used for RINEX3 */
-  int    dataflagGLO[RINEXENTRY_NUMBER];
+  long long dataflagGLO[RINEXENTRY_NUMBER];
   int    dataposGAL[RINEXENTRY_NUMBER]; /* only used for RINEX3 */
-  int    dataflagGAL[RINEXENTRY_NUMBER];
+  long long dataflagGAL[RINEXENTRY_NUMBER];
+  int    dataposQZS[RINEXENTRY_NUMBER]; /* only used for RINEX3 */
+  long long dataflagQZS[RINEXENTRY_NUMBER];
+  int    dataposCOM[RINEXENTRY_NUMBER]; /* only used for RINEX3 */
+  long long dataflagCOM[RINEXENTRY_NUMBER];
   int    numdatatypesGPS;
   int    numdatatypesGLO; /* only used for RINEX3 */
   int    numdatatypesGAL; /* only used for RINEX3 */
+  int    numdatatypesQZS; /* only used for RINEX3 */
+  int    numdatatypesCOM; /* only used for RINEX3 */
   int    validwarning;
   int    init;
