diff --git a/src/datatypes/structures.js b/src/datatypes/structures.js index 4c6f695..513e658 100644 --- a/src/datatypes/structures.js +++ b/src/datatypes/structures.js @@ -21,11 +21,17 @@ function readArray(buffer, offset, typeArgs, rootNode) { size: 0 }; var count; - if(typeof typeArgs.count === "object") { + if(typeof typeArgs.count === "object") count = evalCount(typeArgs.count, rootNode); - } - else + else if (typeof typeArgs.count !== "undefined") count = getField(typeArgs.count, rootNode); + else if (typeof typeArgs.countType !== "undefined") { + var countResults = this.read(buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + results.size += countResults.size; + offset += countResults.size; + count = countResults.value; + } else // TODO : broken schema, should probably error out. + count = 0; for(var i = 0; i < count; i++) { var readResults = this.read(buffer, offset, {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); results.size += readResults.size; @@ -36,6 +42,11 @@ function readArray(buffer, offset, typeArgs, rootNode) { } function writeArray(value, buffer, offset, typeArgs, rootNode) { + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + offset = this.write(value.length, buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } else if (typeof typeArgs.count === "undefined") { // Broken schema, should probably error out + } for(var index in value) { offset = this.write(value[index], buffer, offset, {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); } @@ -44,6 +55,10 @@ function writeArray(value, buffer, offset, typeArgs, rootNode) { function sizeOfArray(value, typeArgs, rootNode) { var size = 0; + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + size = this.sizeOf(value.length, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } for(var index in value) { size += this.sizeOf(value[index], {type: typeArgs.type, typeArgs: typeArgs.typeArgs}, rootNode); } diff --git a/src/datatypes/utils.js b/src/datatypes/utils.js index 4604e26..d4c7c52 100644 --- a/src/datatypes/utils.js +++ b/src/datatypes/utils.js @@ -97,18 +97,37 @@ function writeBool(value, buffer, offset) { function readBuffer(buffer, offset, typeArgs, rootNode) { - var count = getField(typeArgs.count, rootNode); + var size = 0; + var count; + if (typeof typeArgs.count !== "undefined") + count = getField(typeArgs.count, rootNode); + else if (typeof typeArgs.countType !== "undefined") { + var countResults = this.read(buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + size += countResults.size; + offset += countResults.size; + count = countResults.value; + } return { value: buffer.slice(offset, offset + count), - size: count + size: size + count }; } -function writeBuffer(value, buffer, offset) { +function writeBuffer(value, buffer, offset, typeArgs, rootNode) { + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + offset = this.write(value.length, buffer, offset, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } else if (typeof typeArgs.count === "undefined") { // Broken schema, should probably error out + } value.copy(buffer, offset); return offset + value.length; } -function sizeOfBuffer(value) { - return value.length; +function sizeOfBuffer(value, typeArgs, rootNode) { + var size = 0; + if (typeof typeArgs.count === "undefined" && + typeof typeArgs.countType !== "undefined") { + size = this.sizeOf(value.length, { type: typeArgs.countType, typeArgs: typeArgs.countTypeArgs }, rootNode); + } + return size + value.length; }