Changeset 136 for NEWT0/trunk


Ignore:
Timestamp:
02/17/09 04:50:42 (3 years ago)
Author:
matthiasm
Message:

Added 'MakeBinaryFromHex(hex, class)'. Added 'LoadBinary(filename)'. Added 'SaveBinary(bin, filename)'. Added global variable 'printBinaries' which will print binary objects so that they can be recompiled into the original binary.

Location:
NEWT0/trunk/src
Files:
10 edited

Legend:

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

    r113 r136  
    199199    // for print 
    200200    INITSYM(printDepth); 
     201    INITSYM(printIndent); 
    201202    INITSYM(printLength); 
     203    INITSYM(printBinaries); 
    202204 
    203205    // for regex 
  • NEWT0/trunk/src/newt_core/NewtFile.c

    r113 r136  
    759759    return NewtExpandPath(NewtRefToString(r)); 
    760760} 
     761 
     762 
     763/*------------------------------------------------------------------------*/ 
     764/** Read a file and create a binary object. 
     765 * 
     766 * @param rcvr      [in] receiver 
     767 * @param r     [in] filename 
     768 * 
     769 * @return      binary object containing the entire file data 
     770 */ 
     771 
     772newtRef NsLoadBinary(newtRefArg rcvr, newtRefArg r) 
     773{ 
     774    if (NewtRefIsString(r)) { 
     775        char *filename = NewtRefToString(r); 
     776        FILE *f = fopen(filename, "rb"); 
     777        if (!f) 
     778            return NewtThrow(kNErrFileNotFound, r); 
     779        fseek(f, 0, SEEK_END); 
     780        size_t size = ftell(f); 
     781        fseek(f, 0, SEEK_SET); 
     782        uint8_t *data = (uint8_t*)malloc(size); 
     783        int err = fread(data, size, 1, f); 
     784        fclose(f); 
     785        return NewtMakeBinary(NSSYM(data), data, size, false);  
     786    } else { 
     787        return NewtThrow(kNErrNotAString, r); 
     788    } 
     789} 
     790 
     791/*------------------------------------------------------------------------*/ 
     792/** Save a binary object to a file. 
     793 * 
     794 * @param rcvr      [in] receiver 
     795 * @param r1        [in] binary object 
     796 * @param r2        [in] filename 
     797 * 
     798 * @return      error code 
     799 */ 
     800 
     801newtRef NsSaveBinary(newtRefArg rcvr, newtRefArg r1, newtRefArg r2) 
     802{ 
     803    if (NewtRefIsBinary(r1)) { 
     804        if (NewtRefIsString(r2)) { 
     805            char *filename = NewtRefToString(r2); 
     806            FILE *f = fopen(filename, "wb"); 
     807            if (!f) 
     808                return NewtThrow(kNErrFileNotFound, r2); 
     809            uint8_t *data = NewtRefToBinary(r1); 
     810            int size = NewtBinaryLength(r1); 
     811            fwrite(data, size, 1, f); 
     812            fclose(f); 
     813            return kNewtRefNIL; 
     814        } else { 
     815            return NewtThrow(kNErrNotAString, r2); 
     816        } 
     817    } else { 
     818        return NewtThrow(kNErrNotABinaryObject, r1); 
     819    } 
     820} 
     821 
     822 
  • NEWT0/trunk/src/newt_core/NewtFns.c

    r113 r136  
    13841384 
    13851385 
     1386/*------------------------------------------------------------------------*/ 
     1387/** Create a binary object from a string containing hexadecimal numbers. 
     1388 * 
     1389 * @param rcvr      [in] receiver 
     1390 * @param hex       [in] hexadecimal number pairs 
     1391 * @param klass     [in] class of new binary object 
     1392 * 
     1393 * @return          a new binary object 
     1394 */ 
     1395 
     1396newtRef NsMakeBinaryFromHex(newtRefArg rcvr, newtRefArg hex, newtRefArg klass) 
     1397{ 
     1398    if (! NewtRefIsString(hex)) 
     1399        return NewtThrow(kNErrNotAString, hex); 
     1400 
     1401    return NewtMakeBinaryFromHex(klass, NewtRefToString(hex), false); 
     1402} 
     1403 
     1404 
    13861405#if 0 
    13871406#pragma mark - 
  • NEWT0/trunk/src/newt_core/NewtObj.c

    r113 r136  
    12111211 
    12121212/*------------------------------------------------------------------------*/ 
     1213/** Make a binary object from a string of hexadecimal numbers. 
     1214 * 
     1215 * @param klass         [in] new class  
     1216 * @param hex           [in] string of hexadecimal numbers 
     1217 * @param literal       [in] make new object a literal 
     1218 * 
     1219 * @return                      new binary object 
     1220 */ 
     1221 
     1222newtRef NewtMakeBinaryFromHex(newtRefArg klass, const char *hex, bool literal) 
     1223{ 
     1224    uint32_t size = strlen(hex)/2; 
     1225    newtObjRef obj = NewtMakeBinary(klass, 0, size, literal); 
     1226    if (obj) { 
     1227        uint32_t i; 
     1228        const char *src = hex; 
     1229        uint8_t *dst = NewtRefToBinary(obj); 
     1230        for (i=0; i<size; i++) { 
     1231            uint8_t c = *src++, v = 0; 
     1232            if (c>='a') v = c-'a'+10; else if (c>='A') v = c-'A'+10; else v = c-'0'; 
     1233            c = *src++; v = v<<4; 
     1234            if (c>='a') v += c-'a'+10; else if (c>='A') v += c-'A'+10; else v += c-'0'; 
     1235            *dst++ = v; 
     1236        } 
     1237        return obj; 
     1238    } 
     1239    return kNewtRefUnbind; 
     1240} 
     1241 
     1242 
     1243/*------------------------------------------------------------------------*/ 
    12131244/** バイナリオブジェクトのオブジェクトデータのサイズを変更する 
    12141245 * 
  • NEWT0/trunk/src/newt_core/NewtPrint.c

    r113 r136  
    2525static int32_t      NewtGetPrintLength(void); 
    2626static int32_t      NewtGetPrintDepth(void); 
     27static int32_t      NewtGetPrintIndent(void); 
     28static int32_t      NewtGetPrintBinaries(void); 
    2729 
    2830static bool         NewtSymbolIsPrint(char * str, int len); 
     
    105107 
    106108 
     109/*------------------------------------------------------------------------*/ 
     110/** Get the number of tabs (or spaces if negative) for indenting. 
     111 * 
     112 * @return          number of characters to indent 
     113 */ 
     114 
     115int32_t NewtGetPrintIndent(void) 
     116{ 
     117    newtRefVar  n; 
     118    int32_t     indent = 1; 
     119 
     120    n = NcGetGlobalVar(NSSYM0(printIndent)); 
     121 
     122    if (NewtRefIsInteger(n)) 
     123        indent = NewtRefToInteger(n); 
     124 
     125    return indent; 
     126} 
     127 
     128 
     129/*------------------------------------------------------------------------*/ 
     130/** If set, brint binary objects as well. 
     131 * 
     132 * @return          0 or 1 
     133 */ 
     134 
     135int32_t NewtGetPrintBinaries(void) 
     136{ 
     137    newtRefVar  n; 
     138    int32_t     pb = 0; 
     139 
     140    n = NcGetGlobalVar(NSSYM0(printBinaries)); 
     141 
     142    if (NewtRefIsInteger(n)) 
     143        pb = NewtRefToInteger(n); 
     144 
     145    return pb; 
     146} 
     147 
     148 
    107149#if 0 
    108150#pragma mark - 
     
    472514    ptr = r; 
    473515    len = NewtBinaryLength(r); 
    474     NIOFputs("<Binary, ", f); 
    475  
    476     // 
    477516    klass = NcClassOf(r); 
    478  
    479     if (NewtRefIsSymbol(klass)) 
     517    if (newt_env._printBinaries) 
    480518    { 
    481         NIOFputs("class \"", f); 
    482         NIOPrintObj2(f, klass, 0, true); 
    483         NIOFputs("\", ", f); 
     519        uint8_t *data = NewtRefToBinary(r); 
     520        NIOFputs("MakeBinaryFromHex(\"", f); 
     521        int i; for (i=0; i<len; i++) NIOFprintf(f, "%02X", data[i]); 
     522        if (NewtRefIsSymbol(klass)) 
     523        { 
     524            NIOFputs("\", '", f); 
     525            NIOPrintObj2(f, klass, 0, true); 
     526            NIOFputs(")", f); 
     527        } else { 
     528            NIOFputs("\", NIL)", f); 
     529        } 
     530    } else { 
     531        NIOFputs("<Binary, ", f); 
     532        if (NewtRefIsSymbol(klass)) 
     533        { 
     534            NIOFputs("class \"", f); 
     535            NIOPrintObj2(f, klass, 0, true); 
     536            NIOFputs("\", ", f); 
     537        } 
     538        NIOFprintf(f, "length %d>", len); 
    484539    } 
    485  
    486     NIOFprintf(f, "length %d>", len); 
    487540} 
    488541 
     
    911964    int32_t depth = NewtGetPrintDepth(); 
    912965    newt_env._indentDepth = depth; 
     966    int32_t indent = NewtGetPrintIndent(); 
     967    newt_env._indent = indent; 
     968    int32_t pb = NewtGetPrintBinaries(); 
     969    newt_env._printBinaries = pb; 
    913970    NIOPrintObj2(f, r, depth, false); 
    914971} 
  • NEWT0/trunk/src/newt_core/NewtVM.c

    r127 r136  
    36093609    NewtDefGlobalFunc(NSSYM(Require),   NsRequire,          1, "Require(str)"); 
    36103610 
     3611    NewtDefGlobalFunc(NSSYM(LoadBinary),        NsLoadBinary,       1, "LoadBinary(filename)"); 
     3612    NewtDefGlobalFunc(NSSYM(SaveBinary),        NsSaveBinary,       2, "SaveBinary(data, filename)"); 
     3613    NewtDefGlobalFunc(NSSYM(MakeBinaryFromHex),     NsMakeBinaryFromHex,    2, "MakeBinaryFromHex(hexString, class)"); 
     3614 
    36113615    NewtDefGlobalFunc(NSSYM(MakeNSOF),  NsMakeNSOF,         2, "MakeNSOF(obj, ver)"); 
    36123616    NewtDefGlobalFunc(NSSYM(ReadNSOF),  NsReadNSOF,         1, "ReadNSOF(nsof)"); 
     
    36743678{ 
    36753679    NcDefGlobalVar(NSSYM0(printDepth), NSINT(3)); 
     3680    NcDefGlobalVar(NSSYM0(printIndent), NSINT(1)); 
    36763681    NcDefGlobalVar(NSSYM0(printLength), NSINT(10)); 
     3682    NcDefGlobalVar(NSSYM0(printBinaries), NSINT(0)); 
    36773683 
    36783684    NcDefGlobalVar(NSSYM0(_STDOUT_), kNewtRefNIL); 
  • NEWT0/trunk/src/newt_core/incs/NewtEnv.h

    r112 r136  
    9999    int32_t     _indent;        ///< number of tabs for indenting a printout 
    100100    int32_t     _indentDepth;   ///< base for calculating the indent depth 
     101    int32_t     _printBinaries; ///< print binary objects so that they can be regenerated from the printout 
    101102} newt_env_t; 
    102103 
     
    198199    // for print 
    199200    newtRefVar  printDepth;         ///< printDepth 
     201    newtRefVar  printIndent;            ///< printIndent 
    200202    newtRefVar  printLength;        ///< printLength 
     203    newtRefVar  printBinaries;      ///< printBinaries 
    201204 
    202205    // for regex 
  • NEWT0/trunk/src/newt_core/incs/NewtFile.h

    r68 r136  
    6262newtRef     NsExpandPath(newtRefArg rcvr, newtRefArg r); 
    6363 
     64newtRef     NsLoadBinary(newtRefArg rcvr, newtRefArg r); 
     65newtRef     NsSaveBinary(newtRefArg rcvr, newtRefArg r1, newtRefArg r2); 
    6466 
    6567#ifdef __cplusplus 
  • NEWT0/trunk/src/newt_core/incs/NewtFns.h

    r68 r136  
    5252#define NcMakeFrame()               NsMakeFrame(kNewtRefNIL) 
    5353#define NcMakeBinary(len, klass)    NsMakeBinary(kNewtRefNIL, len, klass) 
     54#define NcMakeBinaryFromHex(hex, klass) NsMakeBinaryFromHex(kNewtRefNIL, hex, klass) 
    5455#define NcPrintObject(r)            NsPrintObject(kNewtRefNIL, r) 
    5556#define NcPrint(r)                  NsPrint(kNewtRefNIL, r) 
     
    119120newtRef     NsMakeFrame(newtRefArg rcvr); 
    120121newtRef     NsMakeBinary(newtRefArg rcvr, newtRefArg length, newtRefArg klass); 
     122newtRef     NsMakeBinaryFromHex(newtRefArg rcvr, newtRefArg hex, newtRefArg klass); 
    121123 
    122124newtRef     NcBAnd(newtRefArg r1, newtRefArg r2);                   // bytecode 
  • NEWT0/trunk/src/version.h

    r105 r136  
    3434                        "  --newton,--nos2 Newton OS 2.0 compatible \n" \ 
    3535                        "  --copyright     print copyright\n"           \ 
    36                         "  --version       print version number\n" 
     36                        "  --version       print version number\n"  \ 
     37                        "  --staff         list of developers\n" 
    3738 
    3839/// スタッフロール 
     
    4243                        "Contribute\n"                                  \ 
    4344                        "  Paul Guyot\n"                                \ 
    44                         "  Matthias\n"                                  \ 
     45                        "  Matthias Melcher\n"                                  \ 
    4546                        "\n"                                            \ 
    4647                        "Special Thanks\n"                              \ 
Note: See TracChangeset for help on using the changeset viewer.