appHandEXIEncoder.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415
  1. /*
  2. * Copyright (C) 2007-2012 Siemens AG
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published
  6. * by the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. * GNU Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /*******************************************************************
  19. *
  20. * @author Daniel.Peintner.EXT@siemens.com
  21. * @version 0.7
  22. * @contact Joerg.Heuer@siemens.com
  23. *
  24. * <p>Code generated by EXIdizer.com</p>
  25. ********************************************************************/
  26. #ifndef EXI_appHand_ENCODER_C
  27. #define EXI_appHand_ENCODER_C
  28. #include "EXITypes.h"
  29. #include "EXIOptions.h"
  30. #include "BitOutputStream.h"
  31. #include "EncoderChannel.h"
  32. #include "StringTable.h"
  33. #include "appHandNameTableEntries.h"
  34. #include "MethodsBag.h"
  35. #include "EXIOptions.h"
  36. #include "appHandEXICoder.h"
  37. #include "EXIHeaderEncoder.h"
  38. #include "ErrorCodes.h"
  39. #include "appHandQNames.h"
  40. #include "appHandQNameDefines.h"
  41. /* local variables */
  42. static uint32_t bits;
  43. static int errn;
  44. /* ==================================== */
  45. static int _encodeNBitIntegerValue(bitstream_t* stream, exi_integer_t* iv, uint16_t nbits, int32_t lowerBound) {
  46. int errn;
  47. uint32_t val;
  48. switch(iv->type) {
  49. /* Unsigned Integer */
  50. case EXI_UNSIGNED_INTEGER_8:
  51. val = iv->val.int8 - lowerBound;
  52. break;
  53. case EXI_UNSIGNED_INTEGER_16:
  54. val = iv->val.int16 - lowerBound;
  55. break;
  56. case EXI_UNSIGNED_INTEGER_32:
  57. val = (uint32_t)(iv->val.int32 - lowerBound);
  58. break;
  59. case EXI_UNSIGNED_INTEGER_64:
  60. val = (uint32_t)(iv->val.int64 - lowerBound);
  61. break;
  62. /* (Signed) Integer */
  63. case EXI_INTEGER_8:
  64. val = iv->val.uint8 - lowerBound;
  65. break;
  66. case EXI_INTEGER_16:
  67. val = iv->val.uint16 - lowerBound;
  68. break;
  69. case EXI_INTEGER_32:
  70. val = iv->val.uint32 - lowerBound;
  71. break;
  72. case EXI_INTEGER_64:
  73. val = (uint32_t)(iv->val.uint64 - lowerBound);
  74. break;
  75. default:
  76. return EXI_UNSUPPORTED_INTEGER_VALUE_TYPE;
  77. break;
  78. }
  79. errn = encodeNBitUnsignedInteger(stream, nbits, val);
  80. return errn;
  81. }
  82. static int _exiValueToString(exi_value_t* val) {
  83. if (val->type == EXI_DATATYPE_STRING) {
  84. return 0;
  85. } else {
  86. /* TODO convert typed value to string */
  87. return EXI_ERROR_CONVERSION_TYPE_TO_STRING;
  88. }
  89. }
  90. static int _exiEncodeEventCode2(bitstream_t* stream, exi_state_t* state, exi_event_t event2) {
  91. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  92. }
  93. static int _exiEncodeNamespaceUriHit(bitstream_t* stream, exi_state_t* state, uint16_t uriID) {
  94. int errn;
  95. uint16_t uriCodingLength;
  96. uint16_t uriSize;
  97. errn = exiGetUriSize(&state->nameTablePrepopulated, &state->nameTableRuntime, &uriSize);
  98. if (errn) {
  99. return errn;
  100. }
  101. /* URI Entries + 1 */
  102. errn = exiGetCodingLength(uriSize + 1, &uriCodingLength);
  103. if (errn) {
  104. return errn;
  105. }
  106. /* uri string value found */
  107. /* ==> value(i+1) is encoded as n-bit unsigned integer */
  108. errn = encodeNBitUnsignedInteger(stream, uriCodingLength, uriID+1);
  109. return errn;
  110. }
  111. static int _exiEncodeNamespaceMiss(bitstream_t* stream, exi_state_t* state,
  112. exi_string_ucs_t* uri, uint16_t* uriID) {
  113. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  114. }
  115. static int _exiEncodeLocalNameHit(bitstream_t* stream, exi_state_t* state,
  116. uint16_t uriID, uint16_t localNameID) {
  117. int errn;
  118. uint16_t localNameSize;
  119. uint16_t localNameCodingLength;
  120. /* string value found in local partition */
  121. /* ==> string value is represented as zero (0) encoded as an */
  122. errn = encodeUnsignedInteger32(stream, 0 );
  123. if (errn < 0) {
  124. return errn;
  125. }
  126. /* Unsigned Integer followed by an the compact identifier of the */
  127. /* string value as an n-bit unsigned integer n is log2 m and m is */
  128. /* the number of entries in the string table partition */
  129. errn = exiGetLocalNameSize(&state->nameTablePrepopulated, &state->nameTableRuntime, uriID, &localNameSize);
  130. if (errn < 0) {
  131. return errn;
  132. }
  133. errn = exiGetCodingLength(localNameSize, &localNameCodingLength);
  134. if (errn) {
  135. return errn;
  136. }
  137. errn = encodeNBitUnsignedInteger(stream, localNameCodingLength, localNameID);
  138. return errn;
  139. }
  140. static int _exiEncodeLocalNameMiss(bitstream_t* stream, exi_state_t* state,
  141. exi_string_ucs_t* localName, uint16_t uriID, uint16_t* localNameID) {
  142. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  143. }
  144. static int _encodeAttributeXsiTypeContent(bitstream_t* stream, exi_state_t* state,
  145. exi_value_t* val) {
  146. /* encode qname */
  147. errn = _exiEncodeNamespaceUriHit(stream, state, val->eqname.namespaceURI);
  148. if (errn < 0) {
  149. return errn;
  150. }
  151. errn = _exiEncodeLocalNameHit(stream, state, val->eqname.namespaceURI, val->eqname.localPart);
  152. if (errn < 0) {
  153. return errn;
  154. }
  155. /* handle xsi type cast */
  156. errn = exi_appHand_HandleXsiType(state, &val->eqname);
  157. return errn;
  158. }
  159. static int _exiEncodeStartElement(bitstream_t* stream, uint16_t nbits,
  160. uint32_t val, exi_state_t* state, uint16_t qnameID, uint16_t stackId,
  161. uint16_t newState) {
  162. /* event-code */
  163. int errn = encodeNBitUnsignedInteger(stream, nbits, val);
  164. if (errn) {
  165. return errn;
  166. }
  167. /* move on */
  168. state->grammarStack[state->stackIndex] = stackId;
  169. /* push element on stack */
  170. return exi_appHand_PushStack(state, newState, qnameID);
  171. }
  172. static int _exiEncodeEndElementUndeclared(bitstream_t* stream, exi_state_t* state) {
  173. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  174. }
  175. static int _encode2ndLevelAttribute(bitstream_t* stream, exi_state_t* state, uint16_t qnameID,
  176. exi_value_t* val) {
  177. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  178. }
  179. int exiappHandEncodeListValue(bitstream_t* stream, exi_state_t* state, uint16_t qnameID, exi_value_t* val, exi_list_t lt) {
  180. switch(lt.type) {
  181. case EXI_DATATYPE_BINARY_BASE64:
  182. case EXI_DATATYPE_BINARY_HEX:
  183. errn = encodeBinary(stream, &val->binary);
  184. break;
  185. case EXI_DATATYPE_BOOLEAN:
  186. errn = encodeBoolean(stream, val->boolean);
  187. break;
  188. case EXI_DATATYPE_BOOLEAN_FACET:
  189. errn = encodeNBitUnsignedInteger(stream, 2, val->boolean ? 2 : 0);
  190. break;
  191. case EXI_DATATYPE_DECIMAL:
  192. errn = encodeDecimal(stream, &val->decimal);
  193. break;
  194. case EXI_DATATYPE_FLOAT:
  195. errn = encodeFloat(stream, &val->float_me);
  196. break;
  197. case EXI_DATATYPE_NBIT_UNSIGNED_INTEGER:
  198. errn = EXI_UNSUPPORTED_LIST_VALUE_TYPE;
  199. break;
  200. case EXI_DATATYPE_UNSIGNED_INTEGER:
  201. errn = encodeUnsignedInteger(stream, &val->integer);
  202. break;
  203. case EXI_DATATYPE_INTEGER:
  204. errn = encodeInteger(stream, &val->integer);
  205. break;
  206. case EXI_DATATYPE_DATETIME:
  207. errn = encodeDateTime(stream, &val->datetime);
  208. break;
  209. case EXI_DATATYPE_STRING:
  210. errn = encodeStringValue(stream, state, qnameID, &val->str);
  211. break;
  212. default:
  213. return EXI_UNSUPPORTED_LIST_VALUE_TYPE;
  214. }
  215. return errn;
  216. }
  217. #ifndef __GNUC__
  218. #pragma warning( disable : 4100 ) /* warning unreferenced parameter 'stream' */
  219. #endif /* __GNUC__ */
  220. int exiappHandEncodeStartDocument(bitstream_t* stream, exi_state_t* state) {
  221. if ( state->grammarStack[state->stackIndex] == 0 ) {
  222. /* move on */
  223. state->grammarStack[state->stackIndex] = 13;
  224. return 0;
  225. }
  226. if ( state->grammarStack[state->stackIndex] == 0 ) {
  227. /* move on */
  228. state->grammarStack[state->stackIndex] = 13;
  229. return 0;
  230. }
  231. if ( state->grammarStack[state->stackIndex] == 105 ) {
  232. /* move on */
  233. state->grammarStack[state->stackIndex] = 42;
  234. return 0;
  235. }
  236. return EXI_ERROR_UNEXPECTED_START_DOCUMENT;
  237. }
  238. #ifndef __GNUC__
  239. #pragma warning( default : 4100 ) /* warning unreferenced parameter 'stream' */
  240. #endif /* __GNUC__ */
  241. #ifndef __GNUC__
  242. #pragma warning( disable : 4100 ) /* warning unreferenced parameter 'stream' */
  243. #endif /* __GNUC__ */
  244. int exiappHandEncodeEndDocument(bitstream_t* stream, exi_state_t* state) {
  245. if ( state->grammarStack[state->stackIndex] == 42) {
  246. encodeFinish(stream);
  247. return 0;
  248. }
  249. if ( state->grammarStack[state->stackIndex] == 14) {
  250. encodeFinish(stream);
  251. return 0;
  252. }
  253. return EXI_ERROR_UNEXPECTED_END_DOCUMENT;
  254. }
  255. #ifndef __GNUC__
  256. #pragma warning( default : 4100 ) /* warning unreferenced parameter 'stream' */
  257. #endif /* __GNUC__ */
  258. int exiappHandInitEncoder(bitstream_t* stream, exi_state_t* state,
  259. exi_name_table_runtime_t runtimeTable, exi_string_table_t stringTable) {
  260. #if EXI_appHandVALUE_PARTITION_CAPACITY != 0
  261. #if EXI_appHandVALUE_MAX_LENGTH != 0
  262. int i;
  263. #endif /* EXI_appHandVALUE_MAX_LENGTH != 0 */
  264. #endif /* EXI_appHandVALUE_PARTITION_CAPACITY != 0 */
  265. /* init grammar state */
  266. state->stackIndex = 0;
  267. state->grammarStack[0] = DOCUMENT;
  268. /* name tables */
  269. state->nameTablePrepopulated = exiappHandNameTablePrepopulated;
  270. state->nameTableRuntime = runtimeTable;
  271. /* next qname ID */
  272. state->nextQNameID = EXI_appHandNUMBER_OF_PREPOPULATED_QNAMES;
  273. /* string tables */
  274. state->stringTable = stringTable;
  275. state->stringTable.numberOfGlobalStrings = 0;
  276. #if EXI_appHandVALUE_PARTITION_CAPACITY != 0
  277. #if EXI_appHandVALUE_MAX_LENGTH != 0
  278. for(i=0; i<(state->stringTable.sizeLocalStrings); i++) {
  279. state->stringTable.numberOfLocalStrings[i] = 0;
  280. }
  281. #endif /* EXI_appHandVALUE_MAX_LENGTH != 0 */
  282. #endif /* EXI_appHandVALUE_PARTITION_CAPACITY != 0 */
  283. /* runtime grammars */
  284. state->numberOfRuntimeGrammars = 0;
  285. /* Avoid warning: Unused declaration of variable 'name' */
  286. bits = 0;
  287. /* encode header */
  288. return writeEXIHeader(stream);
  289. }
  290. int exiappHandEncodeStartElement(bitstream_t* stream, exi_state_t* state, uint16_t qnameID) {
  291. uint16_t namespaceUriID, localNameID;
  292. int16_t currentID = state->grammarStack[state->stackIndex];
  293. errn = EXI_ERROR_UNEXPECTED_START_ELEMENT;
  294. switch (currentID) {
  295. case 3:
  296. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  297. switch(qnameID) {
  298. case 0:
  299. /* SE( AppProtocol ) */
  300. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 4, 5);
  301. break;
  302. }
  303. break;
  304. case 4:
  305. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  306. switch(qnameID) {
  307. case 0:
  308. /* SE( AppProtocol ) */
  309. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 124, 5);
  310. break;
  311. }
  312. break;
  313. case 5:
  314. /* FirstStartTag[START_ELEMENT(ProtocolNamespace)] */
  315. switch(qnameID) {
  316. case 2:
  317. /* SE( ProtocolNamespace ) */
  318. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 31, 18);
  319. break;
  320. }
  321. break;
  322. case 8:
  323. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  324. switch(qnameID) {
  325. case 0:
  326. /* SE( AppProtocol ) */
  327. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 9, 5);
  328. break;
  329. }
  330. break;
  331. case 9:
  332. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  333. switch(qnameID) {
  334. case 0:
  335. /* SE( AppProtocol ) */
  336. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 92, 5);
  337. break;
  338. }
  339. break;
  340. case 13:
  341. /* DocContent[START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC] */
  342. switch(qnameID) {
  343. case 65:
  344. /* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq ) */
  345. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 14, 15);
  346. break;
  347. case 66:
  348. /* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes ) */
  349. errn = _exiEncodeStartElement(stream, 2, 1, state, qnameID, 14, 16);
  350. break;
  351. }
  352. break;
  353. case 15:
  354. /* FirstStartTag[START_ELEMENT(AppProtocol)] */
  355. switch(qnameID) {
  356. case 0:
  357. /* SE( AppProtocol ) */
  358. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 3, 5);
  359. break;
  360. }
  361. break;
  362. case 16:
  363. /* FirstStartTag[START_ELEMENT(ResponseCode)] */
  364. switch(qnameID) {
  365. case 3:
  366. /* SE( ResponseCode ) */
  367. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 66, 44);
  368. break;
  369. }
  370. break;
  371. case 26:
  372. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  373. switch(qnameID) {
  374. case 0:
  375. /* SE( AppProtocol ) */
  376. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 27, 5);
  377. break;
  378. }
  379. break;
  380. case 27:
  381. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  382. switch(qnameID) {
  383. case 0:
  384. /* SE( AppProtocol ) */
  385. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 97, 5);
  386. break;
  387. }
  388. break;
  389. case 30:
  390. /* Element[START_ELEMENT(ProtocolNamespace)] */
  391. switch(qnameID) {
  392. case 2:
  393. /* SE( ProtocolNamespace ) */
  394. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 31, 18);
  395. break;
  396. }
  397. break;
  398. case 31:
  399. /* Element[START_ELEMENT(VersionNumberMajor)] */
  400. switch(qnameID) {
  401. case 5:
  402. /* SE( VersionNumberMajor ) */
  403. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 33, 46);
  404. break;
  405. }
  406. break;
  407. case 33:
  408. /* Element[START_ELEMENT(VersionNumberMinor)] */
  409. switch(qnameID) {
  410. case 6:
  411. /* SE( VersionNumberMinor ) */
  412. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 34, 35);
  413. break;
  414. }
  415. break;
  416. case 34:
  417. /* Element[START_ELEMENT(SchemaID)] */
  418. switch(qnameID) {
  419. case 4:
  420. /* SE( SchemaID ) */
  421. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 90, 45);
  422. break;
  423. }
  424. break;
  425. case 42:
  426. /* FragmentContent[START_ELEMENT(AppProtocol), START_ELEMENT(Priority), START_ELEMENT(ProtocolNamespace), START_ELEMENT(ResponseCode), START_ELEMENT(SchemaID), START_ELEMENT(VersionNumberMajor), START_ELEMENT(VersionNumberMinor), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq), START_ELEMENT({urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes), START_ELEMENT_GENERIC, END_DOCUMENT] */
  427. switch(qnameID) {
  428. case 0:
  429. /* SE( AppProtocol ) */
  430. errn = _exiEncodeStartElement(stream, 4, 0, state, qnameID, 42, 5);
  431. break;
  432. case 1:
  433. /* SE( Priority ) */
  434. errn = _exiEncodeStartElement(stream, 4, 1, state, qnameID, 42, 43);
  435. break;
  436. case 2:
  437. /* SE( ProtocolNamespace ) */
  438. errn = _exiEncodeStartElement(stream, 4, 2, state, qnameID, 42, 18);
  439. break;
  440. case 3:
  441. /* SE( ResponseCode ) */
  442. errn = _exiEncodeStartElement(stream, 4, 3, state, qnameID, 42, 44);
  443. break;
  444. case 4:
  445. /* SE( SchemaID ) */
  446. errn = _exiEncodeStartElement(stream, 4, 4, state, qnameID, 42, 45);
  447. break;
  448. case 5:
  449. /* SE( VersionNumberMajor ) */
  450. errn = _exiEncodeStartElement(stream, 4, 5, state, qnameID, 42, 46);
  451. break;
  452. case 6:
  453. /* SE( VersionNumberMinor ) */
  454. errn = _exiEncodeStartElement(stream, 4, 6, state, qnameID, 42, 35);
  455. break;
  456. case 65:
  457. /* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolReq ) */
  458. errn = _exiEncodeStartElement(stream, 4, 7, state, qnameID, 42, 15);
  459. break;
  460. case 66:
  461. /* SE( {urn:iso:15118:2:2010:AppProtocol}supportedAppProtocolRes ) */
  462. errn = _exiEncodeStartElement(stream, 4, 8, state, qnameID, 42, 16);
  463. break;
  464. }
  465. break;
  466. case 60:
  467. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  468. switch(qnameID) {
  469. case 0:
  470. /* SE( AppProtocol ) */
  471. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 61, 5);
  472. break;
  473. }
  474. break;
  475. case 61:
  476. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  477. switch(qnameID) {
  478. case 0:
  479. /* SE( AppProtocol ) */
  480. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 26, 5);
  481. break;
  482. }
  483. break;
  484. case 66:
  485. /* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
  486. switch(qnameID) {
  487. case 4:
  488. /* SE( SchemaID ) */
  489. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 129, 45);
  490. break;
  491. }
  492. break;
  493. case 72:
  494. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  495. switch(qnameID) {
  496. case 0:
  497. /* SE( AppProtocol ) */
  498. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 73, 5);
  499. break;
  500. }
  501. break;
  502. case 73:
  503. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  504. switch(qnameID) {
  505. case 0:
  506. /* SE( AppProtocol ) */
  507. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 109, 5);
  508. break;
  509. }
  510. break;
  511. case 90:
  512. /* Element[START_ELEMENT(Priority)] */
  513. switch(qnameID) {
  514. case 1:
  515. /* SE( Priority ) */
  516. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 127, 43);
  517. break;
  518. }
  519. break;
  520. case 92:
  521. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  522. switch(qnameID) {
  523. case 0:
  524. /* SE( AppProtocol ) */
  525. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 113, 5);
  526. break;
  527. }
  528. break;
  529. case 94:
  530. /* Element[START_ELEMENT(AppProtocol)] */
  531. switch(qnameID) {
  532. case 0:
  533. /* SE( AppProtocol ) */
  534. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 3, 5);
  535. break;
  536. }
  537. break;
  538. case 97:
  539. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  540. switch(qnameID) {
  541. case 0:
  542. /* SE( AppProtocol ) */
  543. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 39, 5);
  544. break;
  545. }
  546. break;
  547. case 109:
  548. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  549. switch(qnameID) {
  550. case 0:
  551. /* SE( AppProtocol ) */
  552. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 110, 5);
  553. break;
  554. }
  555. break;
  556. case 110:
  557. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  558. switch(qnameID) {
  559. case 0:
  560. /* SE( AppProtocol ) */
  561. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 60, 5);
  562. break;
  563. }
  564. break;
  565. case 113:
  566. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  567. switch(qnameID) {
  568. case 0:
  569. /* SE( AppProtocol ) */
  570. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 115, 5);
  571. break;
  572. }
  573. break;
  574. case 115:
  575. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  576. switch(qnameID) {
  577. case 0:
  578. /* SE( AppProtocol ) */
  579. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 72, 5);
  580. break;
  581. }
  582. break;
  583. case 117:
  584. /* Element[START_ELEMENT(ResponseCode)] */
  585. switch(qnameID) {
  586. case 3:
  587. /* SE( ResponseCode ) */
  588. errn = _exiEncodeStartElement(stream, 1, 0, state, qnameID, 66, 44);
  589. break;
  590. }
  591. break;
  592. case 124:
  593. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  594. switch(qnameID) {
  595. case 0:
  596. /* SE( AppProtocol ) */
  597. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 125, 5);
  598. break;
  599. }
  600. break;
  601. case 125:
  602. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  603. switch(qnameID) {
  604. case 0:
  605. /* SE( AppProtocol ) */
  606. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 128, 5);
  607. break;
  608. }
  609. break;
  610. case 128:
  611. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  612. switch(qnameID) {
  613. case 0:
  614. /* SE( AppProtocol ) */
  615. errn = _exiEncodeStartElement(stream, 2, 0, state, qnameID, 8, 5);
  616. break;
  617. }
  618. break;
  619. default:
  620. /* element qname not expected */
  621. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  622. }
  623. return errn;
  624. }
  625. int exiappHandEncodeStartElementNS(bitstream_t* stream,
  626. exi_state_t* state, uint16_t namespaceUriID,
  627. exi_string_ucs_t* localName) {
  628. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  629. }
  630. int exiappHandEncodeStartElementGeneric(bitstream_t* stream,
  631. exi_state_t* state, exi_string_ucs_t* namespaceUri,
  632. exi_string_ucs_t* localName) {
  633. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  634. }
  635. int exiappHandEncodeEndElement(bitstream_t* stream, exi_state_t* state) {
  636. int errn = 0;
  637. int16_t currentID = state->grammarStack[state->stackIndex];
  638. switch (currentID) {
  639. case 22:
  640. /* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  641. case 50:
  642. /* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  643. errn = encodeNBitUnsignedInteger(stream, 3, 2);
  644. break;
  645. case 2:
  646. /* Element[END_ELEMENT] */
  647. case 39:
  648. /* Element[END_ELEMENT] */
  649. case 127:
  650. /* Element[END_ELEMENT] */
  651. case 129:
  652. /* Element[END_ELEMENT] */
  653. errn = encodeNBitUnsignedInteger(stream, 1, 0);
  654. break;
  655. case 3:
  656. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  657. case 8:
  658. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  659. case 26:
  660. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  661. case 60:
  662. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  663. case 72:
  664. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  665. case 23:
  666. /* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  667. case 9:
  668. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  669. case 97:
  670. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  671. case 109:
  672. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  673. case 92:
  674. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  675. case 115:
  676. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  677. case 124:
  678. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  679. case 27:
  680. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  681. case 51:
  682. /* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  683. case 128:
  684. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  685. case 66:
  686. /* Element[START_ELEMENT(SchemaID), END_ELEMENT] */
  687. case 110:
  688. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  689. case 61:
  690. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  691. case 113:
  692. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  693. case 4:
  694. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  695. case 125:
  696. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  697. case 73:
  698. /* Element[START_ELEMENT(AppProtocol), END_ELEMENT] */
  699. errn = encodeNBitUnsignedInteger(stream, 2, 1);
  700. break;
  701. default:
  702. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  703. }
  704. if (errn < 0) {
  705. return errn;
  706. }
  707. /* pop item */
  708. return exi_appHand_PopStack(state);
  709. }
  710. int exiappHandEncodeCharacters(bitstream_t* stream, exi_state_t* state,
  711. exi_value_t* val) {
  712. int16_t moveOnID = 0;
  713. int deviantChars = 0;
  714. int16_t currentID = state->grammarStack[state->stackIndex];
  715. switch (currentID) {
  716. case 43:
  717. /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  718. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  719. encodeNBitUnsignedInteger(stream, 1, 0);
  720. errn = _encodeNBitIntegerValue(stream, &val->integer, 5, 1);
  721. moveOnID = 2;
  722. } else {
  723. /* deviant characters */
  724. encodeNBitUnsignedInteger(stream, 1, 1);
  725. encodeNBitUnsignedInteger(stream, 3, 6);
  726. deviantChars = 1;
  727. }
  728. break;
  729. case 65:
  730. case 95:
  731. case 140:
  732. /* Element[CHARACTERS[LIST]] */
  733. if (val->type == EXI_DATATYPE_LIST) {
  734. encodeNBitUnsignedInteger(stream, 1, 0);
  735. errn = encodeUnsignedInteger32(stream, val->list.len);
  736. moveOnID = 2;
  737. } else {
  738. /* deviant characters */
  739. encodeNBitUnsignedInteger(stream, 1, 1);
  740. encodeNBitUnsignedInteger(stream, 2, 2);
  741. deviantChars = 1;
  742. }
  743. break;
  744. case 51:
  745. /* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  746. if (val->type == EXI_DATATYPE_STRING) {
  747. encodeNBitUnsignedInteger(stream, 2, 2);
  748. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  749. moveOnID = 51;
  750. } else {
  751. /* deviant characters */
  752. encodeNBitUnsignedInteger(stream, 2, 3);
  753. encodeNBitUnsignedInteger(stream, 1, 1);
  754. deviantChars = 1;
  755. }
  756. break;
  757. case 37:
  758. /* Element[CHARACTERS[BOOLEAN]] */
  759. if (val->type == EXI_DATATYPE_BOOLEAN) {
  760. encodeNBitUnsignedInteger(stream, 1, 0);
  761. errn = encodeBoolean(stream, val->boolean);
  762. moveOnID = 2;
  763. } else {
  764. /* deviant characters */
  765. encodeNBitUnsignedInteger(stream, 1, 1);
  766. encodeNBitUnsignedInteger(stream, 2, 2);
  767. deviantChars = 1;
  768. }
  769. break;
  770. case 56:
  771. /* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  772. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  773. encodeNBitUnsignedInteger(stream, 1, 0);
  774. errn = _encodeNBitIntegerValue(stream, &val->integer, 8, -128);
  775. moveOnID = 2;
  776. } else {
  777. /* deviant characters */
  778. encodeNBitUnsignedInteger(stream, 1, 1);
  779. encodeNBitUnsignedInteger(stream, 2, 2);
  780. deviantChars = 1;
  781. }
  782. break;
  783. case 19:
  784. /* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  785. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  786. encodeNBitUnsignedInteger(stream, 1, 0);
  787. errn = _encodeNBitIntegerValue(stream, &val->integer, 5, 1);
  788. moveOnID = 2;
  789. } else {
  790. /* deviant characters */
  791. encodeNBitUnsignedInteger(stream, 1, 1);
  792. encodeNBitUnsignedInteger(stream, 2, 2);
  793. deviantChars = 1;
  794. }
  795. break;
  796. case 44:
  797. /* FirstStartTag[CHARACTERS[ENUMERATION]] */
  798. if (val->type == EXI_DATATYPE_ENUMERATION) {
  799. encodeNBitUnsignedInteger(stream, 1, 0);
  800. errn = encodeNBitUnsignedInteger(stream, 2, val->enumeration);
  801. moveOnID = 2;
  802. } else {
  803. /* deviant characters */
  804. encodeNBitUnsignedInteger(stream, 1, 1);
  805. encodeNBitUnsignedInteger(stream, 3, 6);
  806. deviantChars = 1;
  807. }
  808. break;
  809. case 53:
  810. /* FirstStartTag[CHARACTERS[DECIMAL]] */
  811. if (val->type == EXI_DATATYPE_DECIMAL) {
  812. encodeNBitUnsignedInteger(stream, 1, 0);
  813. errn = encodeDecimal(stream, &val->decimal);
  814. moveOnID = 2;
  815. } else {
  816. /* deviant characters */
  817. encodeNBitUnsignedInteger(stream, 1, 1);
  818. encodeNBitUnsignedInteger(stream, 3, 6);
  819. deviantChars = 1;
  820. }
  821. break;
  822. case 11:
  823. case 130:
  824. /* FirstStartTag[CHARACTERS[FLOAT]] */
  825. if (val->type == EXI_DATATYPE_FLOAT) {
  826. encodeNBitUnsignedInteger(stream, 1, 0);
  827. errn = encodeFloat(stream, &val->float_me);
  828. moveOnID = 2;
  829. } else {
  830. /* deviant characters */
  831. encodeNBitUnsignedInteger(stream, 1, 1);
  832. encodeNBitUnsignedInteger(stream, 3, 6);
  833. deviantChars = 1;
  834. }
  835. break;
  836. case 116:
  837. /* Element[CHARACTERS[DECIMAL]] */
  838. if (val->type == EXI_DATATYPE_DECIMAL) {
  839. encodeNBitUnsignedInteger(stream, 1, 0);
  840. errn = encodeDecimal(stream, &val->decimal);
  841. moveOnID = 2;
  842. } else {
  843. /* deviant characters */
  844. encodeNBitUnsignedInteger(stream, 1, 1);
  845. encodeNBitUnsignedInteger(stream, 2, 2);
  846. deviantChars = 1;
  847. }
  848. break;
  849. case 25:
  850. case 29:
  851. case 144:
  852. /* FirstStartTag[CHARACTERS[LIST]] */
  853. if (val->type == EXI_DATATYPE_LIST) {
  854. encodeNBitUnsignedInteger(stream, 1, 0);
  855. errn = encodeUnsignedInteger32(stream, val->list.len);
  856. moveOnID = 2;
  857. } else {
  858. /* deviant characters */
  859. encodeNBitUnsignedInteger(stream, 1, 1);
  860. encodeNBitUnsignedInteger(stream, 3, 6);
  861. deviantChars = 1;
  862. }
  863. break;
  864. case 50:
  865. /* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  866. if (val->type == EXI_DATATYPE_STRING) {
  867. encodeNBitUnsignedInteger(stream, 3, 3);
  868. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  869. moveOnID = 51;
  870. } else {
  871. /* deviant characters */
  872. encodeNBitUnsignedInteger(stream, 3, 4);
  873. encodeNBitUnsignedInteger(stream, 3, 5);
  874. deviantChars = 1;
  875. }
  876. break;
  877. case 46:
  878. case 35:
  879. /* First(xsi:type)StartTag[CHARACTERS[UNSIGNED_INTEGER]] */
  880. if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
  881. encodeNBitUnsignedInteger(stream, 1, 0);
  882. errn = encodeUnsignedInteger(stream, &val->integer);
  883. moveOnID = 2;
  884. } else {
  885. /* deviant characters */
  886. encodeNBitUnsignedInteger(stream, 1, 1);
  887. encodeNBitUnsignedInteger(stream, 3, 6);
  888. deviantChars = 1;
  889. }
  890. break;
  891. case 12:
  892. case 32:
  893. case 38:
  894. case 40:
  895. case 41:
  896. case 54:
  897. case 67:
  898. case 70:
  899. case 77:
  900. case 85:
  901. case 87:
  902. case 96:
  903. case 114:
  904. case 118:
  905. case 120:
  906. case 131:
  907. case 137:
  908. /* Element[CHARACTERS[STRING]] */
  909. if (val->type == EXI_DATATYPE_STRING) {
  910. encodeNBitUnsignedInteger(stream, 1, 0);
  911. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  912. moveOnID = 2;
  913. } else {
  914. /* deviant characters */
  915. encodeNBitUnsignedInteger(stream, 1, 1);
  916. encodeNBitUnsignedInteger(stream, 2, 2);
  917. deviantChars = 1;
  918. }
  919. break;
  920. case 23:
  921. /* Element[START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  922. if (val->type == EXI_DATATYPE_STRING) {
  923. encodeNBitUnsignedInteger(stream, 2, 2);
  924. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  925. moveOnID = 23;
  926. } else {
  927. /* deviant characters */
  928. encodeNBitUnsignedInteger(stream, 2, 3);
  929. encodeNBitUnsignedInteger(stream, 1, 1);
  930. deviantChars = 1;
  931. }
  932. break;
  933. case 111:
  934. /* FirstStartTag[CHARACTERS[BINARY_BASE64]] */
  935. if (val->type == EXI_DATATYPE_BINARY_BASE64) {
  936. encodeNBitUnsignedInteger(stream, 1, 0);
  937. errn = encodeBinary(stream, &val->binary);
  938. moveOnID = 2;
  939. } else {
  940. /* deviant characters */
  941. encodeNBitUnsignedInteger(stream, 1, 1);
  942. encodeNBitUnsignedInteger(stream, 3, 6);
  943. deviantChars = 1;
  944. }
  945. break;
  946. case 28:
  947. /* Element[CHARACTERS[BINARY_HEX]] */
  948. if (val->type == EXI_DATATYPE_BINARY_HEX) {
  949. encodeNBitUnsignedInteger(stream, 1, 0);
  950. errn = encodeBinary(stream, &val->binary);
  951. moveOnID = 2;
  952. } else {
  953. /* deviant characters */
  954. encodeNBitUnsignedInteger(stream, 1, 1);
  955. encodeNBitUnsignedInteger(stream, 2, 2);
  956. deviantChars = 1;
  957. }
  958. break;
  959. case 17:
  960. case 47:
  961. case 83:
  962. case 91:
  963. case 107:
  964. case 136:
  965. /* Element[CHARACTERS[INTEGER]] */
  966. if (val->type == EXI_DATATYPE_INTEGER) {
  967. encodeNBitUnsignedInteger(stream, 1, 0);
  968. errn = encodeInteger(stream, &val->integer);
  969. moveOnID = 2;
  970. } else {
  971. /* deviant characters */
  972. encodeNBitUnsignedInteger(stream, 1, 1);
  973. encodeNBitUnsignedInteger(stream, 2, 2);
  974. deviantChars = 1;
  975. }
  976. break;
  977. case 62:
  978. case 103:
  979. /* Element[CHARACTERS[FLOAT]] */
  980. if (val->type == EXI_DATATYPE_FLOAT) {
  981. encodeNBitUnsignedInteger(stream, 1, 0);
  982. errn = encodeFloat(stream, &val->float_me);
  983. moveOnID = 2;
  984. } else {
  985. /* deviant characters */
  986. encodeNBitUnsignedInteger(stream, 1, 1);
  987. encodeNBitUnsignedInteger(stream, 2, 2);
  988. deviantChars = 1;
  989. }
  990. break;
  991. case 52:
  992. /* Element[CHARACTERS[BINARY_BASE64]] */
  993. if (val->type == EXI_DATATYPE_BINARY_BASE64) {
  994. encodeNBitUnsignedInteger(stream, 1, 0);
  995. errn = encodeBinary(stream, &val->binary);
  996. moveOnID = 2;
  997. } else {
  998. /* deviant characters */
  999. encodeNBitUnsignedInteger(stream, 1, 1);
  1000. encodeNBitUnsignedInteger(stream, 2, 2);
  1001. deviantChars = 1;
  1002. }
  1003. break;
  1004. case 132:
  1005. /* FirstStartTag[CHARACTERS[BINARY_HEX]] */
  1006. if (val->type == EXI_DATATYPE_BINARY_HEX) {
  1007. encodeNBitUnsignedInteger(stream, 1, 0);
  1008. errn = encodeBinary(stream, &val->binary);
  1009. moveOnID = 2;
  1010. } else {
  1011. /* deviant characters */
  1012. encodeNBitUnsignedInteger(stream, 1, 1);
  1013. encodeNBitUnsignedInteger(stream, 3, 6);
  1014. deviantChars = 1;
  1015. }
  1016. break;
  1017. case 7:
  1018. case 21:
  1019. case 49:
  1020. case 57:
  1021. case 102:
  1022. /* FirstStartTag[CHARACTERS[UNSIGNED_INTEGER]] */
  1023. if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
  1024. encodeNBitUnsignedInteger(stream, 1, 0);
  1025. errn = encodeUnsignedInteger(stream, &val->integer);
  1026. moveOnID = 2;
  1027. } else {
  1028. /* deviant characters */
  1029. encodeNBitUnsignedInteger(stream, 1, 1);
  1030. encodeNBitUnsignedInteger(stream, 3, 6);
  1031. deviantChars = 1;
  1032. }
  1033. break;
  1034. case 45:
  1035. case 122:
  1036. /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  1037. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  1038. encodeNBitUnsignedInteger(stream, 1, 0);
  1039. errn = _encodeNBitIntegerValue(stream, &val->integer, 8, 0);
  1040. moveOnID = 2;
  1041. } else {
  1042. /* deviant characters */
  1043. encodeNBitUnsignedInteger(stream, 1, 1);
  1044. encodeNBitUnsignedInteger(stream, 3, 6);
  1045. deviantChars = 1;
  1046. }
  1047. break;
  1048. case 64:
  1049. case 74:
  1050. case 99:
  1051. case 100:
  1052. case 104:
  1053. case 112:
  1054. case 133:
  1055. case 135:
  1056. /* FirstStartTag[CHARACTERS[DATETIME]] */
  1057. if (val->type == EXI_DATATYPE_DATETIME) {
  1058. encodeNBitUnsignedInteger(stream, 1, 0);
  1059. errn = encodeDateTime(stream, &val->datetime);
  1060. moveOnID = 2;
  1061. } else {
  1062. /* deviant characters */
  1063. encodeNBitUnsignedInteger(stream, 1, 1);
  1064. encodeNBitUnsignedInteger(stream, 3, 6);
  1065. deviantChars = 1;
  1066. }
  1067. break;
  1068. case 1:
  1069. case 75:
  1070. /* Element[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  1071. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  1072. encodeNBitUnsignedInteger(stream, 1, 0);
  1073. errn = _encodeNBitIntegerValue(stream, &val->integer, 8, 0);
  1074. moveOnID = 2;
  1075. } else {
  1076. /* deviant characters */
  1077. encodeNBitUnsignedInteger(stream, 1, 1);
  1078. encodeNBitUnsignedInteger(stream, 2, 2);
  1079. deviantChars = 1;
  1080. }
  1081. break;
  1082. case 68:
  1083. case 69:
  1084. case 76:
  1085. case 89:
  1086. case 93:
  1087. case 138:
  1088. /* FirstStartTag[CHARACTERS[INTEGER]] */
  1089. if (val->type == EXI_DATATYPE_INTEGER) {
  1090. encodeNBitUnsignedInteger(stream, 1, 0);
  1091. errn = encodeInteger(stream, &val->integer);
  1092. moveOnID = 2;
  1093. } else {
  1094. /* deviant characters */
  1095. encodeNBitUnsignedInteger(stream, 1, 1);
  1096. encodeNBitUnsignedInteger(stream, 3, 6);
  1097. deviantChars = 1;
  1098. }
  1099. break;
  1100. case 134:
  1101. /* FirstStartTag[CHARACTERS[NBIT_UNSIGNED_INTEGER]] */
  1102. if (val->type == EXI_DATATYPE_NBIT_UNSIGNED_INTEGER) {
  1103. encodeNBitUnsignedInteger(stream, 1, 0);
  1104. errn = _encodeNBitIntegerValue(stream, &val->integer, 8, -128);
  1105. moveOnID = 2;
  1106. } else {
  1107. /* deviant characters */
  1108. encodeNBitUnsignedInteger(stream, 1, 1);
  1109. encodeNBitUnsignedInteger(stream, 3, 6);
  1110. deviantChars = 1;
  1111. }
  1112. break;
  1113. case 71:
  1114. /* Element[CHARACTERS[ENUMERATION]] */
  1115. if (val->type == EXI_DATATYPE_ENUMERATION) {
  1116. encodeNBitUnsignedInteger(stream, 1, 0);
  1117. errn = encodeNBitUnsignedInteger(stream, 2, val->enumeration);
  1118. moveOnID = 2;
  1119. } else {
  1120. /* deviant characters */
  1121. encodeNBitUnsignedInteger(stream, 1, 1);
  1122. encodeNBitUnsignedInteger(stream, 2, 2);
  1123. deviantChars = 1;
  1124. }
  1125. break;
  1126. case 59:
  1127. case 81:
  1128. case 108:
  1129. case 119:
  1130. case 145:
  1131. /* Element[CHARACTERS[UNSIGNED_INTEGER]] */
  1132. if (val->type == EXI_DATATYPE_UNSIGNED_INTEGER) {
  1133. encodeNBitUnsignedInteger(stream, 1, 0);
  1134. errn = encodeUnsignedInteger(stream, &val->integer);
  1135. moveOnID = 2;
  1136. } else {
  1137. /* deviant characters */
  1138. encodeNBitUnsignedInteger(stream, 1, 1);
  1139. encodeNBitUnsignedInteger(stream, 2, 2);
  1140. deviantChars = 1;
  1141. }
  1142. break;
  1143. case 80:
  1144. /* FirstStartTag[CHARACTERS[BOOLEAN]] */
  1145. if (val->type == EXI_DATATYPE_BOOLEAN) {
  1146. encodeNBitUnsignedInteger(stream, 1, 0);
  1147. errn = encodeBoolean(stream, val->boolean);
  1148. moveOnID = 2;
  1149. } else {
  1150. /* deviant characters */
  1151. encodeNBitUnsignedInteger(stream, 1, 1);
  1152. encodeNBitUnsignedInteger(stream, 3, 6);
  1153. deviantChars = 1;
  1154. }
  1155. break;
  1156. case 63:
  1157. case 82:
  1158. case 84:
  1159. case 88:
  1160. case 121:
  1161. case 123:
  1162. case 126:
  1163. case 139:
  1164. /* Element[CHARACTERS[DATETIME]] */
  1165. if (val->type == EXI_DATATYPE_DATETIME) {
  1166. encodeNBitUnsignedInteger(stream, 1, 0);
  1167. errn = encodeDateTime(stream, &val->datetime);
  1168. moveOnID = 2;
  1169. } else {
  1170. /* deviant characters */
  1171. encodeNBitUnsignedInteger(stream, 1, 1);
  1172. encodeNBitUnsignedInteger(stream, 2, 2);
  1173. deviantChars = 1;
  1174. }
  1175. break;
  1176. case 10:
  1177. case 18:
  1178. case 20:
  1179. case 24:
  1180. case 36:
  1181. case 48:
  1182. case 55:
  1183. case 58:
  1184. case 78:
  1185. case 79:
  1186. case 86:
  1187. case 98:
  1188. case 101:
  1189. case 106:
  1190. case 141:
  1191. case 142:
  1192. case 143:
  1193. /* FirstStartTag[CHARACTERS[STRING]] */
  1194. if (val->type == EXI_DATATYPE_STRING) {
  1195. encodeNBitUnsignedInteger(stream, 1, 0);
  1196. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  1197. moveOnID = 2;
  1198. } else {
  1199. /* deviant characters */
  1200. encodeNBitUnsignedInteger(stream, 1, 1);
  1201. encodeNBitUnsignedInteger(stream, 3, 6);
  1202. deviantChars = 1;
  1203. }
  1204. break;
  1205. case 22:
  1206. /* FirstStartTag[ATTRIBUTE_GENERIC, START_ELEMENT_GENERIC, END_ELEMENT, CHARACTERS_GENERIC[STRING]] */
  1207. if (val->type == EXI_DATATYPE_STRING) {
  1208. encodeNBitUnsignedInteger(stream, 3, 3);
  1209. errn = encodeStringValue(stream, state, state->elementStack[state->stackIndex], &val->str);
  1210. moveOnID = 23;
  1211. } else {
  1212. /* deviant characters */
  1213. encodeNBitUnsignedInteger(stream, 3, 4);
  1214. encodeNBitUnsignedInteger(stream, 3, 5);
  1215. deviantChars = 1;
  1216. }
  1217. break;
  1218. default:
  1219. return EXI_ERROR_UNEXPECTED_CHARACTERS;
  1220. }
  1221. if (currentID < 0) {
  1222. /* TODO runtime rules */
  1223. errn = EXI_ERROR_UNEXPECTED_CHARACTERS;
  1224. } else if (deviantChars) {
  1225. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  1226. } else {
  1227. /* move on */
  1228. state->grammarStack[state->stackIndex] = moveOnID;
  1229. }
  1230. return errn;
  1231. }
  1232. int exiappHandEncodeAttribute(bitstream_t* stream, exi_state_t* state, uint16_t qnameID,
  1233. exi_value_t* val) {
  1234. int16_t moveOnID = 0;
  1235. int16_t currentID = state->grammarStack[state->stackIndex];
  1236. errn = EXI_ERROR_UNEXPECTED_ATTRIBUTE;
  1237. switch (currentID) {
  1238. }
  1239. /* no expected attribute */
  1240. if (currentID < 0) {
  1241. /* runtime element */
  1242. errn = _encode2ndLevelAttribute(stream, state, qnameID, val);
  1243. } else {
  1244. if(moveOnID == 0) {
  1245. /* no action yet */
  1246. #if EXI_appHandSTRICT != 0
  1247. /* no 2nd level events in strict mode for schema-informed grammars */
  1248. errn = EXI_ERROR_UNEXPECTED_ATTRIBUTE;
  1249. #else /* EXI_appHandSTRICT != 0 */
  1250. errn = _encode2ndLevelAttribute(stream, state, qnameID, val);
  1251. #endif /* EXI_appHandSTRICT != 0 */
  1252. } else {
  1253. state->grammarStack[state->stackIndex] = moveOnID;
  1254. }
  1255. }
  1256. return errn;
  1257. }
  1258. int exiappHandEncodeAttributeNS(bitstream_t* stream,
  1259. exi_state_t* state, uint16_t namespaceUriID,
  1260. exi_string_ucs_t* localName, exi_value_t* val) {
  1261. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  1262. }
  1263. int exiappHandEncodeAttributeGeneric(bitstream_t* stream,
  1264. exi_state_t* state, exi_string_ucs_t* namespaceUri,
  1265. exi_string_ucs_t* localName, exi_value_t* val) {
  1266. return EXI_DEVIANT_SUPPORT_NOT_DEPLOYED;
  1267. }
  1268. int exiappHandEncodeAttributeXsiNil(bitstream_t* stream, exi_state_t* state,
  1269. exi_value_t* val) {
  1270. switch (state->grammarStack[state->stackIndex]) {
  1271. }
  1272. if (errn < 0) {
  1273. return errn;
  1274. }
  1275. errn = encodeBoolean(stream, val->boolean);
  1276. if (!errn && val->boolean) {
  1277. /* handle xsi:nil == true */
  1278. errn = exi_appHand_HandleXsiNilTrue(state);
  1279. }
  1280. return errn;
  1281. }
  1282. int exiappHandEncodeAttributeXsiType(bitstream_t* stream, exi_state_t* state,
  1283. exi_value_t* val) {
  1284. /* encode xsi:type event code */
  1285. switch (state->grammarStack[state->stackIndex]) {
  1286. case 46:
  1287. errn = encodeNBitUnsignedInteger(stream, 1, 1);
  1288. if(errn) return errn;
  1289. errn = encodeNBitUnsignedInteger(stream, 3, 1);
  1290. break;
  1291. case 35:
  1292. errn = encodeNBitUnsignedInteger(stream, 1, 1);
  1293. if(errn) return errn;
  1294. errn = encodeNBitUnsignedInteger(stream, 3, 1);
  1295. break;
  1296. default:
  1297. return EXI_ERROR_UNEXPECTED_ATTRIBUTE_XSI_TYPE;
  1298. }
  1299. if (errn) {
  1300. return errn;
  1301. }
  1302. /* encode qname */
  1303. errn = _encodeAttributeXsiTypeContent(stream, state, val);
  1304. return errn;
  1305. }
  1306. #endif