/ Check-in [53d32b6f33]
DEMO | DOWNLOAD | DEPLOY | SEARCH
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Release "2.8.32". Fix embedded nulls in format() and elsewhere.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1:53d32b6f33514f25c56e676a9808c88dc3f0c3ff
User & Date: pmacdona 2019-05-23 14:24:19
References
2019-05-23
14:48 Ticket [f8d3a82011] NUL bytes not encodable status still Open with 3 other changes artifact: 9be0178ca1 user: pmacdona
Context
2019-05-24
00:33
Release "2.8.33". Fix issue [f8d3a82011]: NUL bytes not encodable. Now supports strings with \u0000 and \0. check-in: d58a5de09b user: pmacdona tags: trunk
2019-05-23
14:24
Release "2.8.32". Fix embedded nulls in format() and elsewhere. check-in: 53d32b6f33 user: pmacdona tags: trunk
04:15
Release "2.8.31". Fix parser bug in strings with line ending in backslash. check-in: 10502f4b73 user: pmacdona tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/jsi.c.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.....
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
.....
18387
18388
18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
18404
18405
18406
18407
18408
18409
18410
.....
27069
27070
27071
27072
27073
27074
27075
27076
27077
27078
27079
27080
27081
27082
27083
27084
.....
31935
31936
31937
31938
31939
31940
31941
31942
31943
31944
31945
31946
31947
31948
31949
31950
31951
31952
31953
31954
31955
31956
31957
31958
31959
31960
31961
31962
31963
31964
31965
31966
31967
31968
31969
31970
.....
34105
34106
34107
34108
34109
34110
34111
34112
34113
34114
34115
34116
34117
34118
34119
34120
.....
36220
36221
36222
36223
36224
36225
36226
36227
36228
36229
36230
36231
36232
36233
36234
.....
37883
37884
37885
37886
37887
37888
37889
37890
37891
37892
37893
37894
37895
37896
37897
37898
.....
50995
50996
50997
50998
50999
51000
51001
51002
51003
51004
51005
51006
51007
51008
51009
/* jsi.h : External API header file for Jsi. */
#ifndef __JSI_H__
#define __JSI_H__

#define JSI_VERSION_MAJOR   2
#define JSI_VERSION_MINOR   8
#define JSI_VERSION_RELEASE 31

#define JSI_VERSION (JSI_VERSION_MAJOR + ((Jsi_Number)JSI_VERSION_MINOR/100.0) + ((Jsi_Number)JSI_VERSION_RELEASE/10000.0))

#ifndef JSI_EXTERN
#define JSI_EXTERN extern
#endif

................................................................................
                    int ui;
                    for (ui=0; ui<4; ui++)
                        ibuf[ui] = lexer_getchar(lex);
                    ibuf[4] = 0;
                    ui = Jsi_UtfDecode(ibuf, buf+bufi);
                    if (ui>0) {
                        if (!buf[bufi]) {
                            Jsi_LogError("code literal utf null unsupported (u0000)");
                            buf[bufi++] = 0;
                            goto done;
                        }
                        bufi+=ui;
                    } else {
                        Jsi_LogError("Unexpected utf encoding.");
                        buf[bufi++] = 0;
................................................................................
                    Jsi_ValueMakeStringDup(interp, &rPtr, obj->d.s.str);
            }
            break;
        case JSI_OT_FUNCTION: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            Jsi_FuncObjToString(interp, obj->d.fobj->func, &dStr, 3);
            Jsi_ValueMakeStringDup(interp, &rPtr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
            break;
        }
        case JSI_OT_USEROBJ: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            jsi_UserObjToName(interp, obj->d.uobj, &dStr);
            Jsi_ValueMakeStringDup(interp, &rPtr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
            break;
        }
        default:
            Jsi_ValueMakeStringKey(interp,&rPtr, "[object Object]");
            break;
    }
    Jsi_ValueReset(interp, vPtr);
