Ignore:
Timestamp:
2014-01-05T14:28:30+01:00 (11 years ago)
Author:
malcolmh
Message:

save

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/smed2/src/s57/S57dat.java

    r30153 r30183  
    1818        }
    1919       
    20         private enum S57subf { RCNM, RCID, EXPP, INTU, DSNM, EDTN, UPDN, UADT, ISDT, STED, PRSP, PSDN, PRED, PROF, AGEN, COMT, DSTR, AALL, NALL, NOMR, NOCR, NOGR, NOLR, NOIN, NOCN,
     20        public enum S57subf { I8RN, RCNM, RCID, EXPP, INTU, DSNM, EDTN, UPDN, UADT, ISDT, STED, PRSP, PSDN, PRED, PROF, AGEN, COMT, DSTR, AALL, NALL, NOMR, NOCR, NOGR, NOLR, NOIN, NOCN,
    2121                NOED, NOFA, HDAT, VDAT, SDAT, CSCL, DUNI, HUNI, PUNI, COUN, COMF, SOMF, PROJ, PRP1, PRP2, PRP3, PRP4, FEAS, FNOR, FPMF, RPID, RYCO, RXCO, CURP, RXVL, RYVL, PRCO, ESDT,
    2222                LSDT, DCRT, CODT, PACC, HACC, SACC, FILE, LFIL, VOLM, IMPL, SLAT, WLON, NLAT, ELON, CRCS, NAM1, NAM2, OORA, OAAC, OACO, OALL, OATY, DEFN, AUTH, RFTP, RFVL, ATLB, ATDO,
     
    2626        private static final EnumMap<S57subf, S57conv> convs = new EnumMap<S57subf, S57conv>(S57subf.class);
    2727        static {
     28                convs.put(S57subf.I8RN, new S57conv(5,2,Dom.INT));
    2829                convs.put(S57subf.RCNM, new S57conv(2,1,Dom.AN)); convs.put(S57subf.RCID, new S57conv(10,4,Dom.INT)); convs.put(S57subf.EXPP, new S57conv(1,1,Dom.AN));
    2930                convs.put(S57subf.INTU, new S57conv(1,1,Dom.INT)); convs.put(S57subf.DSNM, new S57conv(0,0,Dom.BT)); convs.put(S57subf.EDTN, new S57conv(0,0,Dom.BT));
     
    7172        }
    7273       
    73         public enum S57field { DSID, DSSI, DSPM, DSPR, DSRC, DSHT, DSAC, CATD, CATX, DDDF, DDDR, DDDI, DDOM, DDRF, DDSI, DDSC,
     74        public enum S57field { I8RI, DSID, DSSI, DSPM, DSPR, DSRC, DSHT, DSAC, CATD, CATX, DDDF, DDDR, DDDI, DDOM, DDRF, DDSI, DDSC,
    7475                FRID, FOID, ATTF, NATF, FFPC, FFPT, FSPC, FSPT, VRID, ATTV, VRPC, VRPT, SGCC, SG2D, SG3D, ARCC, AR2D, EL2D, CT2D }
    7576       
     77        private static ArrayList<S57subf> S57i8ri = new ArrayList<S57subf>(Arrays.asList(S57subf.I8RN));
    7678        private static ArrayList<S57subf> S57dsid = new ArrayList<S57subf>(Arrays.asList(S57subf.RCNM, S57subf.RCID, S57subf.EXPP, S57subf.INTU, S57subf.DSNM, S57subf.EDTN, S57subf.UPDN,
    7779                        S57subf.UADT, S57subf.ISDT, S57subf.STED, S57subf.PRSP, S57subf.PSDN, S57subf.PRED, S57subf.PROF, S57subf.AGEN, S57subf.COMT));
     
    119121        private static final EnumMap<S57field, ArrayList<S57subf>> fields = new EnumMap<S57field, ArrayList<S57subf>>(S57field.class);
    120122        static {
    121                 fields.put(S57field.DSID, S57dsid); fields.put(S57field.DSSI, S57dssi); fields.put(S57field.DSID, S57dspm); fields.put(S57field.DSID, S57dspr);
    122                 fields.put(S57field.DSID, S57dsrc); fields.put(S57field.DSID, S57dsht); fields.put(S57field.DSID, S57dsac); fields.put(S57field.DSID, S57catd);
    123                 fields.put(S57field.DSID, S57catx); fields.put(S57field.DSID, S57dddf); fields.put(S57field.DSID, S57dddr); fields.put(S57field.DSID, S57dddi);
    124                 fields.put(S57field.DSID, S57ddom); fields.put(S57field.DSID, S57ddrf); fields.put(S57field.DSID, S57ddsi); fields.put(S57field.DSID, S57ddsc);
    125                 fields.put(S57field.DSID, S57frid); fields.put(S57field.DSID, S57foid); fields.put(S57field.DSID, S57attf); fields.put(S57field.DSID, S57natf);
    126                 fields.put(S57field.DSID, S57ffpc); fields.put(S57field.DSID, S57ffpt); fields.put(S57field.DSID, S57fspc); fields.put(S57field.DSID, S57fspt);
    127                 fields.put(S57field.DSID, S57vrid); fields.put(S57field.DSID, S57attv); fields.put(S57field.DSID, S57vrpc); fields.put(S57field.DSID, S57vrpt);
    128                 fields.put(S57field.DSID, S57sgcc); fields.put(S57field.DSID, S57sg2d); fields.put(S57field.DSID, S57sg3d); fields.put(S57field.DSID, S57arcc);
    129                 fields.put(S57field.DSID, S57ar2d); fields.put(S57field.DSID, S57el2d); fields.put(S57field.DSID, S57ct2d);
     123                fields.put(S57field.I8RI, S57i8ri);
     124                fields.put(S57field.DSID, S57dsid); fields.put(S57field.DSSI, S57dssi); fields.put(S57field.DSPM, S57dspm); fields.put(S57field.DSPR, S57dspr);
     125                fields.put(S57field.DSRC, S57dsrc); fields.put(S57field.DSHT, S57dsht); fields.put(S57field.DSAC, S57dsac); fields.put(S57field.CATD, S57catd);
     126                fields.put(S57field.CATX, S57catx); fields.put(S57field.DDDF, S57dddf); fields.put(S57field.DDDR, S57dddr); fields.put(S57field.DDDI, S57dddi);
     127                fields.put(S57field.DDOM, S57ddom); fields.put(S57field.DDRF, S57ddrf); fields.put(S57field.DDSI, S57ddsi); fields.put(S57field.DDSC, S57ddsc);
     128                fields.put(S57field.FRID, S57frid); fields.put(S57field.FOID, S57foid); fields.put(S57field.ATTF, S57attf); fields.put(S57field.NATF, S57natf);
     129                fields.put(S57field.FFPC, S57ffpc); fields.put(S57field.FFPT, S57ffpt); fields.put(S57field.FFPC, S57fspc); fields.put(S57field.FSPT, S57fspt);
     130                fields.put(S57field.VRID, S57vrid); fields.put(S57field.ATTV, S57attv); fields.put(S57field.VRPC, S57vrpc); fields.put(S57field.VRPT, S57vrpt);
     131                fields.put(S57field.SGCC, S57sgcc); fields.put(S57field.SG2D, S57sg2d); fields.put(S57field.SG3D, S57sg3d); fields.put(S57field.ARCC, S57arcc);
     132                fields.put(S57field.AR2D, S57ar2d); fields.put(S57field.EL2D, S57el2d); fields.put(S57field.CT2D, S57ct2d);
     133        }
     134
     135        private static byte[] buffer;
     136        private static int offset;
     137        private static int maxoff;
     138        private static int index;
     139        private static S57field field;
     140       
     141        public static void setField(byte[] buf, int off, S57field fld, int len) {
     142                buffer = buf;
     143                offset = off;
     144                maxoff = off + len - 1;
     145                field = fld;
     146                index = 0;
     147        }
     148       
     149        public static boolean more() {
     150                return (offset < maxoff);
     151        }
     152       
     153        public static Object getSubf(byte[] buf, int off, S57field fld, S57subf subf) {
     154                buffer = buf;
     155                offset = off;
     156                index = 0;
     157                return getSubf(fld, subf);
     158        }
     159       
     160        public static Object getSubf(S57field fld, S57subf subf) {
     161                field = fld;
     162                index = 0;
     163                return getSubf(subf);
     164        }
     165
     166        public static Object getSubf(S57subf subf) {
     167                ArrayList<S57subf> subs = fields.get(field);
     168                if (index == subs.size())
     169                        index = 0;
     170                while (index < subs.size()) {
     171                        S57subf sub = subs.get(index++);
     172                        S57conv conv = convs.get(sub);
     173                        if (sub == subf) {
     174                                if (conv.bin == 0) {
     175                                        if (conv.asc == 0) {
     176                                                String str = "";
     177                                                while (buffer[offset] != 0x1f) {
     178                                                        str += buffer[offset++];
     179                                                }
     180                                                offset += (conv.bin != 0) ? Math.abs(conv.bin) : conv.asc;
     181                                                return str;
     182                                        } else
     183                                                return new String(buffer, offset, conv.asc);
     184                                } else {
     185                                        int i = Math.abs(conv.bin);
     186                                        long val = buffer[offset + --i];
     187                                        if (conv.bin > 0)
     188                                                val &= 0xff;
     189                                        while (i > 0) {
     190                                                val = (val << 8) + (buffer[offset + --i] & 0xff);
     191                                        }
     192                                        offset += (conv.bin != 0) ? Math.abs(conv.bin) : conv.asc;
     193                                        return val;
     194                                }
     195                        } else {
     196                                offset += (conv.bin != 0) ? Math.abs(conv.bin) : conv.asc;
     197                        }
     198                }
     199                return null;
    130200        }
    131201
Note: See TracChangeset for help on using the changeset viewer.