[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