1 // Copyright 2017-2018 ccls Authors
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #include "position.hh"
5 
6 #include "serializer.hh"
7 
8 #include <rapidjson/document.h>
9 #include <rapidjson/writer.h>
10 
11 #include <algorithm>
12 #include <limits.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 
16 namespace ccls {
fromString(const std::string & encoded)17 Pos Pos::fromString(const std::string &encoded) {
18   char *p = const_cast<char *>(encoded.c_str());
19   uint16_t line = uint16_t(strtoul(p, &p, 10) - 1);
20   assert(*p == ':');
21   p++;
22   int16_t column = int16_t(strtol(p, &p, 10)) - 1;
23   return {line, column};
24 }
25 
toString()26 std::string Pos::toString() {
27   char buf[99];
28   snprintf(buf, sizeof buf, "%d:%d", line + 1, column + 1);
29   return buf;
30 }
31 
fromString(const std::string & encoded)32 Range Range::fromString(const std::string &encoded) {
33   Pos start, end;
34   char *p = const_cast<char *>(encoded.c_str());
35   start.line = uint16_t(strtoul(p, &p, 10) - 1);
36   assert(*p == ':');
37   p++;
38   start.column = int16_t(strtol(p, &p, 10)) - 1;
39   assert(*p == '-');
40   p++;
41 
42   end.line = uint16_t(strtoul(p, &p, 10) - 1);
43   assert(*p == ':');
44   p++;
45   end.column = int16_t(strtol(p, nullptr, 10)) - 1;
46   return {start, end};
47 }
48 
contains(int line,int column) const49 bool Range::contains(int line, int column) const {
50   if (line > UINT16_MAX)
51     return false;
52   Pos p{(uint16_t)line, (int16_t)std::min<int>(column, INT16_MAX)};
53   return !(p < start) && p < end;
54 }
55 
toString()56 std::string Range::toString() {
57   char buf[99];
58   snprintf(buf, sizeof buf, "%d:%d-%d:%d", start.line + 1, start.column + 1,
59            end.line + 1, end.column + 1);
60   return buf;
61 }
62 
reflect(JsonReader & vis,Pos & v)63 void reflect(JsonReader &vis, Pos &v) { v = Pos::fromString(vis.getString()); }
reflect(JsonReader & vis,Range & v)64 void reflect(JsonReader &vis, Range &v) {
65   v = Range::fromString(vis.getString());
66 }
67 
reflect(JsonWriter & vis,Pos & v)68 void reflect(JsonWriter &vis, Pos &v) {
69   std::string output = v.toString();
70   vis.string(output.c_str(), output.size());
71 }
reflect(JsonWriter & vis,Range & v)72 void reflect(JsonWriter &vis, Range &v) {
73   std::string output = v.toString();
74   vis.string(output.c_str(), output.size());
75 }
76 
reflect(BinaryReader & visitor,Pos & value)77 void reflect(BinaryReader &visitor, Pos &value) {
78   reflect(visitor, value.line);
79   reflect(visitor, value.column);
80 }
reflect(BinaryReader & visitor,Range & value)81 void reflect(BinaryReader &visitor, Range &value) {
82   reflect(visitor, value.start.line);
83   reflect(visitor, value.start.column);
84   reflect(visitor, value.end.line);
85   reflect(visitor, value.end.column);
86 }
87 
reflect(BinaryWriter & vis,Pos & v)88 void reflect(BinaryWriter &vis, Pos &v) {
89   reflect(vis, v.line);
90   reflect(vis, v.column);
91 }
reflect(BinaryWriter & vis,Range & v)92 void reflect(BinaryWriter &vis, Range &v) {
93   reflect(vis, v.start.line);
94   reflect(vis, v.start.column);
95   reflect(vis, v.end.line);
96   reflect(vis, v.end.column);
97 }
98 } // namespace ccls
99