Changeset 95

Show
Ignore:
Timestamp:
03/29/07 19:51:22 (20 months ago)
Author:
matthiasm
Message:

Package reader and writer functional and cleaned up.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • NEWT0/trunk/src/newt_core/NewtPkg.c

    r94 r95  
    2424#include "utils/endian_utils.h" 
    2525 
     26#include <time.h> 
     27 
    2628#undef DEBUG_PKG_DIS 
    2729#define DEBUG_PKG 
     
    3032#endif 
    3133 
     34 
    3235/* macros */ 
    3336 
    34 /// Test first 8 bytes for package signature 
     37/// Test first 8 bytes for any of the package signatures 
    3538#define PkgIsPackage(data) ((strncmp(data, "package0", 8)==0) || (strncmp(data, "package1", 8)==0)) 
    3639 
     
    4750typedef struct { 
    4851    uint8_t     sig[8];         ///< 8 byte signature 
    49     uint8_t     type[4];        ///< 4 bytes describing package class 
     52    uint32_t    type;           ///< 4 bytes describing package class 
    5053    uint32_t    flags;          ///< describing how to store and load the package 
    5154    uint32_t    version;        ///< user definable; higher numbers are newer version 
     
    7275} pkg_part_t; 
    7376 
    74 /// structure to manage the package reading process 
     77/// structure to manage the package reading process  
    7578typedef struct { 
    76     int8_t      verno;          ///< r  package version 0 or 1 
     79    uint8_t     pkg_version;    ///< rw corrsponds to the last charof the signature 
    7780    uint8_t *   data;           ///< rw package data 
    7881    uint32_t    size;           ///< rw size of package 
     
    8285    uint8_t *   var_data;       ///< r  extra data for header 
    8386    uint32_t    var_data_size;  ///< w  size of variable length data block 
     87    uint32_t    directory_size; ///< w  size of all headers plus var data 
    8488    uint32_t    num_parts;      ///< r  number of parts in package 
    8589    pkg_part_t* part_headers;   ///< r  pointer to first part header - can be used as an array 
     
    8791    uint8_t *   part;           ///< r  start of current part data 
    8892    uint32_t    part_offset;    ///< r  offset of current part to the beginning of data 
     93    uint32_t    part_header_offset; ///< r  offset of current part header 
    8994    newtRefVar  instances;      ///< rw array holding the previously generated instance of any ref per part 
    9095    newtRefVar  precedents;     ///< w  array referencing the instances array 
     
    98103 
    99104/* functions */ 
    100 static newtRef  PkgPartGetPrecedent(pkg_stream_t *pkg, newtRefArg r); 
    101 static void     PkgPartSetPrecedent(pkg_stream_t *pkg, newtRefArg r, newtRefArg val); 
    102  
     105 
     106static int32_t  PkgArraySearch(newtRefArg array, newtRefArg r); 
     107static uint32_t PkgAlign(pkg_stream_t *pkg, uint32_t offset); 
     108static uint32_t PkgGetSlotInt(newtRefArg frame, newtRefArg name, uint32_t def); 
     109 
     110static newtRef  PkgPartGetPrecedent(pkg_stream_t *pkg, newtRefArg ref); 
     111static void     PkgPartSetPrecedent(pkg_stream_t *pkg, newtRefArg ref, newtRefArg val); 
     112 
     113static void     PkgMakeRoom(pkg_stream_t *pkg, uint32_t offset, uint32_t size); 
     114static void     PkgWriteData(pkg_stream_t *pkg, uint32_t offset, void *data, uint32_t size); 
     115static void     PkgWriteU32(pkg_stream_t *pkg, uint32_t offset, uint32_t v); 
     116static void     PgkWriteVarData(pkg_stream_t *pkg, uint32_t offset, newtRefVar frame, newtRefVar sym); 
     117static newtRef  PkgWriteFrame(pkg_stream_t *pkg, newtRefArg frame); 
     118static newtRef  PkgWriteArray(pkg_stream_t *pkg, newtRefArg array); 
     119static newtRef  PkgWriteBinary(pkg_stream_t *pkg, newtRefArg obj); 
    103120static newtRef  PkgWriteObject(pkg_stream_t *pkg, newtRefArg obj); 
    104  
     121static void     PkgWritePart(pkg_stream_t *pkg, newtRefArg part); 
     122 
     123static uint32_t PkgReadU32(uint8_t *d) ; 
    105124static newtRef  PkgPartGetInstance(pkg_stream_t *pkg, uint32_t p_obj); 
    106125static void     PkgPartSetInstance(pkg_stream_t *pkg, uint32_t p_obj, newtRefArg r); 
    107  
    108 static uint32_t PkgReadU32(uint8_t *d); 
    109126static newtRef  PkgReadRef(pkg_stream_t *pkg, uint32_t p_obj); 
    110127static newtRef  PkgReadBinaryObject(pkg_stream_t *pkg, uint32_t p_obj); 
     
    112129static newtRef  PkgReadFrameObject(pkg_stream_t *pkg, uint32_t p_obj); 
    113130static newtRef  PkgReadObject(pkg_stream_t *pkg, uint32_t p_obj); 
     131static newtRef  PkgReadNOSPart(pkg_stream_t *pkg); 
    114132static newtRef  PkgReadPart(pkg_stream_t *pkg, int32_t index); 
     133static newtRef  PkgReadVardataBinary(pkg_stream_t *pkg, pkg_info_ref_t *info_ref); 
    115134static newtRef  PkgReadVardataString(pkg_stream_t *pkg, pkg_info_ref_t *info_ref); 
    116 static newtRef  PkgReadVardataBinary(pkg_stream_t *pkg, pkg_info_ref_t *info_ref); 
    117135static newtRef  PkgReadHeader(pkg_stream_t *pkg); 
    118136 
     137 
     138/*------------------------------------------------------------------------*/ 
    119139/** Duplicate of same function in NSOF. 
    120  * Maybe we could make the original file publicly accessible 
     140 * Maybe we should make the original file publicly accessible 
     141 * 
     142 * @see NewtSearchArray(newtRefArg array, newtRefArg r) 
    121143 */ 
    122144int32_t PkgArraySearch(newtRefArg array, newtRefArg r) 
     
    151173    int32_t ix = PkgArraySearch(pkg->precedents, ref); 
    152174    if (ix>=0) { 
    153         printf("*** Multiple: "); 
    154         NewtPrintObject(stdout, ref); 
    155175        return NewtGetArraySlot(pkg->instances, ix); 
    156176    } else { 
     
    169189{ 
    170190    uint32_t n = NewtArrayLength(pkg->instances); 
     191    // the code below gets horribly slow and fragments memory 
     192    // we should consider implementing a binary search tree at some point 
    171193    NewtInsertArraySlot(pkg->instances, n, val); 
    172194    NewtInsertArraySlot(pkg->precedents, n, ref); 
     
    227249    if (pkg->data_size<new_size) { 
    228250        uint32_t os = pkg->data_size; 
    229         uint32_t ns = (new_size+16383) & (~16383); // alocate ein 16k blocks 
     251        uint32_t ns = (new_size+16383) & (~16383); // alocate in 16k blocks 
    230252        pkg->data = realloc(pkg->data, ns); 
    231253        memset(pkg->data+os, 0xbf, ns-os); // filler byte 
     
    442464    PkgWriteU32(pkg, dst+8, klass_ref); 
    443465 
    444     // add a verbose copy of the binary data 
    445     PkgWriteData(pkg, dst+12, data, size-12); 
     466    // copy the binary data over 
     467    if (klass==NSSYM0(int32)) { 
     468        uint32_t *s = (uint32_t*)data; 
     469        uint32_t  v = htonl(*s); 
     470        PkgWriteData(pkg, dst+12, &v, sizeof(v)); 
     471    } else if (klass==NSSYM0(real)) { 
     472        // this code fails miserably if 'double' is not an 8-byte IEEE value! 
     473        double *s = (double*)data; 
     474        double  v = htond(*s); 
     475        PkgWriteData(pkg, dst+12, &v, sizeof(v)); 
     476    } else { 
     477        PkgWriteData(pkg, dst+12, data, size-12); 
     478    } 
    446479 
    447480    return NewtMakePointer(dst); 
     
    461494    newtRef prec; 
    462495 
     496    // FIXME add handling named magic pointers here 
    463497    if (NewtRefIsImmediate(obj)) { 
    464         printf("*** immediate: "); 
    465         NewtPrintObject(stdout, obj); 
     498        // immediates have the same form in memory as in packages 
     499        // immediates include magic pointers 
    466500        return obj; 
    467501    }  
     
    479513        dst = PkgWriteBinary(pkg, obj); 
    480514    } else { 
    481         printf("*** unsupported write: "); 
    482         NewtPrintObject(stdout, obj); 
    483         PkgMakeRoom(pkg, dst, 16); 
    484         PkgWriteU32(pkg, dst, 0xdeadbeef); 
    485         // FIXME add all possible types... 
     515#       ifdef DEBUG_PKG 
     516            // we do not know how to write this object 
     517            printf("*** unsupported write: "); 
     518            NewtPrintObject(stdout, obj); 
     519#       endif 
     520        return kNewtRefNIL; // do not create a precedent 
    486521    } 
    487522 
     
    495530/** Create a part in package format based on this object. 
    496531 *  
     532 * This function makes heavy use of the "pkg" structure, updating all 
     533 * members to allow writing multiple consecutive parts by repeatedly 
     534 * caling this function. Multiple part packages are untested. 
     535 * 
    497536 * @param pkg       [inout] the package 
    498537 * @param part      [in] object containing part data 
     
    500539 * @retval  ref to binary part data 
    501540 */ 
    502 newtRef PkgWritePart(pkg_stream_t *pkg, newtRefArg part) 
     541void PkgWritePart(pkg_stream_t *pkg, newtRefArg part) 
    503542{ 
    504543    uint32_t    dst = pkg->part_offset; 
     544    uint32_t    hdr = pkg->part_header_offset; 
    505545    int32_t     ix; 
    506546    newtRef     data; 
     547    uint32_t    part_size; 
    507548 
    508549    ix = NewtFindSlotIndex(part, NSSYM(data)); 
    509550    if (ix<0)  
    510         return kNewtRefNIL; 
     551        return; 
    511552    data = NewtGetFrameSlot(part, ix); 
    512553 
     
    523564    NewtSetLength(pkg->instances, 0); 
    524565 
    525     return kNewtRefNIL; 
    526 } 
    527  
    528 /*------------------------------------------------------------------------*/ 
    529 /** Create a new binary object that conatins the object tree in package format 
    530  *  
    531  * @param rpkg  [in] object tree describing the package 
     566    PkgMakeRoom(pkg, PkgAlign(pkg, pkg->size), 0); 
     567    part_size = pkg->size - pkg->part_offset; 
     568        // offset 
     569    PkgWriteU32(pkg, hdr, pkg->part_offset - pkg->directory_size); 
     570        // size 
     571    PkgWriteU32(pkg, hdr+4, part_size); 
     572        // size2 
     573    PkgWriteU32(pkg, hdr+8, part_size); 
     574        // type 
     575    PkgWriteU32(pkg, hdr+12, PkgGetSlotInt(part, NSSYM(type), 0x666f726d)); // "form" 
     576        // reserved1 
     577    PkgWriteU32(pkg, hdr+16, 0);  
     578        // flags 
     579    PkgWriteU32(pkg, hdr+20, PkgGetSlotInt(part, NSSYM(flags), 0)); 
     580        // reserved2 
     581    PkgWriteU32(pkg, hdr+28, 0);  
     582 
     583    pkg->part_offset += part_size; 
     584} 
     585 
     586/*------------------------------------------------------------------------*/ 
     587/** Create a new binary object that contains the object tree in package format. 
     588 * 
     589 * This function creates a binary object, containing the representaion of 
     590 * a whole hierarchy of objects in the Newton package format. The binary 
     591 * data can be written directly to disk to create a Newton readable .pkg file. 
     592 *  
     593 * NewtWritePkg was tested on hierarchies created by NewtReadPackage, reading 
     594 * a random bunch of .pkg files containing Newton Script applications. The  
     595 * packages created were identiacla to the original packages. 
     596 * 
     597 * @todo    NewtWritePkg does not support a relocation table yet which may  
     598 *          be needed to save native function of a higher complexity. 
     599 * @todo    Error handling is not yet implemented. 
     600 * @todo    Named magic poiners are not supported yet. 
     601 * @todo    Only NOS parts are currently supported. We still must implement 
     602 *          Protocol parts and Raw parts.  
     603 * 
     604 * @param rpkg  [in] object hierarchy describing the package 
    532605 * 
    533606 * @retval  binary object with package 
     
    536609{ 
    537610    pkg_stream_t    pkg; 
    538     int32_t         num_parts, i, ix, directory_size; 
    539     newtRef         parts; 
    540      
     611    int32_t         num_parts, i, ix; 
     612    newtRef         parts, result; 
     613 
    541614    // setup pkg_stream_t 
    542615    memset(&pkg, 0, sizeof(pkg)); 
     
    548621#   endif /* HAVE_LIBICONV */ 
    549622 
     623    // find the array of parts that we will write 
    550624    ix = NewtFindSlotIndex(package, NSSYM(parts)); 
    551625    if (ix>=0) { 
     
    557631            // sig 
    558632        PkgWriteData(&pkg, 0, "package0", 8); 
     633        pkg.data[7] = (uint8_t)('0' + PkgGetSlotInt(package, NSSYM(pkg_version), 0)); 
    559634            // type 
    560         PkgWriteData(&pkg, 8, "xxxx", 4); 
     635        PkgWriteU32(&pkg, 8, PkgGetSlotInt(package, NSSYM(type), 0x78787878)); // "xxxx" 
    561636            // flags 
    562637        PkgWriteU32(&pkg, 12, PkgGetSlotInt(package, NSSYM(flags), 0)); 
     
    568643        PgkWriteVarData(&pkg, 24, package, NSSYM(name)); 
    569644            // date 
    570         PkgWriteU32(&pkg, 32, 0xc2296aa5); // FIXME some fake creation date 
     645        PkgWriteU32(&pkg, 32, time(0L)+2082844800); 
    571646            // reserved2 
    572647        PkgWriteU32(&pkg, 36, 0);  
     
    588663        } 
    589664 
    590         pkg.part_offset = directory_size = PkgAlign(&pkg, pkg.header_size + pkg.var_data_size); 
     665        pkg.part_offset = pkg.directory_size = PkgAlign(&pkg, pkg.header_size + pkg.var_data_size); 
    591666            // directorySize 
    592         PkgWriteU32(&pkg, 44, directory_size); 
     667        PkgWriteU32(&pkg, 44, pkg.directory_size); 
    593668 
    594669        // create all parts 
    595670        for (i=0; i<num_parts; i++) { 
    596             uint32_t part_size; 
    597             uint32_t hdr = sizeof(pkg_header_t) + i*sizeof(pkg_part_t); 
    598671            newtRef part = NewtGetArraySlot(parts, i); 
    599  
     672            pkg.part_header_offset = sizeof(pkg_header_t) + i*sizeof(pkg_part_t); 
    600673            PkgWritePart(&pkg, part); 
    601             PkgMakeRoom(&pkg, PkgAlign(&pkg, pkg.size), 0); 
    602             part_size = pkg.size - pkg.part_offset; 
    603                 // offset 
    604             PkgWriteU32(&pkg, hdr, pkg.part_offset - directory_size); 
    605                 // size & size2 
    606             PkgWriteU32(&pkg, hdr+4, part_size); 
    607             PkgWriteU32(&pkg, hdr+8, part_size); 
    608                 // type 
    609             // FIXME the 'type' field is actually always a fourcc like 'form' 
    610             // FIXME which Newt object should we use here? Binary? Int32? Symbol? 
    611             PkgWriteU32(&pkg, hdr+12, PkgGetSlotInt(part, NSSYM(type), 0x666f726d));  
    612                 // reserved1 
    613             PkgWriteU32(&pkg, hdr+16, 0);  
    614                 // flags 
    615             PkgWriteU32(&pkg, hdr+20, PkgGetSlotInt(part, NSSYM(flags), 0)); 
    616                 // reserved2 
    617             PkgWriteU32(&pkg, hdr+28, 0);  
    618  
    619             pkg.part_offset += part_size; 
    620674        } 
    621675    } 
     
    625679    PkgWriteU32(&pkg, 28, pkg.size); 
    626680 
    627     // convert pkg_stream_t into binary package 
    628     // return new object 
    629  
    630     {   FILE *f = fopen("d:/home/matt/dev/Newton/ntk2/helloWRT.pkg", "wb"); 
    631         fwrite(pkg.data, 1, pkg.size, f); 
    632         fclose(f); 
    633     } 
     681    result = NewtMakeBinary(NSSYM(package), pkg.data, pkg.size, false); 
     682 
     683    // clean up our allocations 
     684    if (pkg.data)  
     685        free(pkg.data); 
    634686 
    635687#   ifdef HAVE_LIBICONV 
     
    637689#   endif /* HAVE_LIBICONV */ 
    638690 
    639     return kNewtRefNIL; 
     691    return result; 
    640692} 
    641693 
     
    700752        break; 
    701753    case 2: // special 
    702         if (ref==kNewtRefTRUE) result = kNewtRefTRUE; 
    703         else if (ref==kNewtRefNIL) result = kNewtRefNIL; 
    704         else if (ref&0x0f==0x0a) result = NewtMakeCharacter(ref>>4); 
    705         else if (ref==kNewtSymbolClass) result = kNewtSymbolClass; 
    706         else { 
    707 #           ifdef DEBUG_PKG 
    708                 printf("*** PkgReader: PkgReadRef - unknown ref 0x%08x\n", ref); 
    709 #           endif 
    710             result = ref;  
    711         } 
     754        // special refs are immedites, encoded in the same format in 
     755        // memory as in package files (at least for all instances I could find) 
     756        result = ref;  
    712757        break; 
    713758    case 3: // magic pointer 
    714 #       ifdef __NAMED_MAGIC_POINTER__ 
    715             result = kNewtRefNIL; // not implemented 
    716 #       else 
    717             result = ref; // already a correct magic pointer 
    718 #       endif 
     759        // FIXME we must implement special code for name magic pointers here! 
     760        result = ref; // already a correct magic pointer 
    719761        break; 
    720762    } 
     
    748790            char *buf = NewtIconv(pkg->from_utf16, src, sze, &buflen); 
    749791            if (buf) { 
    750                 result = NewtMakeString2(buf, buflen-1, false); // NewtMakeString2 appends another null 
     792                result = NewtMakeString2(buf, buflen-1, true); // NewtMakeString2 appends another null 
    751793            } 
    752794#       endif /* HAVE_LIBICONV */ 
    753795        if (result==kNewtRefNIL) 
    754             result = NewtMakeString2(src, sze, false); 
     796            result = NewtMakeString2(src, sze, true); 
    755797    } else if (klass==NSSYM0(int32)) { 
    756798        uint32_t v = PkgReadU32(pkg->data + p_obj + 12); 
     
    760802        result = NewtMakeReal(ntohd(*v)); 
    761803    } else if (klass==NSSYM0(instructions)) { 
    762         result = NewtMakeBinary(klass, pkg->data + p_obj + 12, size-12, false); 
     804        result = NewtMakeBinary(klass, pkg->data + p_obj + 12, size-12, true); 
    763805#       ifdef DEBUG_PKG_DIS 
    764806            printf("*** PkgReader: PkgReadBinaryObject - dumping byte code\n"); 
     
    766808#       endif 
    767809    } else { 
    768         // bits: the bits in the icon 
    769         // mask: the transparency mask for the icon 
    770810#       ifdef DEBUG_PKG 
     811            // This output is helpful to find more binary classes that may need  
     812            // endianness fixes like the floating point class 
    771813            if (klass) { 
    772814                printf("*** PkgReader: PkgReadBinaryObject - unknown class "); 
     
    774816            } 
    775817#       endif 
    776         result = NewtMakeBinary(klass, pkg->data + p_obj + 12, size-12, false); 
     818        result = NewtMakeBinary(klass, pkg->data + p_obj + 12, size-12, true); 
    777819    } 
    778820 
     
    891933    newtRefVar  result; 
    892934 
    893     // verify that we have a correct header  
     935    // verify that we have a correct lead-in  
    894936    if (PkgReadU32(pkg->part)!=0x00001041 || PkgReadU32(pkg->part+8)!=0x00000002) { 
    895937#       ifdef DEBUG_PKG 
     
    900942    } 
    901943     
    902     // create an array that holds a ref to all creted objects, avoiding double instantiation 
    903     if (pkg->instances)  
    904         NewtSetLength(pkg->instances, ntohl(pkg->part_header->size)/4); 
    905     else 
    906         pkg->instances = NewtMakeArray(kNewtRefUnbind, ntohl(pkg->part_header->size)/4); 
     944    // create an array that holds a ref to all created objects, avoiding double instantiation 
     945    pkg->instances = NewtMakeArray(kNewtRefUnbind, ntohl(pkg->part_header->size)/4); 
    907946 
    908947    // now recursively load all objects 
     
    944983 
    945984    NcSetSlot(frame, NSSYM(flags), NewtMakeInt32(flags)); 
    946     NcSetSlot(frame, NSSYM(type), NewtMakeBinary(kNewtRefUnbind,  
    947                 (uint8_t*)&pkg->part_header->type, 4, true)); 
     985    NcSetSlot(frame, NSSYM(type), NewtMakeInt32(ntohl(pkg->part_header->type))); 
    948986 
    949987    switch (flags&0x03) { 
     
    10011039            char *buf = NewtIconv(pkg->from_utf16, src, size, &buflen); 
    10021040            if (buf) { 
    1003                 return NewtMakeString2(buf, buflen-1, false); 
     1041                return NewtMakeString2(buf, buflen-1, true); 
    10041042            } 
    10051043#       endif /* HAVE_LIBICONV */ 
    1006         return NewtMakeString2(src, size, false); 
     1044        return NewtMakeString2(src, size, true); 
    10071045    } 
    10081046} 
     
    10191057    newtRefVar  fnv[] = { 
    10201058                            NS_CLASS,               NSSYM(PackageHeader), 
     1059                            NSSYM(type),            kNewtRefNIL, 
     1060                            NSSYM(pkg_version),     kNewtRefNIL, 
    10211061                            NSSYM(version),         kNewtRefNIL, 
    10221062                            NSSYM(copyright),       kNewtRefNIL, 
     
    10281068    newtRefVar  parts; 
    10291069 
    1030     NcSetSlot(frame, NSSYM(flags), NewtMakeInt32(ntohl(pkg->header->flags))); 
     1070    NcSetSlot(frame, NSSYM(type), NewtMakeInt32(ntohl(pkg->header->type))); 
     1071    NcSetSlot(frame, NSSYM(pkg_version), NewtMakeInteger(pkg->pkg_version)); 
    10311072    NcSetSlot(frame, NSSYM(version), NewtMakeInt32(ntohl(pkg->header->version))); 
    10321073    NcSetSlot(frame, NSSYM(copyright), PkgReadVardataString(pkg, &pkg->header->copyright)); 
    10331074    NcSetSlot(frame, NSSYM(name), PkgReadVardataString(pkg, &pkg->header->name)); 
    1034     // all other header values can be derived form the archive itself 
    1035     // or can be calculated at creation time 
     1075    NcSetSlot(frame, NSSYM(flags), NewtMakeInt32(ntohl(pkg->header->flags))); 
    10361076 
    10371077    parts = NewtMakeArray(kNewtRefNIL, pkg->num_parts); 
     
    10551095/** Read a Package and create an array of parts 
    10561096 * 
     1097 * This function creates a hierarchy of Newt objects from a block of data 
     1098 * interpreted as Package data. Usually this data would be a verbatim 
     1099 * copy of a .pkg file. 
     1100 * 
     1101 * NewtReadPkg was tested on a random bunch of .pkg files containing Newton 
     1102 * Script applications.  
     1103 * 
     1104 * The iconv library is required at compile-time to read Newton-compatible  
     1105 * packages.  
     1106 * 
     1107 * @todo    NewtReadPkg does not support a relocation table yet which may  
     1108 *          be needed to load native function of a higher complexity. 
     1109 * @todo    Error handling is not yet implemented. 
     1110 * @todo    Named magic poiners are not supported yet. 
     1111 * @todo    Only NOS parts are currently supported. We still must implement 
     1112 *          Protocol parts and Raw parts.  
     1113 * @todo    A function should be added that creates a working default  
     1114 *          Package hierarchy. 
     1115 * 
    10571116 * @param data      [in] Package data memory, can be read-only 
    10581117 * @param size      [in] size of memory array 
    10591118 * 
    1060  * @retval  Newt array containing all parts of the Package 
    1061  *  
    1062  * @todo    There is no support for relocation data yet. 
     1119 * @retval  Newt array containing some descriptions and all parts of the Package 
    10631120 */ 
    10641121newtRef NewtReadPkg(uint8_t * data, size_t size) 
     
    10741131 
    10751132    memset(&pkg, 0, sizeof(pkg)); 
    1076     pkg.verno = data[7]-'0'; 
     1133    pkg.pkg_version = data[7]-'0'; 
    10771134    pkg.data = data; 
    10781135    pkg.size = size;