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