[prev in list] [next in list] [prev in thread] [next in thread]
List: rpm-cvs
Subject: [CVS] RPM: rpm/js/ rpmhdr-js.c rpmmc-js.c rpm/js/tscripts/ Mc.js
From: "Jeff Johnson" <jbj () rpm5 ! org>
Date: 2009-04-28 20:15:54
Message-ID: 20090428201554.927CD5AB6 () rpm5 ! org
[Download RAW message or body]
RPM Package Manager, CVS Repository
http://rpm5.org/cvs/
____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson
Root: /v/rpm/cvs Email: jbj@rpm5.org
Module: rpm Date: 28-Apr-2009 22:15:54
Branch: HEAD Handle: 2009042820155400
Modified files:
rpm/js rpmhdr-js.c rpmmc-js.c
rpm/js/tscripts Mc.js
Log:
- js: Mc: permit multiple macro contexts with custom loading.
Summary:
Revision Changes Path
1.10 +5 -5 rpm/js/rpmhdr-js.c
1.2 +74 -4 rpm/js/rpmmc-js.c
1.2 +40 -0 rpm/js/tscripts/Mc.js
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/js/rpmhdr-js.c
============================================================================
$ cvs diff -u -r1.9 -r1.10 rpmhdr-js.c
--- rpm/js/rpmhdr-js.c 27 Apr 2009 15:18:14 -0000 1.9
+++ rpm/js/rpmhdr-js.c 28 Apr 2009 20:15:54 -0000 1.10
@@ -36,7 +36,7 @@
/*@notreached@*/ break;
case RPM_BIN_TYPE: /* XXX return as array of octets for now. */
case RPM_UINT8_TYPE:
- vec = xmalloc(he->c * sizeof(he->c));
+ vec = xmalloc(he->c * sizeof(*vec));
for (i = 0; i < (int)he->c; i++)
vec[i] = INT_TO_JSVAL(he->p.ui8p[i]);
arr = JS_NewArrayObject(cx, he->c, vec);
@@ -47,7 +47,7 @@
if (vp) *vp = OBJECT_TO_JSVAL(arr);
break;
case RPM_UINT16_TYPE:
- vec = xmalloc(he->c * sizeof(he->c));
+ vec = xmalloc(he->c * sizeof(*vec));
for (i = 0; i < (int)he->c; i++)
vec[i] = INT_TO_JSVAL(he->p.ui16p[i]);
arr = JS_NewArrayObject(cx, he->c, vec);
@@ -58,7 +58,7 @@
if (vp) *vp = OBJECT_TO_JSVAL(arr);
break;
case RPM_UINT32_TYPE:
- vec = xmalloc(he->c * sizeof(he->c));
+ vec = xmalloc(he->c * sizeof(*vec));
for (i = 0; i < (int)he->c; i++)
vec[i] = INT_TO_JSVAL(he->p.ui32p[i]);
arr = JS_NewArrayObject(cx, he->c, vec);
@@ -69,7 +69,7 @@
if (vp) *vp = OBJECT_TO_JSVAL(arr);
break;
case RPM_UINT64_TYPE:
- vec = xmalloc(he->c * sizeof(he->c));
+ vec = xmalloc(he->c * sizeof(*vec));
for (i = 0; i < (int)he->c; i++)
vec[i] = INT_TO_JSVAL(he->p.ui64p[i]);
arr = JS_NewArrayObject(cx, he->c, vec);
@@ -80,7 +80,7 @@
if (vp) *vp = OBJECT_TO_JSVAL(arr);
break;
case RPM_STRING_ARRAY_TYPE:
- vec = xmalloc(he->c * sizeof(he->c));
+ vec = xmalloc(he->c * sizeof(*vec));
for (i = 0; i < (int)he->c; i++) {
if ((valstr = JS_NewStringCopyZ(cx, he->p.argv[i])) == NULL)
goto exit;
@@ .
patch -p0 <<'@@ .'
Index: rpm/js/rpmmc-js.c
============================================================================
$ cvs diff -u -r1.1 -r1.2 rpmmc-js.c
--- rpm/js/rpmmc-js.c 28 Apr 2009 17:31:18 -0000 1.1
+++ rpm/js/rpmmc-js.c 28 Apr 2009 20:15:54 -0000 1.2
@@ -7,6 +7,7 @@
#include "rpmmc-js.h"
#include "rpmjs-debug.h"
+#define _MACRO_INTERNAL
#include <rpmmacro.h>
#include "debug.h"
@@ -63,6 +64,43 @@
}
static JSBool
+rpmmc_list(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+ void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmcClass, NULL);
+ rpmmc mc = ptr;
+ void * _mire = NULL;
+ int used = -1;
+ const char ** av = NULL;
+ int ac = 0;
+ JSBool ok = JS_FALSE;
+
+if (_debug)
+fprintf(stderr, "==> %s(%p,%p,%p[%u],%p) ptr %p\n", __FUNCTION__, cx, obj, argv, \
(unsigned)argc, rval, ptr); +
+/*@-globs@*/
+ ac = rpmGetMacroEntries(mc, _mire, used, &av);
+/*@=globs@*/
+ if (ac > 0 && av != NULL && av[0] != NULL) {
+ jsval *vec = xmalloc(ac * sizeof(*vec));
+ JSString *valstr;
+ int i;
+ for (i = 0; i < ac; i++) {
+ /* XXX lua splits into {name,opts,body} triple. */
+ if ((valstr = JS_NewStringCopyZ(cx, av[i])) == NULL)
+ goto exit;
+ vec[i] = STRING_TO_JSVAL(valstr);
+ }
+ *rval = OBJECT_TO_JSVAL(JS_NewArrayObject(cx, ac, vec));
+ vec = _free(vec);
+ } else
+ *rval = JSVAL_NULL; /* XXX JSVAL_VOID? */
+
+ ok = JS_TRUE;
+exit:
+ return ok;
+}
+
+static JSBool
rpmmc_expand(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmcClass, NULL);
@@ -78,8 +116,7 @@
if (!(ok = JS_ConvertArguments(cx, argc, argv, "s", &s)))
goto exit;
- /* XXX FIXME: expand in given context, don't assume global. */
- t = rpmExpand(s, NULL);
+ t = rpmMCExpand(mc, s, NULL);
if ((valstr = JS_NewStringCopyZ(cx, t)) == NULL)
goto exit;
@@ -94,6 +131,7 @@
static JSFunctionSpec rpmmc_funcs[] = {
{"add", rpmmc_add, 0,0,0},
{"del", rpmmc_del, 0,0,0},
+ {"list", rpmmc_list, 0,0,0},
{"expand", rpmmc_expand, 0,0,0},
JS_FS_END
};
@@ -242,6 +280,31 @@
{
rpmmc mc = NULL; /* XXX FIXME: only global context for now. */
+if (_debug)
+fprintf(stderr, "==> %s(%p,%p,%p) mc %p\n", __FUNCTION__, cx, obj, o, mc);
+
+ if (o == NULL) {
+if (_debug)
+fprintf(stderr, "\tinitMacros() mc %p\n", mc);
+ } else
+ if (OBJ_IS_STRING(cx, o)) {
+ const char * s =
+ JS_GetStringBytes(JS_ValueToString(cx, OBJECT_TO_JSVAL(o)));
+ if (!strcmp(s, "global"))
+ mc = rpmGlobalMacroContext;
+ else if (!strcmp(s, "cli"))
+ mc = rpmCLIMacroContext;
+ else {
+ mc = xcalloc(1, sizeof(*mc));
+ if (s && *s)
+ rpmInitMacros(mc, s);
+ else
+ s = "";
+ }
+if (_debug)
+fprintf(stderr, "\tinitMacros(\"%s\") mc %p\n", s, mc);
+ }
+
if (!JS_SetPrivate(cx, obj, (void *)mc)) {
/* XXX error msg */
return NULL;
@@ -253,10 +316,14 @@
rpmmc_dtor(JSContext *cx, JSObject *obj)
{
void * ptr = JS_GetInstancePrivate(cx, obj, &rpmmcClass, NULL);
+ rpmmc mc = ptr;
if (_debug)
fprintf(stderr, "==> %s(%p,%p) ptr %p\n", __FUNCTION__, cx, obj, ptr);
-
+ if (!(mc == rpmGlobalMacroContext || mc == rpmCLIMacroContext)) {
+ rpmFreeMacros(mc);
+ mc = _free(mc);
+ }
}
static JSBool
@@ -268,8 +335,11 @@
if (_debug)
fprintf(stderr, "==> %s(%p,%p,%p[%u],%p)%s\n", __FUNCTION__, cx, obj, argv, \
(unsigned)argc, rval, ((cx->fp->flags & JSFRAME_CONSTRUCTING) ? " constructing" : \
""));
+ if (!(ok = JS_ConvertArguments(cx, argc, argv, "/o", &o)))
+ goto exit;
+
if (cx->fp->flags & JSFRAME_CONSTRUCTING) {
- (void) rpmmc_init(cx, obj, NULL);
+ (void) rpmmc_init(cx, obj, o);
} else {
if ((obj = JS_NewObject(cx, &rpmmcClass, NULL, NULL)) == NULL)
goto exit;
@@ .
patch -p0 <<'@@ .'
Index: rpm/js/tscripts/Mc.js
============================================================================
$ cvs diff -u -r1.1 -r1.2 Mc.js
--- rpm/js/tscripts/Mc.js 28 Apr 2009 17:31:19 -0000 1.1
+++ rpm/js/tscripts/Mc.js 28 Apr 2009 20:15:54 -0000 1.2
@@ -8,9 +8,14 @@
ack('mc.expand("%{_bindir}")', "/usr/bin");
+// XXX noisy, adding pattern/index/level filters todo++
+// nack('mc.list()', null);
ack('mc.add("foo bar")', true);
ack('mc.expand("%{foo}")', "bar");
ack('mc.del("foo")', true);
+ack('mc.expand("%{foo}")', "%{foo}");
+// XXX noisy, adding pattern/index/level filters todo++
+// ack('mc.list()', false);
ack('mc.expand("%{lua:print(\\"lua\\")}")', "lua");
@@ -20,5 +25,40 @@
ack('mc.expand("%{ruby:puts \\"ruby\\"}")', "ruby");
ack('mc.expand("%{tcl:puts \\"tcl\\"}")', "tcl");
+delete mc
+
+mc = new Mc("cli");
+ack('mc.list()', null);
+ack('mc.add("foo bar")', true);
+ack('mc.list()', "%foo bar");
+ack('mc.expand("%{foo}")', "bar");
+ack('mc.del("foo")', true);
+ack('mc.list()', null);
+ack('mc.expand("%{foo}")', "%{foo}");
+delete mc
+
+mc = new Mc("tscripts/macros");
+ack('mc.list()', null);
+ack('mc.add("foo bar")', true);
+ack('mc.list()', "%foo bar");
+ack('mc.expand("%{foo}")', "bar");
+ack('mc.del("foo")', true);
+ack('mc.list()', null);
+ack('mc.expand("%{foo}")', "%{foo}");
+delete mc
+
+mc = new Mc("");
+ack('mc.list()', null);
+ack('mc.add("foo bar")', true);
+ack('mc.list()', "%foo bar");
+ack('mc.expand("%{foo}")', "bar");
+ack('mc.del("foo")', true);
+ack('mc.list()', null);
+ack('mc.expand("%{foo}")', "%{foo}");
+delete mc
+
+// FIXME: there's no internal code path error returns to force an error out.
+mc = new Mc("tscripts/nonexistent");
+delete mc
if (loglvl) print("<-- Mc.js");
@@ .
______________________________________________________________________
RPM Package Manager http://rpm5.org
CVS Sources Repository rpm-cvs@rpm5.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic