aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.in4
-rw-r--r--jim-aio.c98
-rw-r--r--jim-package.c2
3 files changed, 68 insertions, 36 deletions
diff --git a/Makefile.in b/Makefile.in
index f4f626a..cb8480e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -15,7 +15,7 @@ CFLAGS += -DJIM_TCL_COMPAT
# Emulate tinytcl
LIBJIM := libtcl6.a
-CFLAGS += -Wall -g -Os -I@SRCDIR@ @EXTRA_CFLAGS@
+CFLAGS += -Wall -g -Os $(OPTIM) -I@SRCDIR@ @EXTRA_CFLAGS@
VPATH := @SRCDIR@
.EXPORT_ALL_VARIABLES:
@@ -45,7 +45,7 @@ all: $(TARGETS)
$(MAKE) -C doc all
jimsh: $(LIBJIM) jimsh.o
- $(CC) $(LDFLAGS) -o $@ $^ $(LIBJIM) $(LDLIBS) $(LIBDL)
+ $(CC) $(LDFLAGS) -o $@ jimsh.o $(LIBJIM) $(LDLIBS) $(LIBDL)
$(LIBJIM): $(OBJS) $(EXTENSIONS_OBJS)
$(AR) cr $@ $^
diff --git a/jim-aio.c b/jim-aio.c
index 0967ee5..0fb5e75 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -79,9 +79,16 @@ typedef struct AioFile {
static int JimAioSubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
-static void JimAioSetError(Jim_Interp *interp)
+static void JimAioSetError(Jim_Interp *interp, Jim_Obj *name)
{
- Jim_SetResultString(interp, strerror(errno), -1);
+ if (name) {
+ const char *filename = Jim_GetString(name, NULL);
+ Jim_SetResultString(interp, "", 0);
+ Jim_AppendStrings(interp, Jim_GetResult(interp), filename, ": ", strerror(errno), NULL);
+ }
+ else {
+ Jim_SetResultString(interp, strerror(errno), -1);
+ }
}
static void JimAioDelProc(Jim_Interp *interp, void *privData)
@@ -163,7 +170,7 @@ static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
if (ferror(af->fp)) {
/* I/O error */
Jim_FreeNewObj(interp, objPtr);
- JimAioSetError(interp);
+ JimAioSetError(interp, af->filename);
return JIM_ERR;
}
if (nonewline) {
@@ -205,7 +212,7 @@ static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
if (ferror(af->fp) && (errno != EAGAIN)) {
/* I/O error */
Jim_FreeNewObj(interp, objPtr);
- JimAioSetError(interp);
+ JimAioSetError(interp, af->filename);
return JIM_ERR;
}
/* On EOF returns -1 if varName was specified, or the empty string. */
@@ -255,7 +262,7 @@ static int aio_cmd_puts(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
return JIM_OK;
}
}
- JimAioSetError(interp);
+ JimAioSetError(interp, af->filename);
return JIM_ERR;
}
@@ -263,7 +270,7 @@ static int aio_cmd_flush(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
AioFile *af = Jim_CmdPrivData(interp);
if (fflush(af->fp) == EOF) {
- JimAioSetError(interp);
+ JimAioSetError(interp, af->filename);
return JIM_ERR;
}
return JIM_OK;
@@ -303,7 +310,7 @@ static int aio_cmd_seek(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
return JIM_ERR;
}
if (fseek(af->fp, offset, orig) == -1) {
- JimAioSetError(interp);
+ JimAioSetError(interp, af->filename);
return JIM_ERR;
}
return JIM_OK;
@@ -600,7 +607,7 @@ static int JimAioOpenCommand(Jim_Interp *interp, int argc,
}
fp = fopen(Jim_GetString(argv[1], NULL), mode);
if (fp == NULL) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[1]);
return JIM_ERR;
}
/* Get the next file id */
@@ -712,7 +719,7 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
case SOCK_DGRAM_CL:
sock = socket(PF_INET,SOCK_DGRAM,0);
if (sock < 0) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
hdlfmt = "aio.sockdgram%ld" ;
@@ -727,16 +734,16 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
}
sock = socket(PF_INET,SOCK_STREAM,0);
if (sock < 0) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
res = connect(sock,(struct sockaddr*)&sa,sizeof(sa));
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
close(sock);
return JIM_ERR;
}
- hdlfmt = "aio.sockstrm%ld" ;
+ hdlfmt = "aio.sockstream%ld" ;
}
break;
@@ -745,12 +752,12 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
struct sockaddr_in sa;
if (JimParseIpAddress(interp, hostportarg, &sa) != JIM_OK) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
return JIM_ERR;
}
sock = socket(PF_INET,SOCK_STREAM,0);
if (sock < 0) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
@@ -759,13 +766,13 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
res = bind(sock,(struct sockaddr*)&sa,sizeof(sa));
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
close(sock);
return JIM_ERR;
}
res = listen(sock,5);
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
close(sock);
return JIM_ERR;
}
@@ -779,18 +786,18 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
socklen_t len;
if (JimParseDomainAddress(interp, hostportarg, &sa) != JIM_OK) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
return JIM_ERR;
}
sock = socket(PF_UNIX, SOCK_STREAM,0);
if (sock < 0) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
len = strlen(sa.sun_path) + 1 + sizeof(sa.sun_family);
res = connect(sock,(struct sockaddr*)&sa,len);
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
close(sock);
return JIM_ERR;
}
@@ -804,24 +811,24 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
socklen_t len;
if (JimParseDomainAddress(interp, hostportarg, &sa) != JIM_OK) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
return JIM_ERR;
}
sock = socket(PF_UNIX, SOCK_STREAM,0);
if (sock < 0) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
len = strlen(sa.sun_path) + 1 + sizeof(sa.sun_family);
res = bind(sock,(struct sockaddr*)&sa,len);
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, argv[2]);
close(sock);
return JIM_ERR;
}
res = listen(sock,5);
if (res) {
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
close(sock);
return JIM_ERR;
}
@@ -835,7 +842,7 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc,
fp = fdopen(sock, "r+" );
if (fp == NULL) {
close(sock);
- JimAioSetError(interp);
+ JimAioSetError(interp, NULL);
return JIM_ERR;
}
/* Get the next file id */
@@ -871,36 +878,60 @@ FILE *Jim_AioFilehandle(Jim_Interp *interp, Jim_Obj *command)
#ifdef JIM_TCL_COMPAT
static int JimAioTclCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
- Jim_Obj **newargv = Jim_Alloc(sizeof(Jim_Obj*)*argc);
+ Jim_Obj *newargv[4];
int ret;
int i;
+ int nonewline = 0;
+
+ if (argc > 1 && Jim_CompareStringImmediate(interp, argv[1], "-nonewline")) {
+ nonewline = 1;
+ }
+ if (argc < 2 + nonewline || argc > 4) {
+ Jim_WrongNumArgs(interp, 1, argv, "channel");
+ return JIM_ERR;
+ }
- /* cmd channel ?args? */
- newargv[0] = argv[1];
- newargv[1] = argv[0];
+ if (nonewline) {
+ /* read -nonewline $f ... => $f read -nonewline ... */
+ newargv[0] = argv[2];
+ newargv[1] = argv[0];
+ newargv[2] = argv[1];
+ }
+ else {
+ /* cmd $f ... => $f cmd ... */
+ newargv[0] = argv[1];
+ newargv[1] = argv[0];
+ }
- for (i = 2; i < argc; i++) {
+ for (i = 2 + nonewline; i < argc; i++) {
newargv[i] = argv[i];
}
ret = Jim_EvalObjVector(interp, argc, newargv);
- Jim_Free(newargv);
-
return ret;
}
static int JimAioPutsCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
Jim_Obj *newargv[4];
+ int nonewline = 0;
int off = 1;
+ if (argc > 1 && Jim_CompareStringImmediate(interp, argv[1], "-nonewline")) {
+ nonewline = 1;
+ }
+
+ if (argc < 2 + nonewline || argc > 3 + nonewline) {
+ Jim_WrongNumArgs(interp, 1, argv, "?-nonewline? ?channel? string");
+ return JIM_ERR;
+ }
+
/* "puts" */
newargv[off++] = argv[0];
- /* puts ?-nonewline? ?channel? msg */
- if (argc > 1 && Jim_CompareStringImmediate(interp, argv[1], "-nonewline")) {
+ if (nonewline) {
newargv[off++] = argv[1];
argv++;
argc--;
@@ -915,6 +946,7 @@ static int JimAioPutsCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
newargv[0] = argv[1];
newargv[off++] = argv[2];
}
+
return Jim_EvalObjVector(interp, off, newargv);
}
diff --git a/jim-package.c b/jim-package.c
index 5cdba85..264c95e 100644
--- a/jim-package.c
+++ b/jim-package.c
@@ -130,7 +130,7 @@ int Jim_PackageRequire(Jim_Interp *interp, const char *name, int flags)
}
Jim_GetString(resultObj, &len);
Jim_AppendStrings(interp, resultObj, len ? "\n" : "",
- "Can't find package '", name, "'", NULL);
+ "Can't load package '", name, "'", NULL);
Jim_SetResult(interp, resultObj);
}
return retcode;