Exemplo n.º 1
0
int linkedgenvertices (edge_t *ep, vertex_t *v0p, vertex_t *v1p) {
    if (ep->v0p || ep->v1p) {
        SUwarning (1, "linkedgenvertices", "edge %d has vertices", ep->tlid);
        return -1;
    }
    if (v0p) {
        ep->v0p = v0p;
        if (v0p->edgepl == v0p->edgepn) {
            if (!(v0p->edgeps = vmresize (
                Vmheap, v0p->edgeps,
                (v0p->edgepn * 2) * sizeof (edge_t *), VM_RSCOPY
            ))) {
                SUwarning (1, "linkedgenvertices", "vmresize failed (1)");
                return -1;
            }
            v0p->edgepn *= 2;
        }
        v0p->edgeps[(ep->v0i = v0p->edgepl++)] = ep;
    }
    if (v1p) {
        ep->v1p = v1p;
        if (v1p->edgepl == v1p->edgepn) {
            if (!(v1p->edgeps = vmresize (
                Vmheap, v1p->edgeps,
                (v1p->edgepn * 2) * sizeof (edge_t *), VM_RSCOPY
            ))) {
                SUwarning (1, "linkedgenvertices", "vmresize failed (2)");
                return -1;
            }
            v1p->edgepn *= 2;
        }
        v1p->edgeps[(ep->v1i = v1p->edgepl++)] = ep;
    }
    return 0;
}
Exemplo n.º 2
0
int linkedgenpolys (edge2polydata_t *e2pdp) {
    edge_t *ep;
    poly_t *p0p, *p1p, *pp;

    if (!(ep = findedge (e2pdp->tlid))) {
        SUwarning (1, "linkedgenpolys", "findedge failed");
        return -1;
    }
    p0p = p1p = NULL;
    if (e2pdp->polyidl && !(p0p = findpoly (e2pdp->polyidl, e2pdp->cenidl))) {
        SUwarning (1, "linkedgenpolys", "findpoly failed for left poly");
        return -1;
    }
    if (e2pdp->polyidr && !(p1p = findpoly (e2pdp->polyidr, e2pdp->cenidr))) {
        SUwarning (1, "linkedgenpolys", "findpoly failed for right poly");
        return -1;
    }
    if (
        (ep->p0p && p0p && !ep->p1p && !p1p) ||
        (!ep->p0p && !p0p && ep->p1p && p1p)
    )
        pp = p0p, p0p = p1p, p1p = pp;
    if ((ep->p0p && p0p) || (ep->p1p && p1p))
        SUwarning (1, "linkedgenpolys", "edge has polys attached");
    if (p0p && !ep->p0p) {
        ep->p0p = p0p;
        if (p0p->edgepl == p0p->edgepn) {
            if (!(p0p->edgeps = vmresize (
                Vmheap, p0p->edgeps,
                (p0p->edgepn * 2) * sizeof (edge_t *), VM_RSCOPY
            ))) {
                SUwarning (1, "linkedgenpolys", "vmresize failed (1)");
                return -1;
            }
            p0p->edgepn *= 2;
        }
        p0p->edgeps[(ep->p0i = p0p->edgepl++)] = ep;
    }
    if (p1p && !ep->p1p) {
        ep->p1p = p1p;
        if (p1p->edgepl == p1p->edgepn) {
            if (!(p1p->edgeps = vmresize (
                Vmheap, p1p->edgeps,
                (p1p->edgepn * 2) * sizeof (edge_t *), VM_RSCOPY
            ))) {
                SUwarning (1, "linkedgenpolys", "vmresize failed (2)");
                return -1;
            }
            p1p->edgepn *= 2;
        }
        p1p->edgeps[(ep->p1i = p1p->edgepl++)] = ep;
    }
    return 0;
}
Exemplo n.º 3
0
int EEcaddvar (int codej) {
    int varj, id;
    char *np;

    np = (char *) &codep[codej].u.s[0];

    for (varj = 0; varj < vari; varj++) {
        if (strcmp (vars[varj].nam, np) == 0)
            return varj;
    }
    if (vari >= varn) {
        if (!(vars = vmresize (
            Vmheap, vars, (varn + VARINCR) * VARSIZE, VM_RSCOPY
        ))) {
            SUwarning (0, "EEcaddvar", "cannot resize var array");
            return -1;
        }
        varn += VARINCR;
    }
    varj = vari++;
    vars[varj].id = -1;
    for (id = 0; currdict[id]; id++) {
        if (strcmp (currdict[id], np) == 0) {
            vars[varj].id = id;
            break;
        }
    }
    vars[varj].nam = np;

    return varj;
}
Exemplo n.º 4
0
int EEcstring (char *s, int recheck) {
    int codej, size, incr;
    char *s1;

    size = (strlen (s) + stringoffset + CODESIZE - 1) / CODESIZE;
    if (codei + size > coden) {
        incr = (size > CODEINCR) ? size : CODEINCR;
        if (!(codep = vmresize (
            Vmheap, codep, (coden + incr) * CODESIZE, VM_RSCOPY
        ))) {
            SUwarning (0, "EEcnew", "cannot resize code array");
            return -1;
        }
        coden += incr;
    }
    codej = codei, codei += size;
    memset (&codep[codej], 0, sizeof (EEcode_t) * size);
    codep[codej].ctype = C_CSTRING;
    if (recheck)
        for (s1 = s; *s1; s1++)
            if (!isalnum (*s1) && *s1 != '_') {
                codep[codej].ctype = C_RSTRING;
                break;
            }
    codep[codej].fp = C_NULL;
    codep[codej].next = C_NULL;
    codep[codej].vari = codep[codej].vali = -1;
    strcpy ((char *) &codep[codej].u.s[0], s);

    return codej;
}
Exemplo n.º 5
0
tmain()
{
	Vmalloc_t	*vm;
	Void_t		*dt[10];
	int		i;

	if(!(vm = vmopen(Vmdcsbrk, Vmbest, 0)) )
		terror("Couldn't open region");

	if(!(dt[0] = vmalloc(vm, 32)) )
		terror("vmalloc failed1");
	if(!(dt[1] = vmalloc(vm, 32)) )
		terror("vmalloc failed2");
	if(!(dt[2] = vmalloc(vm, 32)) )
		terror("vmalloc failed3");
	vmfree(vm,dt[1]);
	vmfree(vm,dt[2]);
	if(!(dt[0] = vmresize(vm, dt[0], 60, VM_RSCOPY)) )
		terror("bestresize did not extend correctly");
	if(!(dt[0] = vmresize(vm, dt[0], 32, VM_RSCOPY)) )
		terror("bestresize did not reduce correctly2");

	if(!(dt[1] = vmalloc(vm, 16)) )
		terror("vmalloc failed4");
	if(!(dt[2] = vmalloc(vm, 16)) )
		terror("vmalloc failed5");
	if(!(dt[3] = vmalloc(vm, 24)) )
		terror("vmalloc failed6");
	if(!(dt[4] = vmalloc(vm, 32)) )
		terror("vmalloc failed7");
	if(!(dt[5] = vmalloc(vm, 40)) )
		terror("vmalloc failed8");
	vmfree(vm,dt[2]);
	vmfree(vm,dt[3]);
	vmfree(vm,dt[4]);
	vmfree(vm,dt[5]);
	if(!(dt[1] = vmresize(vm,dt[1], 80, VM_RSCOPY)) )
		terror("vmresize failed");
	vmfree(vm,dt[1]);

	if(!(dt[0] = vmresize(vm, dt[0], 120, VM_RSCOPY)) )
		terror("vmresize did not extend correctly3");

	texit(0);
}
Exemplo n.º 6
0
int EEcaddval (int codej) {
    int valj;

    for (valj = 0; valj < vali; valj++) {
        if (vals[valj].type != codep[codej].ctype)
            continue;
        switch (codep[codej].ctype) {
        case C_INTEGER:
            if (vals[valj].u.i == codep[codej].u.i)
                return valj;
            break;
        case C_REAL:
            if (vals[valj].u.f == codep[codej].u.f)
                return valj;
            break;
        case C_CSTRING:
        case C_RSTRING:
            if (strcmp (vals[valj].u.s, &codep[codej].u.s[0]) == 0)
                return valj;
            break;
        }
    }

    if (vali >= valn) {
        if (!(vals = vmresize (
            Vmheap, vals, (valn + VALINCR) * VALSIZE, VM_RSCOPY
        ))) {
            SUwarning (0, "EEcaddval", "cannot resize val array");
            return -1;
        }
        valn += VALINCR;
    }
    valj = vali++;
    vals[valj].type = codep[codej].ctype;
    switch (codep[codej].ctype) {
    case C_INTEGER: vals[valj].u.i = codep[codej].u.i;     break;
    case C_REAL:    vals[valj].u.f = codep[codej].u.f;     break;
    case C_CSTRING: vals[valj].u.s = &codep[codej].u.s[0]; break;
    case C_RSTRING: vals[valj].u.s = &codep[codej].u.s[0]; break;
    }

    return valj;
}
Exemplo n.º 7
0
int mergepolys (edge_t *mep) {
    int edgepi;
    edge_t *ep;
    poly_t *p0p, *p1p;

    if (!mep->p0p || !mep->p1p) {
        SUwarning (
            1, "mergepolys", "edge %d does not have both poly pointers",
            mep->tlid
        );
        return -1;
    }
    if (mep->p0p != mep->p1p) {
        if (mep->p1p->edgepl > mep->p0p->edgepl)
            p0p = mep->p1p, p1p = mep->p0p;
        else
            p0p = mep->p0p, p1p = mep->p1p;
        if (p0p->edgepl + p1p->edgepl > p0p->edgepn) {
            if (!(p0p->edgeps = vmresize (
                Vmheap, p0p->edgeps, (p0p->edgepl +
                p1p->edgepl) * sizeof (edge_t *), VM_RSCOPY
            ))) {
                SUwarning (1, "mergepolys", "vmresize failed");
                return -1;
            }
            p0p->edgepn = p0p->edgepl + p1p->edgepl;
        }
        for (edgepi = 0; edgepi < p1p->edgepl; edgepi++) {
            ep = p1p->edgeps[edgepi];
            if (ep->p0p == p1p)
                ep->p0p = p0p, ep->p0i = p0p->edgepl;
            else if (ep->p1p == p1p)
                ep->p1p = p0p, ep->p1i = p0p->edgepl;
            p0p->edgeps[p0p->edgepl++] = ep;
        }
        p1p->edgepl = 0;
        destroypoly (p1p);
    }
    destroyedge (mep);
    return 0;
}
Exemplo n.º 8
0
int EEcnew (int ctype) {
    int codej;

    if (codei >= coden) {
        if (!(codep = vmresize (
            Vmheap, codep, (coden + CODEINCR) * CODESIZE, VM_RSCOPY
        ))) {
            SUwarning (0, "EEcnew", "cannot resize code array");
            return -1;
        }
        coden += CODEINCR;
    }
    codej = codei++;
    memset (&codep[codej], 0, sizeof (EEcode_t));
    codep[codej].ctype = ctype;
    codep[codej].fp = C_NULL;
    codep[codej].next = C_NULL;
    codep[codej].vari = codep[codej].vali = -1;

    return codej;
}
Exemplo n.º 9
0
int main (int argc, char **argv) {
    int norun;
    char *mapnamep, mapmode, *onamep, *classp;
    int keytype, keylen, valtype, vallen, dictincr, itemincr;
    AGGRfile_t *iafp, *oafp;
    char file[PATH_MAX];
    Sfio_t *fp;
    AGGRreaggr_t *reaggrs;
    int reaggrn, reaggrl;
    int count, rejcount;
    char *line, *s;
    unsigned char *ikeyp, *okeyp;
    char *avs[10];
    int avn;
    int ret;

    if (AGGRinit () == -1)
        SUerror ("aggrreaggr", "init failed");
    mapnamep = NULL, mapmode = 0;
    onamep = "reaggr.aggr";
    classp = "aggrreaggr";
    keytype = AGGR_TYPE_STRING;
    keylen = -1;
    valtype = -1, vallen = -1;
    dictincr = 1, itemincr = 1;
    norun = 0;
    for (;;) {
        switch (optget (argv, usage)) {
        case -100:
            onamep = opt_info.arg;
            continue;
        case -101:
            classp = opt_info.arg;
            continue;
        case -102:
            if (AGGRparsetype (opt_info.arg, &keytype, &keylen) == -1)
                SUerror ("aggrreaggr", "bad argument for -kt option");
            continue;
        case -103:
            if (AGGRparsetype (opt_info.arg, &valtype, &vallen) == -1)
                SUerror ("aggrreaggr", "bad argument for -vt option");
            continue;
        case -104:
            dictincr = opt_info.num;
            continue;
        case -105:
            itemincr = opt_info.num;
            continue;
        case -114:
            mapnamep = opt_info.arg;
            mapmode = 'a';
            continue;
        case -115:
            mapnamep = opt_info.arg;
            mapmode = 'b';
            continue;
        case -999:
            SUwarnlevel++;
            continue;
        case '?':
            SUusage (0, "aggrreaggr", opt_info.arg);
            norun = 1;
            continue;
        case ':':
            SUusage (1, "aggrreaggr", opt_info.arg);
            norun = 2;
            continue;
        }
        break;
    }
    if (norun)
        return norun - 1;
    argc -= opt_info.index, argv += opt_info.index;
    if (argc != 1)
        SUerror ("aggrreaggr", "no input file name specified");
    if (!mapnamep)
        SUerror ("aggrreaggr", "no map file name specified");
    if (!(iafp = AGGRopen (argv[0], AGGR_RWMODE_RD, 1, TRUE)))
        SUerror ("aggrreaggr", "open failed");
    if (valtype == -1) {
        valtype = AGGR_TYPE_FLOAT;
        vallen = (
            iafp->hdr.vallen / AGGRtypelens[iafp->hdr.valtype]
        ) * AGGRtypelens[valtype];
    }
    if (!(oafp = AGGRcreate (
        onamep, 1, 1, keytype, valtype, classp,
        keylen, vallen, dictincr, itemincr, 1, TRUE
    )))
        SUerror ("aggrreaggr", "create failed");
    if (strcmp (mapnamep, "-") == 0)
        fp = sfstdin;
    else {
        if (access (mapnamep, R_OK) == 0)
            strcpy (file, mapnamep);
        else if (!pathaccess (
            getenv ("PATH"), "../lib/aggr", mapnamep, R_OK, file, PATH_MAX
        ))
            SUerror ("aggrreaggr", "cannot find map file");
        if (!(fp = sfopen (NULL, file, "r")))
            SUerror ("aggrreaggr", "sfopen failed");
    }
    sfsetbuf (fp, NULL, 1048576);
    if (iafp->ad.keylen != -1)
        if (!(ikeyp = vmalloc (Vmheap, iafp->ad.keylen)))
            SUerror ("aggrreaggr", "vmalloc failed");
    if (oafp->ad.keylen != -1)
        if (!(okeyp = vmalloc (Vmheap, oafp->ad.keylen)))
            SUerror ("aggrreaggr", "vmalloc failed");
    if (!(reaggrs = vmalloc (Vmheap, 100 * sizeof (AGGRreaggr_t))))
        SUerror ("aggrreaggr", "vmalloc failed");
    reaggrn = 100, reaggrl = 0;
    count = 0, rejcount = 0;
    switch (mapmode) {
    case 'a':
        while ((line = sfgetr (fp, '\n', 1))) {
            count++;
            if ((avn = tokscan (line, &s, " %v ", avs, 10)) < 1 || avn > 2) {
                SUwarning (1, "aggrreaggr", "bad line %d", count);
                rejcount++;
                continue;
            }
            if (reaggrl >= reaggrn) {
                if (!(reaggrs = vmresize (
                    Vmheap, reaggrs, reaggrn * 2 * sizeof (AGGRreaggr_t),
                    VM_RSCOPY
                )))
                    SUerror ("aggrreaggr", "vmresize failed");
                reaggrn *= 2;
            }
            if (_aggrdictscankey (iafp, avs[0], &ikeyp) == -1) {
                SUwarning (1, "aggrreaggr", "bad key at line %d", count);
                rejcount++;
                continue;
            }
            reaggrs[reaggrl].okeyp = copy (iafp, ikeyp);
            if (_aggrdictscankey (oafp, avs[1], &okeyp) == -1) {
                SUwarning (1, "aggrreaggr", "bad key at line %d", count);
                rejcount++;
                continue;
            }
            reaggrs[reaggrl].nkeyp = copy (oafp, okeyp);
            if (avn == 3)
                reaggrs[reaggrl].nitemi = atoi (avs[2]);
            else
                reaggrs[reaggrl].nitemi = -1;
            reaggrl++;
            if (count % 10000 == 0)
                SUmessage (
                    1, "aggrreaggr", "processed %d lines, dropped %d",
                    count, rejcount
                );
        }
        break;
    case 'b':
        while (1) {
            if (reaggrl >= reaggrn) {
                if (!(reaggrs = vmresize (
                    Vmheap, reaggrs, reaggrn * 2 * sizeof (AGGRreaggr_t),
                    VM_RSCOPY
                )))
                    SUerror ("aggrreaggr", "vmresize failed");
                reaggrn *= 2;
            }
            if (iafp->ad.keylen == -1) {
                if (!(ikeyp = (unsigned char *) sfgetr (fp, 0, 1))) {
                    if (sfvalue (fp) != 0)
                        SUerror ("aggrreaggr", "bad entry %d", reaggrl);
                    else
                        break;
                }
            } else {
                if ((ret = sfread (fp, ikeyp, iafp->ad.keylen)) == 0)
                    break;
                else if (ret != iafp->ad.keylen)
                    SUerror ("aggrreaggr", "bad entry %d", reaggrl);
                SWAPKEY (ikeyp, iafp->hdr.keytype, iafp->ad.keylen);
            }
            reaggrs[reaggrl].okeyp = copy (iafp, ikeyp);
            if (oafp->ad.keylen == -1) {
                if (!(okeyp = (unsigned char *) sfgetr (fp, 0, 1))) {
                    if (sfvalue (fp) != 0)
                        SUerror ("aggrreaggr", "bad entry %d", reaggrl);
                    else
                        break;
                }
            } else {
                if ((ret = sfread (fp, okeyp, oafp->ad.keylen)) == 0)
                    break;
                else if (ret != oafp->ad.keylen)
                    SUerror ("aggrreaggr", "bad entry %d", reaggrl);
            }
            reaggrs[reaggrl].nkeyp = copy (oafp, okeyp);
            count++;
            reaggrs[reaggrl].nitemi = -1;
            reaggrl++;
            if (count % 10000 == 0)
                SUmessage (
                    1, "aggrreaggr", "processed %d lines, dropped %d",
                    count, rejcount
                );
        }
        break;
    }
    SUmessage (
        rejcount > 0 ? 0 : 1,
        "aggrreaggr", "processed %d lines, dropped %d", count, rejcount
    );
    if (AGGRreaggr (iafp, reaggrs, reaggrl, oafp) == -1)
        SUerror ("aggrreaggr", "reaggr failed");
    if (AGGRminmax (oafp, TRUE) == -1)
        SUerror ("aggrreaggr", "minmax failed");
    if (AGGRclose (oafp) == -1)
        SUerror ("aggrreaggr", "close failed");
    if (AGGRterm () == -1)
        SUerror ("aggrreaggr", "term failed");
    return 0;
}
Exemplo n.º 10
0
tmain()
{
	Obj_t		*o, *next;
	Void_t		*huge;
	size_t		hugesz;
	Vmstat_t	sb;
	ssize_t		k, p;

	srandom(0);

	hugesz = Z_HUGE; /* one huge block to be resized occasionally */
	if(!(huge = vmalloc(Vmregion, hugesz)) )
		terror("Can't allocate block");

	for(k = 0; k < N_OBJ; ++k)
	{	
		/* free/resize all on this list */
		for(o = List[k]; o; o = next)
		{	next = o->next;

			if((RAND()%2) == 0 ) /* flip a coin to see if freeing */
				vmfree(Vmregion, o->obj);
			else /* resizing */
			{	o->size = ALLOCSIZE();
				if(!(o->obj = vmresize(Vmregion,o->obj,o->size,VM_RSMOVE)) )
					terror("Vmresize failed");
				TIME(p, k, o->size); /* add to a future list */
				o->next = List[p]; List[p] = o;
			}
		}

		if(COMPACT(k)) /* global compaction */
		{	if(vmstat(Vmregion, &sb) < 0)
				terror("Vmstat failed");
			tinfo("Arena: busy=(%u,%u) free=(%u,%u) extent=%u #segs=%d",
				sb.n_busy,sb.s_busy, sb.n_free,sb.s_free,
				sb.extent, sb.n_seg);
			if(vmcompact(Vmregion) < 0 )
				terror("Vmcompact failed");
			if(vmstat(Vmregion, &sb) < 0)
				terror("Vmstat failed");
			tinfo("Compact: busy=(%u,%u) free=(%u,%u) extent=%u #segs=%d",
				sb.n_busy,sb.s_busy, sb.n_free,sb.s_free,
				sb.extent, sb.n_seg);
		}

		if(RESIZE(k)) /* make the huge block bigger */
		{	hugesz += Z_HUGE;
			if(!(huge = vmresize(Vmregion, huge, hugesz, VM_RSMOVE)) )
				terror("Bad resize of huge block");
		}

		o = Obj+k; /* allocate a new block */
		o->size = ALLOCSIZE();
		if(!(o->obj = vmalloc(Vmregion, o->size)) )
			terror("Vmalloc failed");
		TIME(p, k, o->size);
		o->next = List[p]; List[p] = o;
	}

	if(vmdbcheck(Vmregion) < 0)
		terror("Corrupted region");

	if(vmstat(Vmregion, &sb) < 0)
		terror("Vmstat failed");
	tinfo("Full: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
		sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
	if(vmcompact(Vmregion) < 0 )
		terror("Vmcompact failed");
	if(vmstat(Vmregion, &sb) < 0)
		terror("Vmstat failed");
	tinfo("Compact: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
		sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);

	/* now free all left-overs */
	for(o = List[N_OBJ]; o; o = o->next)
		vmfree(Vmregion,o->obj);
	vmfree(Vmregion,huge);

	if(vmstat(Vmregion, &sb) < 0)
		terror("Vmstat failed");
	tinfo("Free: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
		sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);
	if(vmcompact(Vmregion) < 0 )
		terror("Vmcompact failed2");
	if(vmstat(Vmregion, &sb) < 0)
		terror("Vmstat failed");
	tinfo("Compact: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
		sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);

	if(!(huge = vmalloc(Vmregion, 10)))
		terror("Vmalloc failed");
	if(vmstat(Vmregion, &sb) < 0)
		terror("Vmstat failed");
	tinfo("Small: Busy=(%u,%u) Free=(%u,%u) Extent=%u #segs=%d\n",
		sb.n_busy, sb.s_busy, sb.n_free, sb.s_free, sb.extent, sb.n_seg);

	texit(0);
}
Exemplo n.º 11
0
int SWMIopnexec (state_t *sp) {
  char q[1024], opnstr[1024], *name, *origname, *s;
  opn_t *opnp, *opnbasep, *opntimep, *opnfreqp;
  obj_t *objp;
  HRESULT hr;
  BSTR propb, ctb, wqlb, qb;
  SAFEARRAY *props;
  VARIANT var;
  LONG pu, pl, pi;
  ULONG ul;
  double v;
  kvt_t *kvtp;
  int kvti;

  ctb = s2b ("countertype");
  wqlb = s2b ("WQL");
  for (
    objp = (obj_t *) dtfirst (objdict); objp;
    objp = (obj_t *) dtnext (objdict, objp)
  ) {
    sfsprintf (q, 1024, "select * from %s", objp->obj);
    if (verbose)
      sfprintf (sfstderr, "query: %s\n", q);
    if (!(qb = s2b (q))) {
      sfprintf (sfstderr, "cannot convert obj name %s to bstr\n", objp->obj);
      return -1;
    }

    if ((hr = sp->pSvc->ExecQuery (
      wqlb, qb, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      0, &sp->pEnum
    )) != S_OK) {
      sfprintf (
        sfstderr, "cannot execute query %s, error %s\n", q, E2ccp (hr)
      );
      return -1;
    }

    if (SWMIproxysecurity (sp, sp->pEnum) < 0) {
      sfprintf (sfstderr, "cannot enable security for query %s\n", q);
      return -1;
    }

    while (
      sp->pEnum->Next (30 * 1000, 1, &sp->pClsObj, &ul
    ) == S_OK && ul == 1) {
      if ((hr = sp->pClsObj->GetNames (
        0, WBEM_FLAG_ALWAYS | WBEM_FLAG_NONSYSTEM_ONLY, 0, &props
      )) != S_OK) {
        sfprintf (
          sfstderr, "cannot get props for obj %s, error %s\n",
          objp->obj, E2ccp (hr)
        );
        return -1;
      }
      if(
        (hr = SafeArrayGetLBound (props, 1, &pl)) != S_OK ||
        (hr = SafeArrayGetUBound (props, 1, &pu)) != S_OK
      ) {
        sfprintf (
          sfstderr, "cannot get props bounds for %s, error %s\n",
          objp->obj, E2ccp (hr)
        );
        return -1;
      }
      if (pu - pl + 1 > kvtn) {
        kvtn = pu - pl + 1;
        if (!(kvts = (kvt_t *) vmresize (
          Vmheap, kvts, kvtn * sizeof (kvt_t), VM_RSCOPY
        ))) {
          sfprintf (sfstderr, "cannot grow kvt array\n");
          return -1;
        }
      }
      name = NULL;
      for (pi = pl, kvtl = 0; pi <= pu; pi++, kvtl++) {
        kvtp = &kvts[kvtl];
        if ((hr = SafeArrayGetElement (props, &pi, &propb)) != S_OK) {
          sfprintf (
            sfstderr, "cannot get prop name for %d/%s, error %s\n",
            pi, objp->obj, E2ccp (hr)
          );
          continue;
        }
        kvtp->kp = (char *) b2s (propb);
        if ((hr = sp->pClsObj->Get (propb, 0, &var, 0, 0)) != S_OK) {
          sfprintf (
            sfstderr, "cannot get prop value for %d/%s, error %s\n",
            pi, objp->obj, E2ccp (hr)
          );
          continue;
        }
        if (
            !(kvtp->vp = (char *) V2ccp (&var)) ||
            !(kvtp->vp = vmstrdup (Vmheap, kvtp->vp))
        ) {
          kvtl--;
          continue;
        }
        switch (var.vt) {
        case VT_UI1: kvtp->v = var.bVal; break;
        case VT_I2: kvtp->v = var.iVal;  break;
        case VT_I4: kvtp->v = var.lVal;  break;
        default: kvtp->v = strtoull (kvtp->vp, &s, 10); break;
        }
        if (strcmp (kvtp->kp, "Name") == 0) {
          if (var.vt == VT_NULL)
            name = "ALL";
          else
            name = kvtp->vp;
          origname = name;
        }

        if ((hr = sp->pClsObj->GetPropertyQualifierSet (
          propb, &sp->pQualSet
        )) != S_OK) {
          sfprintf (
            sfstderr, "cannot get quals for %d/%s, error %s\n",
            pi, objp->obj, E2ccp (hr)
          );
          continue;
        }
        kvtp->type = V_TYPE_STRING;
        if ((hr = sp->pQualSet->Get (
          ctb, 0, &var, 0
        )) == S_OK && var.vt == VT_I4) {
          switch (var.lVal) {
          case PERF_COUNTER_RAWCOUNT:
          case PERF_COUNTER_LARGE_RAWCOUNT:
            kvtp->type = V_TYPE_SIMPLE; break;
          case PERF_RAW_FRACTION:
            kvtp->type = V_TYPE_WITHBASE; break;
          case PERF_RAW_BASE:
          case PERF_PRECISION_TIMESTAMP:
            kvtp->type = V_TYPE_ISBASE; break;
          case PERF_COUNTER_COUNTER:
          case PERF_COUNTER_BULK_COUNT:
            kvtp->type = V_TYPE_WITHTIMENFREQ; break;
          case PERF_100NSEC_TIMER:
            kvtp->type = V_TYPE_WITH100NSEC; break;
          case PERF_100NSEC_TIMER_INV:
            kvtp->type = V_TYPE_WITH100NSECINV; break;
          default:
            kvtp->type = V_TYPE_SIMPLE; break;
          }
        } else {
          if (strcmp (kvtp->kp, "Timestamp_PerfTime") == 0)
            kvtp->type = V_TYPE_ISTIME;
          else if (strcmp (kvtp->kp, "Frequency_PerfTime") == 0)
            kvtp->type = V_TYPE_ISFREQ;
          else if (strcmp (kvtp->kp, "Timestamp_Sys100NS") == 0)
            kvtp->type = V_TYPE_IS100NSEC;
          else if (kvtp->vp[0] == 0 || isdigit (kvtp->vp[0]))
            kvtp->type = V_TYPE_SIMPLE;
        }
      }
      ::SafeArrayDestroy (props);
      sp->pClsObj->Release ();

      for (kvti = 0; kvti < kvtl; kvti++) {
        kvtp = &kvts[kvti];
        sfsprintf (opnstr, 1024, "%s.%s.%s", objp->obj, kvtp->kp, name);
        if (!(opnp = (opn_t *) dtmatch (opndict, opnstr))) {
          sfsprintf (opnstr, 1024, "%s.%s.ALL", objp->obj, kvtp->kp);
          if ((opnp = (opn_t *) dtmatch (opndict, opnstr)))
            name = "ALL";
          else
            sfsprintf (opnstr, 1024, "%s.%s.%s", objp->obj, kvtp->kp, name);
        }

        if (!opnp) {
          if (kvtp->type < V_TYPE_SUPPORT)
            continue;
          if (!(opnp = opninsert (
            OPN_KIND_S, "", "", "", objp->obj, kvtp->kp, name, ""
          ))) {
            sfprintf (sfstderr, "cannot insert opn\n");
            return -1;
          }
          opnp->objp = objp;
        }
        if (opnp->ep && strstr (origname, opnp->ep))
          continue;
        if (opnp->type == 0)
          opnp->type = kvtp->type;
        opnp->vp = kvtp->vp;
        opnp->cv += kvtp->v;
        opnp->havec = TRUE;
      }
      for (kvti = 0; kvti < kvtl; kvti++) {
        kvtp = &kvts[kvti];
        sfsprintf (opnstr, 1024, "%s.%s.SUM", objp->obj, kvtp->kp);
        if (!(opnp = (opn_t *) dtmatch (opndict, opnstr)))
          continue;

        if (opnp->ep && strstr (origname, opnp->ep))
          continue;
        if (opnp->type == 0)
          opnp->type = kvtp->type;
        opnp->vp = kvtp->vp;
        opnp->cv += kvtp->v;
        opnp->havec = TRUE;
      }
    }
  }
  for (
    opnp = (opn_t *) dtfirst (opndict); opnp;
    opnp = (opn_t *) dtnext (opndict, opnp)
  ) {
    if (opnp->kind != OPN_KIND_P || !opnp->havec)
      continue;
    if (opnp->type >= V_TYPE_SUPPORT)
      continue;
    switch (opnp->type) {
    case V_TYPE_STRING:
#if 0
      sfprintf (
        sfstdout, "rt=STAT type=string name=%s str=%s%s%s%s\n",
        opnp->mname, opnp->vp,
        (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
        (opnp->lp[0]) ? "'" : ""
      );
#endif
      break;
    case V_TYPE_SIMPLE:
      sfprintf (
        sfstdout, "rt=STAT type=%s name=%s unit=%s num=%lld%s%s%s\n",
        opnp->mtype, opnp->mname, opnp->munit, opnp->cv,
        (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
        (opnp->lp[0]) ? "'" : ""
      );
      break;
    case V_TYPE_WITHBASE:
      sfsprintf (opnstr, 1024, "%s.%s_Base.%s", opnp->op, opnp->pp, opnp->np);
      if (!(opnbasep = (opn_t *) dtmatch (opndict, opnstr))) {
        sfprintf (sfstderr, "cannot find base property for %s\n", opnp->opn);
        continue;
      }
      if (!opnbasep->havec)
        continue;
      if ((v = (opnbasep->cv == 0) ? 0.00 : 100.0 * (
        opnp->cv / (double) opnbasep->cv
      )) < 0.0)
        continue;
      sfprintf (
        sfstdout, "rt=STAT type=%s name=%s unit=%s num=%lf%s%s%s\n",
        opnp->mtype, opnp->mname, opnp->munit, v,
        (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
        (opnp->lp[0]) ? "'" : ""
      );
      break;
    case V_TYPE_WITHTIMENFREQ:
      if (!opnp->havep)
        continue;
      sfsprintf (opnstr, 1024, "%s.Timestamp_PerfTime.%s", opnp->op, opnp->np);
      if (!(opntimep = (opn_t *) dtmatch (opndict, opnstr))) {
        sfprintf (sfstderr, "cannot find time property for %s\n", opnp->opn);
        continue;
      }
      if (!opntimep->havec || !opntimep->havep)
        continue;
      sfsprintf (opnstr, 1024, "%s.Frequency_PerfTime.%s", opnp->op, opnp->np);
      if (!(opnfreqp = (opn_t *) dtmatch (opndict, opnstr))) {
        sfprintf (sfstderr, "cannot find freq property for %s\n", opnp->opn);
        continue;
      }
      if (!opnfreqp->havec)
        continue;
      if (
        opnp->cv < opnp->pv || opntimep->cv <= opntimep->pv ||
        opnfreqp->cv == 0
      )
        continue;
      if ((v = (opnp->cv - opnp->pv) / (
        (opntimep->cv - opntimep->pv) / (double) opnfreqp->cv
      )) < 0.0) {
        if (v > -1)
          v = 0.0;
        else
          continue;
      }
      sfprintf (
        sfstdout, "rt=STAT type=%s name=%s unit=%s num=%lf%s%s%s\n",
        opnp->mtype, opnp->mname, opnp->munit, v,
        (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
        (opnp->lp[0]) ? "'" : ""
      );
      break;
    case V_TYPE_WITH100NSEC:
    case V_TYPE_WITH100NSECINV:
      if (!opnp->havep)
        continue;
      sfsprintf (opnstr, 1024, "%s.Timestamp_Sys100NS.%s", opnp->op, opnp->np);
      if (!(opntimep = (opn_t *) dtmatch (opndict, opnstr))) {
        sfprintf (sfstderr, "cannot find time property for %s\n", opnp->opn);
        continue;
      }
      if (!opntimep->havec || !opntimep->havep)
        continue;
      if (opnp->cv < opnp->pv || opntimep->cv <= opntimep->pv)
        continue;
      if (opnp->type == V_TYPE_WITH100NSEC) {
        if ((v = 100.0 * (
          (opnp->cv - opnp->pv) /
          ((double) opntimep->cv - opntimep->pv)
        )) < 0.0) {
          if (v > -1)
            v = 0.0;
          else
            continue;
        }
        sfprintf (
          sfstdout, "rt=STAT type=%s name=%s unit=%s num=%lf%s%s%s\n",
          opnp->mtype, opnp->mname, opnp->munit, v,
          (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
          (opnp->lp[0]) ? "'" : ""
        );
      } else {
        if ((v = 100.0 * (
          1.0 - (opnp->cv - opnp->pv) /
          ((double) opntimep->cv - opntimep->pv)
        )) < 0.0) {
          if (v > -1)
            v = 0.0;
          else
            continue;
        }
        sfprintf (
          sfstdout, "rt=STAT type=%s name=%s unit=%s num=%lf%s%s%s\n",
          opnp->mtype, opnp->mname, opnp->munit, v,
          (opnp->lp[0]) ? " label='" : "", (opnp->lp[0]) ? opnp->lp : "",
          (opnp->lp[0]) ? "'" : ""
        );
      }
      break;
    }
  }
  return 0;
}
Exemplo n.º 12
0
static int recparse (
    XMLnode_t *xp, EMrec_t *crecs, int crecn, EMrec_t *drecs, int drecn,
    int dir, EMbb_t *bbp
) {
    EMrec_t *recs, *recp;
    int reci, recj, recn, ri;
    RIop_t *opp, top;
    int opi, opk, opl;
    EMbb_t cbb;
    EMimage_t *ip, *imem;
    XMLnode_t *cp, *pp, *tp, *fnp, *fsp, *clp;
    char *fs, *fn, *cl;
    int ci;
    int dw, dh;

    if (xp->type == XML_TYPE_TEXT) {
        SUwarning (0, "recparse", "called with text node");
        return -1;
    }

    opk = EMopm;
    bbp->w = bbp->h = 0;
    for (ci = 0; ci < xp->nodem; ci++) {
        cp = xp->nodes[ci];
        if (cp->type == XML_TYPE_TEXT)
            continue;
        if (strcmp (cp->tag, "v") == 0 || strcmp (cp->tag, "h") == 0) {
            opl = EMopm;
            if (recparse (
                cp, crecs, crecn, drecs, drecn,
                (cp->tag[0] == 'v') ? EM_DIR_V : EM_DIR_H, &cbb
            ) == -1) {
                SUwarning (0, "recparse", "cannot parse v list");
                return -1;
            }
            if (dir == EM_DIR_H) {
                for (opi = opl; opi < EMopm; opi++) {
                    if (EMops[opi].type == RI_OP_I) {
                        EMops[opi].u.img.rx += bbp->w;
                        EMops[opi].u.img.ry += (bbp->h - cbb.h) / 2;
                    } else if (EMops[opi].type == RI_OP_T) {
                        EMops[opi].u.text.p.x += bbp->w;
                        EMops[opi].u.text.p.y += (bbp->h - cbb.h) / 2;
                    }
                }
                bbp->w += cbb.w;
                if (bbp->h < cbb.h) {
                    dh = cbb.h - bbp->h;
                    bbp->h = cbb.h;
                    for (opi = opk; opi < EMopm; opi++) {
                        if (EMops[opi].type == RI_OP_I)
                            EMops[opi].u.img.ry += dh / 2;
                        else if (EMops[opi].type == RI_OP_T)
                            EMops[opi].u.text.p.y += dh / 2;
                    }
                }
            } else {
                for (opi = opl; opi < EMopm; opi++) {
                    if (EMops[opi].type == RI_OP_I) {
                        EMops[opi].u.img.ry += bbp->h;
                        EMops[opi].u.img.rx += (bbp->w - cbb.w) / 2;
                    } else if (EMops[opi].type == RI_OP_T) {
                        EMops[opi].u.text.p.y += bbp->h;
                        EMops[opi].u.text.p.x += (bbp->w - cbb.w) / 2;
                    }
                }
                bbp->h += cbb.h;
                if (bbp->w < cbb.w) {
                    dw = cbb.w - bbp->w;
                    bbp->w = cbb.w;
                    for (opi = opk; opi < EMopm; opi++) {
                        if (EMops[opi].type == RI_OP_I)
                            EMops[opi].u.img.rx += dw / 2;
                        else if (EMops[opi].type == RI_OP_T)
                            EMops[opi].u.text.p.x += dw / 2;
                    }
                }
            }
        } else if (strcmp (cp->tag, "rimg") == 0) {
            if (!(tp = XMLfind (cp, "path", XML_TYPE_TEXT, -1, TRUE))) {
                SUwarning (0, "recparse", "cannot find rimg/path");
                continue;
            }
            if (!(ip = dtmatch (imagedict, tp->text))) {
                if (!(imem = vmalloc (Vmheap, sizeof (EMimage_t)))) {
                    SUwarning (0, "recparse", "cannot allocate imem");
                    return -1;
                }
                memset (imem, 0, sizeof (EMimage_t));
                if (!(imem->file = vmstrdup (Vmheap, tp->text))) {
                    SUwarning (0, "recparse", "cannot copy image file");
                    return -1;
                }
                if (!(ip = dtinsert (imagedict, imem))) {
                    SUwarning (0, "recparse", "cannot insert image");
                    vmfree (Vmheap, imem->file);
                    vmfree (Vmheap, imem);
                    return -1;
                }
                if (RIloadimage (ip->file, &ip->op) == -1) {
                    SUwarning (0, "recparse", "cannot load image");
                    continue;
                }
            }

            if (ip->op.type == RI_OP_NOOP) {
                if ((pp = XMLfind (cp, "alt", XML_TYPE_TAG, -1, TRUE))) {
                    if (recparse (
                        pp, crecs, crecn, drecs, drecn, dir, &cbb
                    ) == -1) {
                        SUwarning (0, "recparse", "cannot parse alt tag");
                        return -1;
                    }
                    if (dir == EM_DIR_H) {
                        bbp->w += cbb.w;
                        if (bbp->h < cbb.h) {
                            dh = cbb.h - bbp->h;
                            bbp->h = cbb.h;
                        }
                    } else {
                        bbp->h += cbb.h;
                        if (bbp->w < cbb.w) {
                            dw = cbb.w - bbp->w;
                            bbp->w = cbb.w;
                        }
                    }
                }
            } else {
                if (EMopm >= EMopn) {
                    if (!(EMops = vmresize (
                        Vmheap, EMops, (EMopn + 100) * sizeof (RIop_t),
                        VM_RSCOPY
                    ))) {
                        SUwarning (0, "recparse", "cannot grow EMops array");
                        return -1;
                    }
                    EMopn += 100;
                }
                opp = &EMops[EMopm++];
                *opp = ip->op;
                if (dir == EM_DIR_H) {
                    opp->u.img.rx = bbp->w + EM_MARGIN_W / 2;
                    opp->u.img.ry = (bbp->h - opp->u.img.ih) / 2;
                    bbp->w += opp->u.img.iw + EM_MARGIN_W;
                    if (bbp->h < opp->u.img.ih + EM_MARGIN_H) {
                        dh = opp->u.img.ih + EM_MARGIN_H - bbp->h;
                        bbp->h = opp->u.img.ih + EM_MARGIN_H;
                        for (opi = opk; opi < EMopm; opi++) {
                            if (EMops[opi].type == RI_OP_I)
                                EMops[opi].u.img.ry += dh / 2;
                            else if (EMops[opi].type == RI_OP_T)
                                EMops[opi].u.text.p.y += dh / 2;
                        }
                    }
                } else {
                    opp->u.img.rx = (bbp->w - opp->u.img.iw) / 2;
                    opp->u.img.ry = bbp->h + EM_MARGIN_H / 2;
                    if (bbp->w < opp->u.img.iw + EM_MARGIN_W) {
                        dw = opp->u.img.iw + EM_MARGIN_W - bbp->w;
                        bbp->w = opp->u.img.iw + EM_MARGIN_W;
                        for (opi = opk; opi < EMopm; opi++) {
                            if (EMops[opi].type == RI_OP_I)
                                EMops[opi].u.img.rx += dw / 2;
                            else if (EMops[opi].type == RI_OP_T)
                                EMops[opi].u.text.p.x += dw / 2;
                        }
                    }
                    bbp->h += opp->u.img.ih + EM_MARGIN_H;
                }
            }
        } else if (strcmp (cp->tag, "qimg") == 0) {
            if (!(tp = XMLfind (cp, "path", XML_TYPE_TEXT, -1, TRUE))) {
                SUwarning (0, "recparse", "cannot find qimg/path");
                continue;
            }
            for (ri = 0; ri < 2; ri++) {
                if (ri == 0)
                    recs = crecs, recn = crecn;
                else
                    recs = drecs, recn = drecn;
                recj = -1;
                for (reci = 0; reci < recn; reci++) {
                    recp = &recs[reci];
                    if (strcmp (recp->id, tp->text) != 0)
                        continue;

                    if (recp->type == EM_TYPE_I) {
                        recj = reci;
                        if (!(ip = dtmatch (imagedict, recp->u.i.file))) {
                            if (!(imem = vmalloc (
                                Vmheap, sizeof (EMimage_t)
                            ))) {
                                SUwarning (
                                    0, "recparse", "cannot allocate imem"
                                );
                                return -1;
                            }
                            memset (imem, 0, sizeof (EMimage_t));
                            if (!(imem->file = vmstrdup (
                                Vmheap, recp->u.i.file
                            ))) {
                                SUwarning (
                                    0, "recparse", "cannot copy image file"
                                );
                                return -1;
                            }
                            if (!(ip = dtinsert (imagedict, imem))) {
                                SUwarning (
                                    0, "recparse", "cannot insert image"
                                );
                                vmfree (Vmheap, imem->file);
                                vmfree (Vmheap, imem);
                                return -1;
                            }
                            if (RIloadimage (ip->file, &ip->op) == -1) {
                                SUwarning (0, "recparse", "cannot load image");
                                continue;
                            }
                        }
                        if (EMopm >= EMopn) {
                            if (!(EMops = vmresize (
                                Vmheap, EMops, (EMopn + 100) * sizeof (RIop_t),
                                VM_RSCOPY
                            ))) {
                                SUwarning (
                                    0, "recparse", "cannot grow EMops array"
                                );
                                return -1;
                            }
                            EMopn += 100;
                        }
                        opp = &EMops[EMopm++];
                        *opp = ip->op;
                        opp->u.img.ix = recp->u.i.x1;
                        opp->u.img.iy = recp->u.i.y1;
                        opp->u.img.iw = recp->u.i.x2 - recp->u.i.x1 + 1;
                        opp->u.img.ih = recp->u.i.y2 - recp->u.i.y1 + 1;
                        if (dir == EM_DIR_H) {
                            opp->u.img.rx = bbp->w + EM_MARGIN_W / 2;
                            opp->u.img.ry = (bbp->h - opp->u.img.ih) / 2;
                            bbp->w += opp->u.img.iw + EM_MARGIN_W;
                            if (bbp->h < opp->u.img.ih + EM_MARGIN_H) {
                                dh = opp->u.img.ih + EM_MARGIN_H - bbp->h;
                                bbp->h = opp->u.img.ih + EM_MARGIN_H;
                                for (opi = opk; opi < EMopm; opi++) {
                                    if (EMops[opi].type == RI_OP_I)
                                        EMops[opi].u.img.ry += dh / 2;
                                    else if (EMops[opi].type == RI_OP_T)
                                        EMops[opi].u.text.p.y += dh / 2;
                                }
                            }
                        } else {
                            opp->u.img.rx = (bbp->w - opp->u.img.iw) / 2;
                            opp->u.img.ry = bbp->h + EM_MARGIN_H / 2;
                            if (bbp->w < opp->u.img.iw + EM_MARGIN_W) {
                                dw = opp->u.img.iw + EM_MARGIN_W - bbp->w;
                                bbp->w = opp->u.img.iw + EM_MARGIN_W;
                                for (opi = opk; opi < EMopm; opi++) {
                                    if (EMops[opi].type == RI_OP_I)
                                        EMops[opi].u.img.rx += dw / 2;
                                    else if (EMops[opi].type == RI_OP_T)
                                        EMops[opi].u.text.p.x += dw / 2;
                                }
                            }
                            bbp->h += opp->u.img.ih + EM_MARGIN_H;
                        }
                    } else if (recp->type == EM_TYPE_S) {
                        recj = reci;
                        if (EMopm + 3 >= EMopn) {
                            if (!(EMops = vmresize (
                                Vmheap, EMops, (EMopn + 100) * sizeof (RIop_t),
                                VM_RSCOPY
                            ))) {
                                SUwarning (
                                    0, "recparse", "cannot grow EMops array"
                                );
                                return -1;
                            }
                            EMopn += 100;
                        }
                        if (recp->u.s.lncl && recp->u.s.lncl[0]) {
                            opp = &EMops[EMopm++];
                            opp->type = RI_OP_COPYc;
                            opp->u.color.n = 1;
                            opp->u.color.t = recp->u.s.lncl;
                        }
                        if (recp->u.s.fncl && recp->u.s.fncl[0]) {
                            opp = &EMops[EMopm++];
                            opp->type = RI_OP_COPYFC;
                            opp->u.color.n = 1;
                            opp->u.color.t = recp->u.s.fncl;
                        }
                        if (recp->u.s.flcl && recp->u.s.flcl[0]) {
                            opp = &EMops[EMopm++];
                            opp->type = RI_OP_COPYC;
                            opp->u.color.n = 1;
                            opp->u.color.t = recp->u.s.flcl;
                        }
                    }
                }
                if (recj != -1)
                    break;
            }
        } else if (strcmp (cp->tag, "label") == 0) {
            if (!(fnp = XMLfind (cp, "fontname", XML_TYPE_TEXT, -1, TRUE)))
                fn = "abc";
            else
                fn = fnp->text;
            if (!(fsp = XMLfind (cp, "fontsize", XML_TYPE_TEXT, -1, TRUE)))
                fs = "10";
            else
                fs = fsp->text;
            if (!(clp = XMLfind (cp, "color", XML_TYPE_TEXT, -1, TRUE)))
                cl = NULL;
            else
                cl = clp->text;
            if (!(tp = XMLfind (cp, "text", XML_TYPE_TEXT, -1, TRUE)))
                continue;
            if (RIgettextsize (tp->text, fn, fs, &top) == -1) {
                SUwarning (0, "recparse", "cannot get text size");
                return -1;
            }
            top.u.font.w += 8, top.u.font.h += 4;
            if (EMopm + 3 >= EMopn) {
                if (!(EMops = vmresize (
                    Vmheap, EMops, (EMopn + 100) * sizeof (RIop_t), VM_RSCOPY
                ))) {
                    SUwarning (0, "recparse", "cannot grow EMops array");
                    return -1;
                }
                EMopn += 100;
            }
            opp = &EMops[EMopm++];
            *opp = top;
            opp->type = RI_OP_F;
            if (cl) {
                opp = &EMops[EMopm++];
                memset (opp, 0, sizeof (RIop_t));
                opp->type = RI_OP_FC;
                if (!(opp->u.color.t = vmstrdup (Vmheap, cl))) {
                    SUwarning (0, "recparse", "cannot copy color");
                    return -1;
                }
            }
            opp = &EMops[EMopm++];
            memset (opp, 0, sizeof (RIop_t));
            opp->type = RI_OP_T;
            opp->u.text.jx = 0;
            opp->u.text.jy = -1;
            opp->u.text.w = top.u.font.w - 8;
            opp->u.text.h = top.u.font.h - 4;
            if (!(opp->u.text.t = vmstrdup (Vmheap, tp->text))) {
                SUwarning (0, "recparse", "cannot copy text");
                return -1;
            }
            if (dir == EM_DIR_H) {
                opp->u.text.p.x = bbp->w + top.u.font.w / 2 + 4;
                opp->u.text.p.y = (bbp->h - top.u.font.h) / 2 + 2;
                bbp->w += top.u.font.w + EM_MARGIN_W;
                if (bbp->h < top.u.font.h + EM_MARGIN_H) {
                    dh = top.u.font.h + EM_MARGIN_H - bbp->h;
                    bbp->h = top.u.font.h + EM_MARGIN_H;
                    for (opi = opk; opi < EMopm; opi++) {
                        if (EMops[opi].type == RI_OP_I)
                            EMops[opi].u.img.ry += dh / 2;
                        else if (EMops[opi].type == RI_OP_T)
                            EMops[opi].u.text.p.y += dh / 2;
                    }
                }
            } else {
                opp->u.text.p.x = bbp->w / 2 + 0;
                opp->u.text.p.y = bbp->h + EM_MARGIN_H / 2 + 2;
                if (bbp->w < top.u.font.w + EM_MARGIN_W) {
                    dw = top.u.font.w + EM_MARGIN_W - bbp->w;
                    bbp->w = top.u.font.w + EM_MARGIN_W;
                    for (opi = opk; opi < EMopm; opi++) {
                        if (EMops[opi].type == RI_OP_I)
                            EMops[opi].u.img.rx += dw / 2;
                        else if (EMops[opi].type == RI_OP_T)
                            EMops[opi].u.text.p.x += dw / 2;
                    }
                }
                bbp->h += top.u.font.h + EM_MARGIN_H;
            }
        }
    }

    return 0;
}
Exemplo n.º 13
0
static int load (char *id, char *file) {
    EMnode_t n, *np, *nmem;
    EMedge_t e, *ep, *emem;
    EMrec_t *rp, **rsp;
    int *rnp, *rmp;
    Sfio_t *fp;
    char *line, *s1, *s2, *s3, *s4, *s5, *s6, *s7;

    if (!(fp = sfopen (NULL, file, "r"))) {
        SUwarning (0, "load", "cannot open embed info file");
        return 0;
    }
    while ((line = sfgetr (fp, '\n', 1))) {
        np = NULL;
        ep = NULL;
        if (!(s1 = strchr (line, '|'))) {
            SUwarning (0, "load", "bad line(1): %s", line);
            continue;
        }
        *s1++ = 0;
        if (line[0] == 'N' || line[0] == 'n') {
            if (!(s2 = strchr (s1, '|')) || !(s3 = strchr (s2 + 1, '|'))) {
                SUwarning (0, "load", "bad line(2): %s", s1);
                continue;
            }
            *s2++ = 0, *s3++ = 0;
            memset (&n, 0, sizeof (EMnode_t));
            strcpy (n.level, s1);
            strcpy (n.id, s2);
            if (!(np = dtsearch (nodedict, &n))) {
                if (!(nmem = vmalloc (Vmheap, sizeof (EMnode_t)))) {
                    SUwarning (0, "load", "cannot allocate nmem");
                    return -1;
                }
                memset (nmem, 0, sizeof (EMnode_t));
                strcpy (nmem->level, s1);
                strcpy (nmem->id, s2);
                if (!(np = dtinsert (nodedict, nmem))) {
                    SUwarning (0, "load", "cannot insert node");
                    vmfree (Vmheap, nmem);
                    return -1;
                }
            }
            s1 = s3;
            rsp = &np->recs, rnp = &np->recn, rmp = &np->recm;
        } else if (line[0] == 'E' || line[0] == 'e') {
            if (!(s2 = strchr (s1, '|')) || !(s3 = strchr (s2 + 1, '|'))) {
                SUwarning (0, "load", "bad line(3): %s", s1);
                continue;
            }
            *s2++ = *s3++ = 0;
            if (!(s4 = strchr (s3, '|')) || !(s5 = strchr (s4 + 1, '|'))) {
                SUwarning (0, "load", "bad line(4): %s", s3);
                continue;
            }
            *s4++ = 0, *s5++ = 0;
            memset (&e, 0, sizeof (EMedge_t));
            strcpy (e.level1, s1);
            strcpy (e.id1, s2);
            strcpy (e.level2, s3);
            strcpy (e.id2, s4);
            if (!(ep = dtsearch (edgedict, &e))) {
                if (!(emem = vmalloc (Vmheap, sizeof (EMedge_t)))) {
                    SUwarning (0, "load", "cannot allocate emem");
                    return -1;
                }
                memset (emem, 0, sizeof (EMedge_t));
                strcpy (emem->level1, s1);
                strcpy (emem->id1, s2);
                strcpy (emem->level2, s3);
                strcpy (emem->id2, s4);
                if (!(ep = dtinsert (edgedict, emem))) {
                    SUwarning (0, "load", "cannot insert edge");
                    vmfree (Vmheap, emem);
                    return -1;
                }
            }
            s1 = s5;
            rsp = &ep->recs, rnp = &ep->recn, rmp = &ep->recm;
        }
        if (!(s2 = strchr (s1, '|'))) {
            SUwarning (0, "load", "bad line(5): %s", s1);
            continue;
        }
        *s2++ = 0;
        if (*rmp >= *rnp) {
            if (!(*rsp = vmresize (
                Vmheap, *rsp, (*rnp + 5) * sizeof (EMrec_t), VM_RSCOPY
            ))) {
                SUwarning (0, "load", "cannot grow recs array");
                return -1;
            }
            *rnp += 5;
        }
        rp = &(*rsp)[*rmp], (*rmp)++;
        if (!(rp->id = vmstrdup (Vmheap, id))) {
            SUwarning (0, "load", "cannot copy id");
            return -1;
        }
        if (s1[0] == 'I' || s1[0] == 'i') {
            if (!(s3 = strchr (s2, '|'))) {
                SUwarning (0, "load", "bad line(6): %s", s2);
                continue;
            }
            if (!(s4 = strchr (s3 + 1, '|')) || !(s5 = strchr (s4 + 1, '|'))) {
                SUwarning (0, "load", "bad line(7): %s", s3);
                continue;
            }
            if (!(s6 = strchr (s5 + 1, '|')) || !(s7 = strchr (s6 + 1, '|'))) {
                SUwarning (0, "load", "bad line(8): %s", s5);
                continue;
            }
            *s3++ = *s4++ = *s5++ = *s6++ = *s7++ = 0;
            rp->type = EM_TYPE_I;
            if (!(rp->u.i.file = vmstrdup (Vmheap, s2))) {
                SUwarning (0, "load", "cannot copy file");
                return -1;
            }
            rp->u.i.x1 = atoi (s3), rp->u.i.y1 = atoi (s4);
            rp->u.i.x2 = atoi (s5), rp->u.i.y2 = atoi (s6);
        } else if (s1[0] == 'S' || s1[0] == 's') {
            if (!(s3 = strchr (s2, '|'))) {
                SUwarning (0, "load", "bad line(9): %s", s2);
                continue;
            }
            if (!(s4 = strchr (s3 + 1, '|')) || !(s5 = strchr (s4 + 1, '|'))) {
                SUwarning (0, "load", "bad line(10): %s", s3);
                continue;
            }
            if (!(s6 = strchr (s5 + 1, '|')) || !(s7 = strchr (s6 + 1, '|'))) {
                SUwarning (0, "load", "bad line(11): %s", s5);
                continue;
            }
            *s3++ = *s4++ = *s5++ = *s6++ = *s7++ = 0;
            rp->type = EM_TYPE_S;
            if (
                !(rp->u.s.fn = vmstrdup (Vmheap, s2)) ||
                !(rp->u.s.fs = vmstrdup (Vmheap, s3)) ||
                !(rp->u.s.flcl = vmstrdup (Vmheap, s4)) ||
                !(rp->u.s.lncl = vmstrdup (Vmheap, s5)) ||
                !(rp->u.s.fncl = vmstrdup (Vmheap, s6))
            ) {
                SUwarning (0, "load", "cannot copy style");
                return -1;
            }
        }
        if (!(rp->im = vmstrdup (Vmheap, s7))) {
            SUwarning (0, "load", "cannot copy image map");
            return -1;
        }
    }
    sfclose (fp);
    return 0;
}
Exemplo n.º 14
0
/* allocate data from the shared memory region */
Void_t* mmmemory(Dt_t* dt, Void_t* data, size_t size, Dtdisc_t* disc)
{
	return vmresize(((Mmdisc_t*)disc)->vm, data, size, 0);
}
Exemplo n.º 15
0
static void*
memoryf(Dt_t* dt, void* addr, size_t size, Dtdisc_t* disc)
{
	return vmresize(((Dc_t*)disc)->vm, addr, size, VM_RSMOVE);
}