................................................................................
            Jsi_DSFree(&jStr);
            Jsi_DSFree(&kStr);
            return code;
        } else if (interp && interp->stdoutStr) {
            Jsi_DString dStr = {};
            Jsi_DSAppend(&dStr, Jsi_ValueString(interp, interp->stdoutStr, NULL), NULL);
            Jsi_DSAppend(&dStr, str, NULL);
            Jsi_ValueMakeStringDup(interp, &interp->stdoutStr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
        } else

            return chan->fsPtr->putsProc(chan, str);
    }
    return 0;
}

................................................................................
        Jsi_ValueMakeNumber(interp, valuePtr, *(short *)ptr);
        break;
    case JSI_OPTION_USHORT:
        Jsi_ValueMakeNumber(interp, valuePtr, *(ushort *)ptr);
        break;
        
    case JSI_OPTION_DSTRING:
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue((Jsi_DString*)ptr));
        break;
    
    case JSI_OPTION_TIME_W: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(Jsi_Wide*)ptr), "", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_TIME_D: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(double*)ptr), "", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_TIME_T: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, 1000LL* (Jsi_Number)*(time_t*)ptr, "%Y-%m-%d %H:%M:%S", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_STRBUF:
        if (ptr)
            Jsi_ValueMakeStringDup(interp, valuePtr, ptr);
        else
            Jsi_ValueMakeNull(interp, valuePtr);
................................................................................
    if (jsv && Jsi_ValueGetBoolean(interp, jsv, &strict) != JSI_OK) 
        return Jsi_LogError("Expected boolean");
    int quote = JSI_OUTPUT_JSON;
    if (strict) quote|=JSI_JSON_STRICT;
    Jsi_DString dStr = {};
    Jsi_Value *arg = Jsi_ValueArrayIndex(interp, args, 0);
    Jsi_ValueGetDString(interp, arg, &dStr, quote);
    Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    Jsi_DSFree(&dStr);
    return JSI_OK;
}

Jsi_RC Jsi_CommandInvoke(Jsi_Interp *interp, const char *cmdstr, Jsi_Value *args, Jsi_Value **ret)
{
    Jsi_Value *func = Jsi_NameLookup(interp, cmdstr);
    if (func)
................................................................................
        if (opts.secs)
            num = (Jsi_Number)((Jsi_Wide)(num*1000));
        rc = Jsi_DatetimeFormat(interp, num, fmt, opts.utc, &dStr);
    }
    if (rc != JSI_OK)
        Jsi_LogError("%s", errMsg);
    else
        Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    if (isOpt)
        Jsi_OptionsFree(interp, DateOptions, &opts, 0);
    Jsi_DSFree(&dStr);
    return rc;
}

#define FN_infovars JSI_INFO("\
................................................................................
static Jsi_RC SysFormatCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr;
    Jsi_RC rc = Jsi_FormatString(interp, args, &dStr);
    if (rc != JSI_OK)
        return rc;
    Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    Jsi_DSFree(&dStr);
    return JSI_OK;
}

static Jsi_RC SysQuoteCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr = {};
................................................................................
        goto bail;
        break;
    }
    }
    if (opts.retChanged)
        Jsi_ValueMakeNumber(interp, ret, (Jsi_Number)sqlite3_changes(jdb->db));
    else
        Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(dStr));
    if( rc==JSI_BREAK )
        rc = JSI_OK;
bail:
    dbEvalFinalize(&sEval);
    if (isopts) {
        Jsi_OptionsFree(interp, ExecFmtOptions, &opts, 0);
    }






|







 







|







 







|
<






|
<







 







|
<







 







|





|
<





|
<





|
<







 







|
<







 







|







 







|
<







 







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
.....
16089
16090
16091
16092
16093
16094
16095
16096
16097
16098
16099
16100
16101
16102
16103
.....
18387
18388
18389
18390
18391
18392
18393
18394

18395
18396
18397
18398
18399
18400
18401

18402
18403
18404
18405
18406
18407
18408
.....
27067
27068
27069
27070
27071
27072
27073
27074

27075
27076
27077
27078
27079
27080
27081
.....
31932
31933
31934
31935
31936
31937
31938
31939
31940
31941
31942
31943
31944
31945

