diff --git a/atom/genStruct.js b/atom/genStruct.js index 74b0371..8e81ee8 100644 --- a/atom/genStruct.js +++ b/atom/genStruct.js @@ -5,17 +5,13 @@ Array.prototype.nonull = function () { }; var atoms = { - fileType: { - cc4: 'ftyp', - fields: [ - ], - }, - movie: { cc4: 'moov', - atoms: [ - ['header', '*movieHeader'], - ['tracks', '[]*track'], + fields: [ + ['$atoms', [ + ['header', '*movieHeader'], + ['tracks', '[]*track'], + ]], ], }, @@ -44,9 +40,11 @@ var atoms = { track: { cc4: 'trak', - atoms: [ - ['header', '*trackHeader'], - ['media', '*media'], + fields: [ + ['$atoms', [ + ['header', '*trackHeader'], + ['media', '*media'], + ]], ], }, @@ -77,10 +75,12 @@ var atoms = { media: { cc4: 'mdia', - atoms: [ - ['header', '*mediaHeader'], - ['info', '*mediaInfo'], - ['hdlr', '*handlerRefer'], + fields: [ + ['$atoms', [ + ['header', '*mediaHeader'], + ['info', '*mediaInfo'], + ['hdlr', '*handlerRefer'], + ]], ], }, @@ -100,10 +100,12 @@ var atoms = { mediaInfo: { cc4: 'minf', - atoms: [ - ['sound', '*soundMediaInfo'], - ['video', '*videoMediaInfo'], - ['sample', '*sampleTable'], + fields: [ + ['$atoms', [ + ['sound', '*soundMediaInfo'], + ['video', '*videoMediaInfo'], + ['sample', '*sampleTable'], + ]], ], }, @@ -129,14 +131,16 @@ var atoms = { sampleTable: { cc4: 'stbl', - atoms: [ - ['sampleDesc', '*sampleDesc'], - ['timeToSample', '*timeToSample'], - ['compositionOffset', '*compositionOffset'], - ['sampleToChunk', '*sampleToChunk'], - ['syncSample', '*syncSample'], - ['chunkOffset', '*chunkOffset'], - ['sampleSize', '*sampleSize'], + fields: [ + ['$atoms', [ + ['sampleDesc', '*sampleDesc'], + ['timeToSample', '*timeToSample'], + ['compositionOffset', '*compositionOffset'], + ['sampleToChunk', '*sampleToChunk'], + ['syncSample', '*syncSample'], + ['chunkOffset', '*chunkOffset'], + ['sampleSize', '*sampleSize'], + ]], ], }, @@ -268,12 +272,12 @@ var DeclReadFunc = (opts) => { }; var elemTypeStr = type => typeStr(Object.assign({}, type, {arr: false})); - var ReadAtoms = () => [ + var ReadAtoms = fields => [ For(`r.N > 0`, [ DeclVar('cc4', 'string'), DeclVar('ar', '*io.LimitedReader'), CallCheckAssign('ReadAtomHeader', ['r', '""'], ['ar', 'cc4']), - Switch('cc4', opts.fields.map(field => [ + Switch('cc4', fields.map(field => [ `"${atoms[field.type.struct].cc4}"`, [ field.type.arr ? [ DeclVar('item', elemTypeStr(field.type)), @@ -302,6 +306,8 @@ var DeclReadFunc = (opts) => { var ReadField = (name, type) => { if (name == '_') return CallCheckAssign('ReadDummy', ['r', type.len], ['_']); + if (name == '$atoms') + return ReadAtoms(type.list); if (type.arr && type.fn != 'Bytes') return ReadArr('self.'+name, type); return ReadCommnType('self.'+name, type); @@ -321,7 +327,7 @@ var DeclReadFunc = (opts) => { [[ptr?'res':'self', (ptr?'*':'')+opts.type], ['err', 'error']], [ ptr && `self := &${opts.type}{}`, - !opts.atoms ? ReadFields() : ReadAtoms(), + ReadFields(), ptr && `res = self`, ] ); @@ -338,7 +344,7 @@ var DeclWriteFunc = (opts) => { CallCheckAssign('aw.Close', [], []), ]; - var WriteAtoms = () => opts.fields.map(field => { + var WriteAtoms = fields => fields.map(field => { var name = 'self.'+field.name; return [ `if ${name} != nil {`, @@ -369,6 +375,8 @@ var DeclWriteFunc = (opts) => { var WriteField = (name, type) => { if (name == '_') return CallCheckAssign('WriteDummy', ['w', type.len], []); + if (name == '$atoms') + return WriteAtoms(type.list); if (type.arr && type.fn != 'Bytes') return WriteArr('self.'+name, type); return WriteCommnType('self.'+name, type); @@ -382,7 +390,7 @@ var DeclWriteFunc = (opts) => { [['err', 'error']], [ opts.cc4 && SavePos, - opts.atoms ? WriteAtoms() : WriteFields(), + WriteFields(), opts.cc4 && RestorePosSetSize, ] ); @@ -527,39 +535,44 @@ var nameShouldHide = (name) => name == '_' var allStmts = () => { var stmts = []; + var parseFields = fields => fields.map(field => { + return { + name: uc(field[0]), + type: field[0] == '$atoms' ? {list: parseFields(field[1])} : parseType(field[1]), + }; + }); + + var genStructFields = fields => fields.map(field => { + if (field.name == '_') + return; + if (field.name == '$atoms') + return field.type.list; + return [field]; + }).nonull().reduce((prev, cur) => prev.concat(cur)).map(field => [ + field.name, typeStr(field.type)]); + for (var k in atoms) { var atom = atoms[k]; var name = uc(k); - var fields = (atom.fields || atom.atoms); - if (fields == null) + if (atom.fields == null) continue; - fields = fields.map(field => { - return { - name: uc(field[0]), - type: parseType(field[1]), - }; - }); + var fields = parseFields(atom.fields); stmts = stmts.concat([ - DeclStruct(name, fields.map(field => !nameShouldHide(field.name) && [ - uc(field.name), - typeStr(field.type), - ]).nonull()), + DeclStruct(name, genStructFields(fields)), DeclReadFunc({ type: name, fields: fields, cc4: atom.cc4, - atoms: atom.atoms != null, }), DeclWriteFunc({ type: name, fields: fields, cc4: atom.cc4, - atoms: atom.atoms != null, }), ]); } diff --git a/atom/struct.go b/atom/struct.go index 5fad356..a7f4286 100644 --- a/atom/struct.go +++ b/atom/struct.go @@ -5,30 +5,6 @@ import ( "io" ) -type FileType struct { -} - -func ReadFileType(r *io.LimitedReader) (res *FileType, err error) { - - self := &FileType{} - - res = self - return -} -func WriteFileType(w io.WriteSeeker, self *FileType) (err error) { - - var aw *Writer - if aw, err = WriteAtomHeader(w, "ftyp"); err != nil { - return - } - w = aw - - if err = aw.Close(); err != nil { - return - } - return -} - type Movie struct { Header *MovieHeader Tracks []*Track