Skip to content

Commit 80e4f96

Browse files
authored
Add test case, normalize debug statements (#97)
* Add exipd run example for sequenceUnbounded to README * Update sequenceUnbounded test case README * Normalize debug INFO messages
1 parent 6c3918c commit 80e4f96

4 files changed

Lines changed: 64 additions & 22 deletions

File tree

AGENTS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ All new source files should include the standard EXIP header:
7272
- **Constants**: UPPER_SNAKE_CASE (e.g., `EXIP_OK`, `INDEX_MAX`)
7373
- **Macros**: UPPER_SNAKE_CASE (e.g., `SET_STRICT`, `WITH_COMPRESSION`)
7474

75+
### Comments
76+
77+
Code should be self-documenting through clear naming. Only add comments for non-obvious logic (invariants, constraints, edge cases, missing implementation) or W3C EXI/XML Schema specification references. Public APIs in `include/` use Doxygen-style documentation.
78+
7579
### File Organization
7680

7781
```

src/contentIO/src/bodyDecode.c

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static errorCode handleProduction(EXIStream* strm, Production* prodHit, SmallInd
137137
}
138138
break;
139139
case EVENT_EE:
140-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, ("> EE event:\n"));
140+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">EE event:\n"));
141141
strm->context.isNilType = false;
142142
if(handler->endElement != NULL)
143143
{
@@ -232,6 +232,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
232232
{
233233
case 0:
234234
// StartTagContent : EE event
235+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">EE event:\n"));
235236
strm->context.isNilType = false;
236237
if(handler->endElement != NULL)
237238
{
@@ -245,6 +246,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
245246
break;
246247
case 1:
247248
// StartTagContent : AT(*) event
249+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(*) event:\n"));
248250
*nonTermID_out = GR_START_TAG_CONTENT;
249251

250252
TRY(decodeATWildcardEvent(strm, handler, nonTermID_out, app_data));
@@ -265,22 +267,25 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
265267
break;
266268
case 2:
267269
// StartTagContent : NS event
270+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">NS event:\n"));
268271
TRY(decodeNSEvent(strm, handler, nonTermID_out, app_data));
269272
break;
270273
case 3:
271274
// StartTagContent : SC event
275+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SC event:\n"));
272276
return EXIP_NOT_IMPLEMENTED_YET;
273277
break;
274278
case 4:
275279
// SE(*) event
280+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SE(*) event:\n"));
276281
strm->gStack->currNonTermID = GR_ELEMENT_CONTENT;
277282

278283
TRY(decodeSEWildcardEvent(strm, handler, nonTermID_out, app_data));
279284
TRY(insertZeroProduction((DynGrammarRule*) currentRule, EVENT_SE_QNAME, GR_ELEMENT_CONTENT, &strm->gStack->currQNameID, 1));
280285
break;
281286
case 5:
282287
// CH event
283-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event\n"));
288+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event:\n"));
284289

285290
*nonTermID_out = GR_ELEMENT_CONTENT;
286291

@@ -290,10 +295,12 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
290295
break;
291296
case 6:
292297
// ER event
298+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">ER event:\n"));
293299
return EXIP_NOT_IMPLEMENTED_YET;
294300
break;
295301
case 7:
296302
// CM or PI event
303+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CM/PI event:\n"));
297304
return EXIP_NOT_IMPLEMENTED_YET;
298305
break;
299306
default:
@@ -461,7 +468,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
461468
{
462469
case 0:
463470
// AT(xsi:type) event
464-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:type) event\n"));
471+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:type) event:\n"));
465472
strm->context.currAttr.uriId = XML_SCHEMA_INSTANCE_ID;
466473
strm->context.currAttr.lnId = XML_SCHEMA_INSTANCE_TYPE_ID;
467474
qname.uri = &strm->schema->uriTable.uri[strm->context.currAttr.uriId].uriStr;
@@ -479,7 +486,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
479486
if(nil == true)
480487
strm->context.isNilType = true;
481488

482-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:nil) event\n"));
489+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:nil) event:\n"));
483490
strm->context.currAttr.uriId = XML_SCHEMA_INSTANCE_ID;
484491
strm->context.currAttr.lnId = XML_SCHEMA_INSTANCE_NIL_ID;
485492
qname.uri = &strm->schema->uriTable.uri[strm->context.currAttr.uriId].uriStr;
@@ -599,6 +606,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
599606
{
600607
case 0:
601608
// EE event
609+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">EE event:\n"));
602610
strm->context.isNilType = false;
603611
if(handler->endElement != NULL)
604612
{
@@ -608,7 +616,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
608616
break;
609617
case 1:
610618
// AT(xsi:type) event
611-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:type) event\n"));
619+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:type) event:\n"));
612620
strm->context.currAttr.uriId = XML_SCHEMA_INSTANCE_ID;
613621
strm->context.currAttr.lnId = XML_SCHEMA_INSTANCE_TYPE_ID;
614622
qname.uri = &strm->schema->uriTable.uri[strm->context.currAttr.uriId].uriStr;
@@ -628,7 +636,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
628636
if(nil == true)
629637
strm->context.isNilType = true;
630638

631-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:nil) event\n"));
639+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(xsi:nil) event:\n"));
632640
strm->context.currAttr.uriId = XML_SCHEMA_INSTANCE_ID;
633641
strm->context.currAttr.lnId = XML_SCHEMA_INSTANCE_NIL_ID;
634642
qname.uri = &strm->schema->uriTable.uri[strm->context.currAttr.uriId].uriStr;
@@ -648,23 +656,28 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
648656
break;
649657
case 3:
650658
// AT(*)
659+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(*) event:\n"));
651660
*nonTermID_out = strm->gStack->currNonTermID;
652661
TRY(decodeATWildcardEvent(strm, handler, nonTermID_out, app_data));
653662
break;
654663
case 4:
655664
// third level AT: eighter AT (qname) [untyped value] or AT (*) [untyped value]
665+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(untyped) event:\n"));
656666
return EXIP_NOT_IMPLEMENTED_YET;
657667
break;
658668
case 5:
659669
// NS Element i, 0
670+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">NS event:\n"));
660671
TRY(decodeNSEvent(strm, handler, nonTermID_out, app_data));
661672
break;
662673
case 6:
663674
// SC event
675+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SC event:\n"));
664676
return EXIP_NOT_IMPLEMENTED_YET;
665677
break;
666678
case 7:
667679
// SE(*) content|same_rule
680+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SE(*) event:\n"));
668681
if(isContent2Grammar || strm->gStack->currNonTermID < GET_CONTENT_INDEX(strm->gStack->grammar->props))
669682
{
670683
// currNonTermID should point to the content grammar rule
@@ -677,7 +690,7 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
677690
break;
678691
case 8:
679692
// CH [untyped value] content|same_rule
680-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event\n"));
693+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event:\n"));
681694
if(isContent2Grammar || strm->gStack->currNonTermID < GET_CONTENT_INDEX(strm->gStack->grammar->props))
682695
{
683696
// nonTermID_out should point to the content grammar rule
@@ -692,10 +705,12 @@ static errorCode stateMachineProdDecode(EXIStream* strm, GrammarRule* currentRul
692705
break;
693706
case 9:
694707
// ER event
708+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">ER event:\n"));
695709
return EXIP_NOT_IMPLEMENTED_YET;
696710
break;
697711
case 10:
698712
// third level: CM or PI event
713+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CM/PI event:\n"));
699714
return EXIP_NOT_IMPLEMENTED_YET;
700715
break;
701716
default:
@@ -728,7 +743,7 @@ errorCode decodeQName(EXIStream* strm, QName* qname, QNameID* qnameID)
728743
{
729744
errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;
730745

731-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Decoding QName\n"));
746+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Decoding: QName\n"));
732747

733748
TRY(decodeUri(strm, &qnameID->uriId));
734749
qname->uri = &(strm->schema->uriTable.uri[qnameID->uriId].uriStr);
@@ -748,13 +763,13 @@ errorCode decodeUri(EXIStream* strm, SmallIndex* uriId)
748763
if(tmp_val_buf == 0) // uri miss
749764
{
750765
String str;
751-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">URI miss\n"));
766+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">URI: miss\n"));
752767
TRY(decodeString(strm, &str));
753768
TRY(addUriEntry(&strm->schema->uriTable, str, uriId));
754769
}
755770
else // uri hit
756771
{
757-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">URI hit\n"));
772+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">URI: hit\n"));
758773
*uriId = (SmallIndex) (tmp_val_buf - 1);
759774
if(*uriId >= strm->schema->uriTable.count)
760775
return EXIP_INVALID_EXI_INPUT;
@@ -774,7 +789,7 @@ errorCode decodeLn(EXIStream* strm, Index uriId, Index* lnId)
774789
{
775790
unsigned long l_lnId;
776791
unsigned char lnBits = getBitsNumber((unsigned int)(strm->schema->uriTable.uri[uriId].lnTable.count - 1));
777-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">local-name table hit\n"));
792+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">local-name table: hit\n"));
778793
TRY(decodeNBitUnsignedInteger(strm, lnBits, &l_lnId));
779794

780795
if(l_lnId >= strm->schema->uriTable.uri[uriId].lnTable.count)
@@ -784,7 +799,7 @@ errorCode decodeLn(EXIStream* strm, Index uriId, Index* lnId)
784799
else // local-name table miss
785800
{
786801
String lnStr;
787-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">local-name table miss\n"));
802+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">local-name table: miss\n"));
788803

789804
TRY(allocateStringMemoryManaged(&(lnStr.str),(Index) (tmpVar - 1), &strm->memList));
790805
TRY(decodeStringOnly(strm, (Index)tmpVar - 1, &lnStr));
@@ -840,13 +855,13 @@ errorCode decodePfx(EXIStream* strm, SmallIndex uriId, SmallIndex* pfxId)
840855
if(tmp_val_buf == 0) // prefix miss
841856
{
842857
String str;
843-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Prefix miss\n"));
858+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Prefix: miss\n"));
844859
TRY(decodeString(strm, &str));
845860
TRY(addPfxEntry(&strm->schema->uriTable.uri[uriId].pfxTable, str, pfxId));
846861
}
847862
else // prefix hit
848863
{
849-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Prefix hit\n"));
864+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Prefix: hit\n"));
850865
*pfxId = (SmallIndex) (tmp_val_buf-1);
851866
if(*pfxId >= strm->schema->uriTable.uri[uriId].pfxTable.count)
852867
return EXIP_INVALID_EXI_INPUT;
@@ -883,7 +898,7 @@ errorCode decodeStringValue(EXIStream* strm, QNameID qnameID, String* value)
883898
{
884899
unsigned long valueEntryID = 0;
885900
unsigned char valueBits;
886-
901+
887902
valueBits = getBitsNumber(strm->valueTable.count - 1);
888903
TRY(decodeNBitUnsignedInteger(strm, valueBits, &valueEntryID));
889904

@@ -971,7 +986,7 @@ errorCode decodeEventContent(EXIStream* strm, Production* prodHit, ContentHandle
971986
break;
972987
case EVENT_AT_QNAME:
973988
{
974-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(qname) event\n"));
989+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(qname) event:\n"));
975990
strm->context.currAttr = prodHit->qnameId;
976991
qname.uri = &strm->schema->uriTable.uri[strm->context.currAttr.uriId].uriStr;
977992
qname.localName = &GET_LN_URI_QNAME(strm->schema->uriTable, prodHit->qnameId).lnStr;
@@ -991,7 +1006,7 @@ errorCode decodeEventContent(EXIStream* strm, Production* prodHit, ContentHandle
9911006
break;
9921007
case EVENT_CH:
9931008
{
994-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event\n"));
1009+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">CH event:\n"));
9951010
assert(strm->context.isNilType == false);
9961011
TRY(decodeValueItem(strm, prodHit->typeId, handler, nonTermID_out, strm->gStack->currQNameID, app_data));
9971012
}
@@ -1079,7 +1094,7 @@ errorCode decodeValueItem(EXIStream* strm, Index typeId, ContentHandler* handler
10791094
case VALUE_TYPE_FLOAT:
10801095
{
10811096
Float flVal;
1082-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Float value\n"));
1097+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Value: Float\n"));
10831098
TRY(decodeFloatValue(strm, &flVal));
10841099
if(handler->floatData != NULL) // Invoke handler method
10851100
{
@@ -1119,7 +1134,7 @@ errorCode decodeValueItem(EXIStream* strm, Index typeId, ContentHandler* handler
11191134
{
11201135
TRY_CATCH(handler->binaryData(binary_val, nbytes, app_data), EXIP_MFREE(binary_val));
11211136
}
1122-
1137+
11231138
/* Free the memory allocated by decodeBinary() */
11241139
EXIP_MFREE(binary_val);
11251140
}
@@ -1297,7 +1312,7 @@ errorCode decodeSEWildcardEvent(EXIStream* strm, ContentHandler* handler, SmallI
12971312
QName qname;
12981313
QNameID qnameId = {URI_MAX, LN_MAX};
12991314

1300-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SE(*) event\n"));
1315+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">SE(*) event:\n"));
13011316

13021317
// The content of SE event is the element qname
13031318
TRY(decodeQName(strm, &qname, &qnameId));
@@ -1431,7 +1446,7 @@ errorCode decodeATWildcardEvent(EXIStream* strm, ContentHandler* handler, SmallI
14311446
QName qname;
14321447
QNameID qnameId = {URI_MAX, LN_MAX};
14331448

1434-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(*) event\n"));
1449+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">AT(*) event:\n"));
14351450

14361451
TRY(decodeQName(strm, &qname, &qnameId));
14371452

src/contentIO/src/bodyEncode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ errorCode encodeQName(EXIStream* strm, QName qname, EventType eventT, QNameID* q
635635
{
636636
errorCode tmp_err_code = EXIP_UNEXPECTED_ERROR;
637637

638-
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Encoding QName\n"));
638+
DEBUG_MSG(INFO, DEBUG_CONTENT_IO, (">Encoding: QName\n"));
639639

640640
/******* Start: URI **********/
641641
TRY(encodeUri(strm, (String*) qname.uri, &qnameID->uriId));

tests/test-set/sequenceUnbounded/README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,26 @@ Incomplete - the minimal schema here does **not** trigger the collision. The `te
2222
- `test.xsd.exi` - EXI-encoded schema
2323
- `test.xml` - Sample data
2424
- `test.xml.exi` - EXI-encoded data
25+
26+
### Full Test Command
27+
28+
Currently the test mentioned above does not decode the `test.xml.exi` file but we can test via the following command which could be added to examples which serves as additional tests.
29+
30+
**Windows:**
31+
32+
```sh
33+
./build/vs2022/Debug/exipd.exe -xml -schema=tests/test-set/sequenceUnbounded/test.xsd.exi tests/test-set/sequenceUnbounded/test.xml.exi
34+
```
35+
36+
**Linux/macOS:**
37+
38+
```sh
39+
./bin/examples/exipd -xml -schema=tests/test-set/sequenceUnbounded/test.xsd.exi tests/test-set/sequenceUnbounded/test.xml.exi
40+
```
41+
42+
**Grammar:**
43+
44+
Use the path above for Windows, just replace to `exipg.exe`.
45+
```sh
46+
./bin/utils/exipg -text -schema=tests/test-set/sequenceUnbounded/test.xsd.exi
47+
```

0 commit comments

Comments
 (0)