31946
31947
31948
31949
31950
31951

31952
31953
31954
31955
31956
31957

31958
31959
31960
31961
31962
31963
31964
.....
34099
34100
34101
34102
34103
34104
34105
34106

34107
34108
34109
34110
34111
34112
34113
.....
36213
36214
36215
36216
36217
36218
36219
36220
36221
36222
36223
36224
36225
36226
36227
.....
37876
37877
37878
37879
37880
37881
37882
37883

37884
37885
37886
37887
37888
37889
37890
.....
50987
50988
50989
50990
50991
50992
50993
50994
50995
50996
50997
50998
50999
51000
51001
/* jsi.h : External API header file for Jsi. */
#ifndef __JSI_H__
#define __JSI_H__

#define JSI_VERSION_MAJOR   2
#define JSI_VERSION_MINOR   8
#define JSI_VERSION_RELEASE 32

#define JSI_VERSION (JSI_VERSION_MAJOR + ((Jsi_Number)JSI_VERSION_MINOR/100.0) + ((Jsi_Number)JSI_VERSION_RELEASE/10000.0))

#ifndef JSI_EXTERN
#define JSI_EXTERN extern
#endif

................................................................................
                    int ui;
                    for (ui=0; ui<4; ui++)
                        ibuf[ui] = lexer_getchar(lex);
                    ibuf[4] = 0;
                    ui = Jsi_UtfDecode(ibuf, buf+bufi);
                    if (ui>0) {
                        if (!buf[bufi]) {
                            Jsi_LogError("unsupported code literal utf null (u0000)");
                            buf[bufi++] = 0;
                            goto done;
                        }
                        bufi+=ui;
                    } else {
                        Jsi_LogError("Unexpected utf encoding.");
                        buf[bufi++] = 0;
................................................................................
                    Jsi_ValueMakeStringDup(interp, &rPtr, obj->d.s.str);
            }
            break;
        case JSI_OT_FUNCTION: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            Jsi_FuncObjToString(interp, obj->d.fobj->func, &dStr, 3);
            Jsi_ValueFromDS(interp, &dStr, &rPtr);

            break;
        }
        case JSI_OT_USEROBJ: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            jsi_UserObjToName(interp, obj->d.uobj, &dStr);
            Jsi_ValueFromDS(interp, &dStr, &rPtr);

            break;
        }
        default:
            Jsi_ValueMakeStringKey(interp,&rPtr, "[object Object]");
            break;
    }
    Jsi_ValueReset(interp, vPtr);
................................................................................
            Jsi_DSFree(&jStr);
            Jsi_DSFree(&kStr);
            return code;
        } else if (interp && interp->stdoutStr) {
            Jsi_DString dStr = {};
            Jsi_DSAppend(&dStr, Jsi_ValueString(interp, interp->stdoutStr, NULL), NULL);
            Jsi_DSAppend(&dStr, str, NULL);
            Jsi_ValueFromDS(interp, &dStr, &interp->stdoutStr);

        } else

            return chan->fsPtr->putsProc(chan, str);
    }
    return 0;
}

................................................................................
        Jsi_ValueMakeNumber(interp, valuePtr, *(short *)ptr);
        break;
    case JSI_OPTION_USHORT:
        Jsi_ValueMakeNumber(interp, valuePtr, *(ushort *)ptr);
        break;
        
    case JSI_OPTION_DSTRING:
        Jsi_ValueFromDS(interp, (Jsi_DString*)ptr, valuePtr);
        break;
    
    case JSI_OPTION_TIME_W: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(Jsi_Wide*)ptr), "", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_TIME_D: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(double*)ptr), "", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_TIME_T: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, 1000LL* (Jsi_Number)*(time_t*)ptr, "%Y-%m-%d %H:%M:%S", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_STRBUF:
        if (ptr)
            Jsi_ValueMakeStringDup(interp, valuePtr, ptr);
        else
            Jsi_ValueMakeNull(interp, valuePtr);
