1 package gnu.text;
2 
3 /** Helpers for managing source-code positions and ranges.
4  * FUTURE: An object that decodes source positions, encoded as longs.
5  * The default encoding gives start-line and end-line both 20 bits,
6  * and start-column and end-column both 12 bits.
7  */
8 
9 public class SourceMapper {
simpleEncode(SourceLocator location)10     public static long simpleEncode(SourceLocator location) {
11         return location instanceof SourceLocator.Simple
12             ? ((SourceLocator.Simple) location).position
13             : SourceMapper
14             .simpleEncode(location.getStartLine(), location.getStartColumn(),
15                           location.getEndLine(), location.getEndColumn());
16     }
17 
simpleEncode(int startLine, int startColumn, int endLine, int endColumn)18     public static long simpleEncode(int startLine, int startColumn,
19                                     int endLine, int endColumn) {
20         if (startLine < 0 || startLine > 0xfffff) startLine = 0;
21         if (endLine < 0 || endLine > 0xfffff) endLine = 0;
22         if (startColumn < 0 || startColumn > 0xfff) startColumn = 0;
23         if (endColumn < 0 || endColumn > 0xfff) endColumn = 0;
24         return ((long) endLine << 44) | ((long) endColumn << 32)
25                  | ((long) startLine << 12) | ((long) startColumn);
26     }
27 
simpleEncode(int startLine, int startColumn)28     public static long simpleEncode(int startLine, int startColumn) {
29         if (startLine < 0 || startLine > 0xfffff) startLine = 0;
30         if (startColumn < 0 || startColumn > 0xfff) startColumn = 0;
31         return ((long) startLine << 12) | ((long) startColumn);
32     }
33 
simpleStartLine(long position)34     public static int simpleStartLine(long position) {
35         int line = (int) (position >> 12) & 0xfffff;
36         return  line == 0 ? -1 : line;
37     }
38 
simpleStartColumn(long position)39     public static int simpleStartColumn(long position) {
40         int column = (int) position & 0xfff;
41         return column == 0 ? -1 : column;
42     }
43 
simpleEndLine(long position)44     public static int simpleEndLine(long position) {
45         int line = (int) (position >> 44) & 0xfffff;
46         return line == 0 ? simpleStartLine(position) : line;
47     }
48 
simpleEndColumn(long position)49     public static int simpleEndColumn(long position) {
50         int column = (int) (position >> 32) & 0xfff;
51         return column == 0 ? simpleStartColumn(position) : column;
52     }
53 
54     /* MAYBE FUTURE:
55     private String filename;
56 
57     public static SourceMapper simpleMapper(String filename) {
58         SourceMapper mapper = new SourceMapper();
59         mapper.filename = filename;
60         return mapper;
61     }
62     public String getFileName(long range) { return filename; }
63 
64     public int getStartLine(long range) { return simpleStartLine(range); }
65     public int getStartColumn(long range) { return simpleStartColumn(range); }
66 
67     public int getEndLine(long range) { return simpleEndLine(range); }
68     public int getEndColumn(long range) { return simpleEndColumn(range); }
69 
70     public int getLineNumber(long range) { return getStartLine(range); }
71     public int getColumnNumber(long range) { return getStartColumn(range); }
72 
73     public static String getFileName(Object mapper, long range) {
74         if (mapper instanceof String)
75             return (String) mapper;
76         else
77             return ((SourceMapper) mapper).getFileName(range);
78     }
79     public static int getLineNumber(Object mapper, long range) {
80          if (mapper instanceof String)
81              return getStartLine(mapper, range);
82          else
83              return ((SourceMapper) mapper).getLineNumber(range);
84     }
85 
86     public static int getColumnNumber(Object mapper, long range) {
87          if (mapper instanceof String)
88              return getStartColumn(mapper, range);
89          else
90              return ((SourceMapper) mapper).getColumnNumber(range);
91     }
92 
93     public static int getStartLine(Object mapper, long range) {
94         return (mapper instanceof String ? simpleStartLine(range)
95                 : ((SourceMapper) mapper).getStartLine(range));
96     }
97 
98     public static int getEndLine(Object mapper, long range) {
99         if (mapper instanceof String)
100             return getStartLine(mapper, range);
101         return ((SourceMapper) mapper).getEndLine(range);
102     }
103 
104     public static int getStartColumn(Object mapper, long range) {
105         return mapper instanceof String ? simpleStartColumn(range)
106                     : ((SourceMapper) mapper).getStartColumn(range);
107     }
108 
109     public static int getEndColumn(Object mapper, long range) {
110         return mapper instanceof String ? simpleEndColumn(range)
111             : ((SourceMapper) mapper).getEndColumn(range);
112     }
113     */
114 }
115