Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_cos_parser.cpp File Reference
#include "kis_cos_parser.h"
#include <QTextCodec>
#include <QVariantHash>
#include <QVariantList>
#include <QBuffer>
#include <QVariant>
#include <QDebug>

Go to the source code of this file.

Enumerations

enum  {
  Null = 0x00 , Space = 0x20 , Tab = 0x09 , LineFeed = 0x0a ,
  FormFeed = 0x0c , Return = 0x0d , BeginArray = 0x5b , BeginObject = 0x3c ,
  EndArray = 0x5d , EndObject = 0x3e , BeginName = 0x2f , BeginString = 0x28 ,
  EndString = 0x29 , ByteOrderMark = 0xfe
}
 

Functions

void eatSpace (QIODevice &dev)
 
bool isWhiteSpace (char c)
 
bool parseHexString (QIODevice &dev, QVariant &val)
 
bool parseName (QIODevice &dev, QVariant &val)
 
bool parseNumber (QIODevice &dev, QVariant &val)
 
bool parseString (QIODevice &dev, QVariant &val)
 

Variables

const QMap< char, char > escaped
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
Null 
Space 
Tab 
LineFeed 
FormFeed 
Return 
BeginArray 
BeginObject 
EndArray 
EndObject 
BeginName 
BeginString 
EndString 
ByteOrderMark 

Definition at line 15 of file kis_cos_parser.cpp.

15 {
16 Null = 0x00,
17 Space = 0x20,
18 Tab = 0x09,
19 LineFeed = 0x0a,
20 FormFeed = 0x0c,
21 Return = 0x0d,
22 BeginArray = 0x5b, // [
23 BeginObject = 0x3c, // <
24 EndArray = 0x5d, // ]
25 EndObject = 0x3e, // >
26 BeginName = 0x2f, // /
27 BeginString = 0x28, // (
28 EndString = 0x29, // )
29 ByteOrderMark = 0xfe
30};
@ Tab
@ Space
@ FormFeed
@ EndArray
@ BeginArray
@ LineFeed
@ ByteOrderMark
@ EndObject
@ Null
@ BeginObject
@ BeginString
@ Return
@ EndString
@ BeginName

Function Documentation

◆ eatSpace()

void eatSpace ( QIODevice & dev)

Definition at line 46 of file kis_cos_parser.cpp.

46 {
47 char c;
48 dev.peek(&c, 1);
49 while (isWhiteSpace(c) && !dev.atEnd()) {
50 dev.skip(1);
51 dev.peek(&c, 1);
52 }
53}
bool isWhiteSpace(char c)

References isWhiteSpace().

◆ isWhiteSpace()

bool isWhiteSpace ( char c)

Definition at line 32 of file kis_cos_parser.cpp.

32 {
33 switch (c) {
34 case Null:
35 case Tab:
36 case LineFeed:
37 case FormFeed:
38 case Return:
39 case Space:
40 return true;
41 default:
42 return false;
43 }
44}

References FormFeed, LineFeed, Null, Return, Space, and Tab.

◆ parseHexString()

bool parseHexString ( QIODevice & dev,
QVariant & val )

Definition at line 136 of file kis_cos_parser.cpp.

136 {
137 char c;
138 dev.getChar(&c);
139 QByteArray hex;
140
141 while (c!= EndObject && !dev.atEnd()) {
142 hex.append(c);
143 dev.getChar(&c);
144 }
145
146 val = QString("<"+QString::fromLatin1(hex)+">");
147 return true;
148}

References EndObject.

◆ parseName()

bool parseName ( QIODevice & dev,
QVariant & val )

Definition at line 55 of file kis_cos_parser.cpp.

55 {
56 char c;
57 dev.getChar(&c);
58 QString name = "/"; // prepending with / so that we know this is a name.
59
60 while (c >= 0x21 && c<0x7e && !isWhiteSpace(c) && c != BeginName && !dev.atEnd()) {
61 name.append(c);
62 dev.getChar(&c);
63 }
64
65 if (c == BeginName) {
66 dev.ungetChar(c);
67 }
68 val = QVariant(name);
69 return true;
70}
const char * name(StandardAction id)

References BeginName, and isWhiteSpace().

◆ parseNumber()

bool parseNumber ( QIODevice & dev,
QVariant & val )

Definition at line 150 of file kis_cos_parser.cpp.

150 {
151 char c;
152 bool isDouble = false;
153 dev.getChar(&c);
154 QString number;
155 if (c == '-' || c == '+') {
156 number.append(c);
157 dev.getChar(&c);
158 }
159 while (c >= '0' && c <= '9') {
160 number.append(c);
161 dev.getChar(&c);
162 }
163 if (c == '.') {
164 isDouble = true;
165 number.append(c);
166 dev.getChar(&c);
167 while (c >= '0' && c <= '9') {
168 number.append(c);
169 dev.getChar(&c);
170 }
171 }
172
173 bool ok;
174 if (isDouble) {
175 val = number.toDouble(&ok);
176 } else {
177 val = number.toInt(&ok);
178 }
179 return ok;
180}

◆ parseString()

bool parseString ( QIODevice & dev,
QVariant & val )

Definition at line 83 of file kis_cos_parser.cpp.

83 {
84 char c;
85 dev.getChar(&c);
86 QByteArray text;
87
88 while(c != EndString && !dev.atEnd()) {
89 if (c == '\\') {
90
91 // Try to parse PDF \ddd notation.
92 char c2;
93 dev.peek(&c2, 1);
94
95 if (escaped.keys().contains(c2)) {
96 text.append(escaped.value(c2));
97 dev.skip(1);
98 } else {
99 QByteArray octal;
100 for (int i=0; i<3; i++) {
101 char c2;
102 dev.peek(&c2, 1);
103 if (c2 >= '0' && c2 <= '9') {
104 octal.append(c2);
105 dev.skip(1);
106 }
107 }
108 bool ok;
109 int val = octal.toInt(&ok, 8);
110 if (ok) {
111 qWarning() << "escaped octal" << val;
112 // don't know how to actually interpret this as a char...
113 } else {
114 text.append(c);
115 text.append(octal);
116
117 }
118 }
119 } else {
120 text.append(c);
121 }
122 dev.getChar(&c);
123 }
124
125
126 if (text.startsWith(ByteOrderMark)) {
127 QTextCodec *Utf16Codec = QTextCodec::codecForName("UTF-16BE");
128 val = Utf16Codec->toUnicode(text);
129 } else {
130 val = QString::fromLatin1(text);
131 }
132
133 return true;
134}
const QMap< char, char > escaped

References ByteOrderMark, EndString, and escaped.

Variable Documentation

◆ escaped

const QMap<char, char> escaped
Initial value:
= {
{'n', LineFeed},
{'r', Return},
{'t', Tab},
{'b', 0x08},
{'f', FormFeed},
{'(', BeginString},
{')', EndString},
{'\\', 0x5c}
}

Definition at line 72 of file kis_cos_parser.cpp.

72 {
73 {'n', LineFeed},
74 {'r', Return},
75 {'t', Tab},
76 {'b', 0x08}, // backspace
77 {'f', FormFeed},
78 {'(', BeginString},
79 {')', EndString},
80 {'\\', 0x5c} // reverse solidus/backslash
81};