................................................................................
    if (jsv && Jsi_ValueGetBoolean(interp, jsv, &strict) != JSI_OK) 
        return Jsi_LogError("Expected boolean");
    int quote = JSI_OUTPUT_JSON;
    if (strict) quote|=JSI_JSON_STRICT;
    Jsi_DString dStr = {};
    Jsi_Value *arg = Jsi_ValueArrayIndex(interp, args, 0);
    Jsi_ValueGetDString(interp, arg, &dStr, quote);
    Jsi_ValueFromDS(interp, &dStr, ret);

    return JSI_OK;
}

Jsi_RC Jsi_CommandInvoke(Jsi_Interp *interp, const char *cmdstr, Jsi_Value *args, Jsi_Value **ret)
{
    Jsi_Value *func = Jsi_NameLookup(interp, cmdstr);
    if (func)
................................................................................
        if (opts.secs)
            num = (Jsi_Number)((Jsi_Wide)(num*1000));
        rc = Jsi_DatetimeFormat(interp, num, fmt, opts.utc, &dStr);
    }
    if (rc != JSI_OK)
        Jsi_LogError("%s", errMsg);
    else
        Jsi_ValueFromDS(interp, &dStr, ret);
    if (isOpt)
        Jsi_OptionsFree(interp, DateOptions, &opts, 0);
    Jsi_DSFree(&dStr);
    return rc;
}

#define FN_infovars JSI_INFO("\
................................................................................
static Jsi_RC SysFormatCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr;
    Jsi_RC rc = Jsi_FormatString(interp, args, &dStr);
    if (rc != JSI_OK)
        return rc;
    Jsi_ValueFromDS(interp, &dStr, ret);

    return JSI_OK;
}

static Jsi_RC SysQuoteCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr = {};
................................................................................
        goto bail;
        break;
    }
    }
    if (opts.retChanged)
        Jsi_ValueMakeNumber(interp, ret, (Jsi_Number)sqlite3_changes(jdb->db));
    else
        Jsi_ValueFromDS(interp, dStr, ret);
    if( rc==JSI_BREAK )
        rc = JSI_OK;
bail:
    dbEvalFinalize(&sEval);
    if (isopts) {
        Jsi_OptionsFree(interp, ExecFmtOptions, &opts, 0);
    }

Changes to src/jsi.h.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* jsi.h : External API header file for Jsi. */
#ifndef __JSI_H__
#define __JSI_H__

#define JSI_VERSION_MAJOR   2
#define JSI_VERSION_MINOR   8
#define JSI_VERSION_RELEASE 31

#define JSI_VERSION (JSI_VERSION_MAJOR + ((Jsi_Number)JSI_VERSION_MINOR/100.0) + ((Jsi_Number)JSI_VERSION_RELEASE/10000.0))

#ifndef JSI_EXTERN
#define JSI_EXTERN extern
#endif







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* jsi.h : External API header file for Jsi. */
#ifndef __JSI_H__
#define __JSI_H__

#define JSI_VERSION_MAJOR   2
#define JSI_VERSION_MINOR   8
#define JSI_VERSION_RELEASE 32

#define JSI_VERSION (JSI_VERSION_MAJOR + ((Jsi_Number)JSI_VERSION_MINOR/100.0) + ((Jsi_Number)JSI_VERSION_RELEASE/10000.0))

#ifndef JSI_EXTERN
#define JSI_EXTERN extern
#endif

Changes to src/jsiCmds.c.

2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
....
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
        if (opts.secs)
            num = (Jsi_Number)((Jsi_Wide)(num*1000));
        rc = Jsi_DatetimeFormat(interp, num, fmt, opts.utc, &dStr);
    }
    if (rc != JSI_OK)
        Jsi_LogError("%s", errMsg);
    else
        Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    if (isOpt)
        Jsi_OptionsFree(interp, DateOptions, &opts, 0);
    Jsi_DSFree(&dStr);
    return rc;
}

#define FN_infovars JSI_INFO("\
................................................................................
static Jsi_RC SysFormatCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr;
    Jsi_RC rc = Jsi_FormatString(interp, args, &dStr);
    if (rc != JSI_OK)
        return rc;
    Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    Jsi_DSFree(&dStr);
    return JSI_OK;
}

static Jsi_RC SysQuoteCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr = {};







|







 







|
<







2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
....
3738
3739
3740
3741
3742
3743
3744
3745

3746
3747
3748
3749
3750
3751
3752
        if (opts.secs)
            num = (Jsi_Number)((Jsi_Wide)(num*1000));
        rc = Jsi_DatetimeFormat(interp, num, fmt, opts.utc, &dStr);
    }
    if (rc != JSI_OK)
        Jsi_LogError("%s", errMsg);
    else
        Jsi_ValueFromDS(interp, &dStr, ret);
    if (isOpt)
        Jsi_OptionsFree(interp, DateOptions, &opts, 0);
    Jsi_DSFree(&dStr);
    return rc;
}

#define FN_infovars JSI_INFO("\
................................................................................
static Jsi_RC SysFormatCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr;
    Jsi_RC rc = Jsi_FormatString(interp, args, &dStr);
    if (rc != JSI_OK)
        return rc;
    Jsi_ValueFromDS(interp, &dStr, ret);

    return JSI_OK;
}

static Jsi_RC SysQuoteCmd(Jsi_Interp *interp, Jsi_Value *args, Jsi_Value *_this,
    Jsi_Value **ret, Jsi_Func *funcPtr)
{
    Jsi_DString dStr = {};

Changes to src/jsiFilesys.c.

1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
            Jsi_DSFree(&jStr);
            Jsi_DSFree(&kStr);
            return code;
        } else if (interp && interp->stdoutStr) {
            Jsi_DString dStr = {};
            Jsi_DSAppend(&dStr, Jsi_ValueString(interp, interp->stdoutStr, NULL), NULL);
            Jsi_DSAppend(&dStr, str, NULL);
            Jsi_ValueMakeStringDup(interp, &interp->stdoutStr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
        } else

            return chan->fsPtr->putsProc(chan, str);
    }
    return 0;
}








|
<







1019
1020
1021
1022
1023
1024
1025
1026

1027
1028
1029
1030
1031
1032
1033
            Jsi_DSFree(&jStr);
            Jsi_DSFree(&kStr);
            return code;
        } else if (interp && interp->stdoutStr) {
            Jsi_DString dStr = {};
            Jsi_DSAppend(&dStr, Jsi_ValueString(interp, interp->stdoutStr, NULL), NULL);
            Jsi_DSAppend(&dStr, str, NULL);
            Jsi_ValueFromDS(interp, &dStr, &interp->stdoutStr);

        } else

            return chan->fsPtr->putsProc(chan, str);
    }
    return 0;
}

Changes to src/jsiJSON.c.

443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
    if (jsv && Jsi_ValueGetBoolean(interp, jsv, &strict) != JSI_OK) 
        return Jsi_LogError("Expected boolean");
    int quote = JSI_OUTPUT_JSON;
    if (strict) quote|=JSI_JSON_STRICT;
    Jsi_DString dStr = {};
    Jsi_Value *arg = Jsi_ValueArrayIndex(interp, args, 0);
    Jsi_ValueGetDString(interp, arg, &dStr, quote);
    Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(&dStr));
    Jsi_DSFree(&dStr);
    return JSI_OK;
}

Jsi_RC Jsi_CommandInvoke(Jsi_Interp *interp, const char *cmdstr, Jsi_Value *args, Jsi_Value **ret)
{
    Jsi_Value *func = Jsi_NameLookup(interp, cmdstr);
    if (func)







|
<







443
444
445
446
447
448
449
450

451
452
453
454
455
456
457
    if (jsv && Jsi_ValueGetBoolean(interp, jsv, &strict) != JSI_OK) 
        return Jsi_LogError("Expected boolean");
    int quote = JSI_OUTPUT_JSON;
    if (strict) quote|=JSI_JSON_STRICT;
    Jsi_DString dStr = {};
    Jsi_Value *arg = Jsi_ValueArrayIndex(interp, args, 0);
    Jsi_ValueGetDString(interp, arg, &dStr, quote);
    Jsi_ValueFromDS(interp, &dStr, ret);

    return JSI_OK;
}

Jsi_RC Jsi_CommandInvoke(Jsi_Interp *interp, const char *cmdstr, Jsi_Value *args, Jsi_Value **ret)
{
    Jsi_Value *func = Jsi_NameLookup(interp, cmdstr);
    if (func)

Changes to src/jsiLexer.c.

169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
                    int ui;
                    for (ui=0; ui<4; ui++)
                        ibuf[ui] = lexer_getchar(lex);
                    ibuf[4] = 0;
                    ui = Jsi_UtfDecode(ibuf, buf+bufi);
                    if (ui>0) {
                        if (!buf[bufi]) {
                            Jsi_LogError("code literal utf null unsupported (u0000)");
                            buf[bufi++] = 0;
                            goto done;
                        }
                        bufi+=ui;
                    } else {
                        Jsi_LogError("Unexpected utf encoding.");
                        buf[bufi++] = 0;







|







169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
                    int ui;
                    for (ui=0; ui<4; ui++)
                        ibuf[ui] = lexer_getchar(lex);
                    ibuf[4] = 0;
                    ui = Jsi_UtfDecode(ibuf, buf+bufi);
                    if (ui>0) {
                        if (!buf[bufi]) {
                            Jsi_LogError("unsupported code literal utf null (u0000)");
                            buf[bufi++] = 0;
                            goto done;
                        }
                        bufi+=ui;
                    } else {
                        Jsi_LogError("Unexpected utf encoding.");
                        buf[bufi++] = 0;

Changes to src/jsiOptions.c.

705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
        Jsi_ValueMakeNumber(interp, valuePtr, *(short *)ptr);
        break;
    case JSI_OPTION_USHORT:
        Jsi_ValueMakeNumber(interp, valuePtr, *(ushort *)ptr);
        break;
        
    case JSI_OPTION_DSTRING:
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue((Jsi_DString*)ptr));
        break;
    
    case JSI_OPTION_TIME_W: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(Jsi_Wide*)ptr), "", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_TIME_D: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(double*)ptr), "", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_TIME_T: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, 1000LL* (Jsi_Number)*(time_t*)ptr, "%Y-%m-%d %H:%M:%S", 0, &dStr);
        Jsi_ValueMakeStringDup(interp, valuePtr, Jsi_DSValue(&dStr));
        Jsi_DSFree(&dStr);
        break;
    }
    case JSI_OPTION_STRBUF:
        if (ptr)
            Jsi_ValueMakeStringDup(interp, valuePtr, ptr);
        else
            Jsi_ValueMakeNull(interp, valuePtr);







|





|
<





|
<





|
<







705
706
707
708
709
710
711
712
713
714
715
716
717
718

719
720
721
722
723
724

725
726
727
728
729
730

731
732
733
734
735
736
737
        Jsi_ValueMakeNumber(interp, valuePtr, *(short *)ptr);
        break;
    case JSI_OPTION_USHORT:
        Jsi_ValueMakeNumber(interp, valuePtr, *(ushort *)ptr);
        break;
        
    case JSI_OPTION_DSTRING:
        Jsi_ValueFromDS(interp, (Jsi_DString*)ptr, valuePtr);
        break;
    
    case JSI_OPTION_TIME_W: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(Jsi_Wide*)ptr), "", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_TIME_D: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, (Jsi_Number)(*(double*)ptr), "", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_TIME_T: {
        Jsi_DString dStr = {};
        Jsi_DatetimeFormat(interp, 1000LL* (Jsi_Number)*(time_t*)ptr, "%Y-%m-%d %H:%M:%S", 0, &dStr);
        Jsi_ValueFromDS(interp, &dStr, valuePtr);

        break;
    }
    case JSI_OPTION_STRBUF:
        if (ptr)
            Jsi_ValueMakeStringDup(interp, valuePtr, ptr);
        else
            Jsi_ValueMakeNull(interp, valuePtr);

Changes to src/jsiSqlite.c.

3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
        goto bail;
        break;
    }
    }
    if (opts.retChanged)
        Jsi_ValueMakeNumber(interp, ret, (Jsi_Number)sqlite3_changes(jdb->db));
    else
        Jsi_ValueMakeStringDup(interp, ret, Jsi_DSValue(dStr));
    if( rc==JSI_BREAK )
        rc = JSI_OK;
bail:
    dbEvalFinalize(&sEval);
    if (isopts) {
        Jsi_OptionsFree(interp, ExecFmtOptions, &opts, 0);
    }







|







3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
        goto bail;
        break;
    }
    }
    if (opts.retChanged)
        Jsi_ValueMakeNumber(interp, ret, (Jsi_Number)sqlite3_changes(jdb->db));
    else
        Jsi_ValueFromDS(interp, dStr, ret);
    if( rc==JSI_BREAK )
        rc = JSI_OK;
bail:
    dbEvalFinalize(&sEval);
    if (isopts) {
        Jsi_OptionsFree(interp, ExecFmtOptions, &opts, 0);
    }

Changes to src/jsiValue.c.

840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
                    Jsi_ValueMakeStringDup(interp, &rPtr, obj->d.s.str);
            }
            break;
        case JSI_OT_FUNCTION: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            Jsi_FuncObjToString(interp, obj->d.fobj->func, &dStr, 3);
            Jsi_ValueMakeStringDup(interp, &rPtr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
            break;
        }
        case JSI_OT_USEROBJ: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            jsi_UserObjToName(interp, obj->d.uobj, &dStr);
            Jsi_ValueMakeStringDup(interp, &rPtr, Jsi_DSValue(&dStr));
            Jsi_DSFree(&dStr);
            break;
        }
        default:
            Jsi_ValueMakeStringKey(interp,&rPtr, "[object Object]");
            break;
    }
    Jsi_ValueReset(interp, vPtr);







|
<






|
<







840
841
842
843
844
845
846
847

848
849
850
851
852
853
854

855
856
857
858
859
860
861
                    Jsi_ValueMakeStringDup(interp, &rPtr, obj->d.s.str);
            }
            break;
        case JSI_OT_FUNCTION: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            Jsi_FuncObjToString(interp, obj->d.fobj->func, &dStr, 3);
            Jsi_ValueFromDS(interp, &dStr, &rPtr);

            break;
        }
        case JSI_OT_USEROBJ: {
            Jsi_DString dStr;
            Jsi_DSInit(&dStr);
            jsi_UserObjToName(interp, obj->d.uobj, &dStr);
            Jsi_ValueFromDS(interp, &dStr, &rPtr);

            break;
        }
        default:
            Jsi_ValueMakeStringKey(interp,&rPtr, "[object Object]");
            break;
    }
    Jsi_ValueReset(interp, vPtr);

Changes to tools/protos.jsi.

1
2
3
4
5
6
7
8
//JSI Command Prototypes: version 2.8.31
throw("NOT EXECUTABLE: USE FILE IN GEANY EDITOR FOR CMD LINE COMPLETION + GOTO TAG");

var Array = function(cmd,args) {};
Array.prototype.concat = function(...):array {};
Array.prototype.every = function(callback:function):any {};
Array.prototype.fill = function(value:any, start:number=0, end:number=-1):array {};
Array.prototype.filter = function(callback:function, this:object=void):array {};
|







1
2
3
4
5
6
7
8
//JSI Command Prototypes: version 2.8.32
throw("NOT EXECUTABLE: USE FILE IN GEANY EDITOR FOR CMD LINE COMPLETION + GOTO TAG");

var Array = function(cmd,args) {};
Array.prototype.concat = function(...):array {};
Array.prototype.every = function(callback:function):any {};
Array.prototype.fill = function(value:any, start:number=0, end:number=-1):array {};
Array.prototype.filter = function(callback:function, this:object=void):array {};