Beispiel #1
0
static int tconcat (lua_State *L) {
  luaL_Buffer b;
  size_t lsep;
  int i, last;
  const char *sep = luaL_optlstring(L, 2, "", &lsep);
  luaL_checktype(L, 1, LUA_TTABLE);
  i = luaL_optint(L, 3, 1);
  last = luaL_opt(L, luaL_checkint(L,4), 4, luaL_len(L, 1));
  luaL_buffinit(L, &b);
  for (; i < last; i++) {
    addfield(L, &b, i);
    luaL_addlstring(&b, sep, lsep);
  }
  if (i == last)  /* add last value (if interval was not empty) */
    addfield(L, &b, i);
  luaL_pushresult(&b);
  return 1;
}
static int tconcat (lua_State *L) {
  TabA ta;
  luaL_Buffer b;
  size_t lsep;
  lua_Integer i, last;
  const char *sep = luaL_optlstring(L, 2, "", &lsep);
  checktab(L, 1, &ta);
  i = luaL_optinteger(L, 3, 1);
  last = luaL_opt(L, luaL_checkinteger, 4, luaL_len(L, 1));
  luaL_buffinit(L, &b);
  for (; i < last; i++) {
    addfield(L, &b, &ta, i);
    luaL_addlstring(&b, sep, lsep);
  }
  if (i == last)  /* add last value (if interval was not empty) */
    addfield(L, &b, &ta, i);
  luaL_pushresult(&b);
  return 1;
}
Beispiel #3
0
Datei: stab.c Projekt: bhanug/cdb
/* entry_hook - called an function entry */
static void entry_hook(void *cl, Symbol cfunc) {
	static int nfuncs;
	Type ty;

	/*
	Simulate the declaration of an sframe structure,
	but without the tag.
	*/
	ty = newstruct(STRUCT, "");
#define addfield(name,t) \
	ty->size = roundup(ty->size, t->align);\
	if (ty->align < t->align) ty->align = t->align; \
	newfield(string(name), ty, t)->offset = ty->size; \
	ty->size += t->size
	addfield("up",    voidptype);
	addfield("down",  voidptype);
	addfield("func",  inttype);
	addfield("module",inttype);
	addfield("ip",    inttype);     
#undef addfield
	ty->size = roundup(ty->size, ty->align);
	ty->u.sym->defined = 1;
	ty->u.sym->generated = 1;
	tos = genident(AUTO, ty, LOCAL);
	addlocal(tos);
	tos->defined = 1;
	/*
	 Generated the assignments to the shadow
	 frame fields.
	*/
#define set(name,e) walk(asgntree(ASGN,field(lvalue(idtree(tos)),string(#name)),(e)),0,0)
	set(down,       idtree(nub_tos));
	set(func,       cnsttree(inttype, symboluid(cfunc)));
	set(module,     cnsttree(inttype, uname));
#undef set
	walk(asgn(nub_tos, lvalue(idtree(tos))), 0, 0);
	foreach(identifiers, PARAM, setoffset, tos);
}
Beispiel #4
0
static int match_field(char *map, jsmntok_t *field, int nz,
                       char **event, jsmntok_t *val)
{
    struct field *f;
    jsmntok_t newval = *val;

    for (f = fields; f->field; f++)
        if (json_streq(map, field, f->field) && nz) {
            cut_comma(map, &newval);
            addfield(map, event, ",", f->kernel, &newval);
            return 1;
        }
    return 0;
}
Beispiel #5
0
static int tconcat (killa_State *L) {
  killaL_Buffer b;
  size_t lsep;
  int i, last;
  const char *sep = killaL_optlstring(L, 2, "", &lsep);
  killaL_checktype(L, 1, KILLA_TTABLE);
#if (KILLA_BASE != 1) && (KILLA_BASE_WARNING == 1)
  if (killa_gettop(L) > 2) {
    killaL_warning(L, "using table.concat with possible base-1 index");
  }
#endif
  i = killaL_optint(L, 3, KILLA_BASE);
  last = killaL_opt(L, killaL_checkint, 4, killaL_len(L, 1) + KILLA_BASE - 1);
  killaL_buffinit(L, &b);
  for (; i < last; i++) {
    addfield(L, &b, i);
    killaL_addlstring(&b, sep, lsep);
  }
  if (i == last)  /* add last value (if interval was not empty) */
    addfield(L, &b, i);
  killaL_pushresult(&b);
  return 1;
}
Beispiel #6
0
static void
typedmemorydump(char* memory, size_t len, int fromxdr)
{
    unsigned int i,count,rem;
    char line[1024];
    char* pmem;
    char mem[8];

    assert(memory[len] == 0);

    /* build the header*/
    line[0] = '\0';
    addfield("offset",line,6);
    addfield("hex",line,8);
    addfield("uint",line,12);
    addfield("int",line,12);
    addfield("float",line,12);
    addfield("char[4]",line,16);
    addfield("double",line,12);
    strcat(line,"\n");
    fprintf(stdout,"%s",line);

    count = (len / sizeof(int));
    rem = (len % sizeof(int));

    for(pmem=memory,i=0;i<count;i++,pmem+=4) {
	memset(mem,0,8);
	if(i<(count-1))
	    memcpy(mem,pmem,8);
	else
	    memcpy(mem,pmem,4);
	dumpfield(i*sizeof(unsigned int),mem,fromxdr);
    }
    if(rem > 0) {
	memset(mem,0,8);
	memcpy(mem,pmem,4);
	dumpfield(i*sizeof(unsigned int),mem,fromxdr);
    }
    fflush(stdout);
}
Beispiel #7
0
static void
simplememorydump(char* memory, size_t len, int fromxdr)
{
    unsigned int i,count,rem;
    int* imemory;
    char tmp[32];
    char line[1024];

    assert(memory[len] == 0);

    /* build the header*/
    line[0] = '\0';
    addfield("offset",line,6);
    addfield("XDR (hex)",line,9);
    addfield("!XDR (hex)",line,10);
    fprintf(stdout,"%s\n",line);

    count = (len / sizeof(int));
    rem = (len % sizeof(int));
    if(rem != 0)
	fprintf(stderr,"ocdump: |mem|%%4 != 0\n");
    imemory = (int*)memory;

    for(i=0;i<count;i++) {
	unsigned int vx = (unsigned int)imemory[i];
	unsigned int v = vx;
	if(!xxdr_network_order) swapinline32(&v);
        line[0] = '\0';
        sprintf(tmp,"%6d",i);
        addfield(tmp,line,6);
        sprintf(tmp,"%08x",vx);
        addfield(tmp,line,9);
        sprintf(tmp,"%08x",v);
        addfield(tmp,line,10);
        fprintf(stdout,"%s\n",line);
    }
    fflush(stdout);
}
static GtkTreeModel *
create_and_fill_model (void)
{
	int cpt=0;

  treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);

  /* Append a top level rows */

  gtk_tree_store_append(treestore, &sequence_number, /*parent element*/NULL);
  gtk_tree_store_set(treestore, &sequence_number,COL_FIELD, "Sequence number",-1);


	#define NAVDATA_OPTION_DEMO(STRUCTURE,NAME,TAG) { \
				gtk_tree_store_append(treestore, &navdataBlocks[TAG], NULL);\
				gtk_tree_store_set   (treestore, &navdataBlocks[TAG], COL_FIELD, #TAG, -1);  }
	#define NAVDATA_OPTION(STRUCTURE,NAME,TAG)      { \
				gtk_tree_store_append(treestore, &navdataBlocks[TAG], NULL); \
				gtk_tree_store_set   (treestore, &navdataBlocks[TAG], COL_FIELD, #TAG, -1);  }
	#define NAVDATA_OPTION_CKS(STRUCTURE,NAME,TAG)

	#include <navdata_keys.h>


  cpt=0;
  addfield(NAVDATA_DEMO_TAG,"ctrl_state","Control State",&cpt);
  addfield(NAVDATA_DEMO_TAG,"phi","deg - Phi",&cpt);
  addfield(NAVDATA_DEMO_TAG,"psi","deg - Psi",&cpt);
  addfield(NAVDATA_DEMO_TAG,"theta","deg - Theta",&cpt);

  cpt=0;
  addfield(NAVDATA_GAMES_TAG,"Double tap counter","times",&cpt);
  addfield(NAVDATA_GAMES_TAG,"Finish line counter","times",&cpt);


  return GTK_TREE_MODEL(treestore);
}
Beispiel #9
0
//=============================================================================
telldata::box_type::box_type(point_type* pfld) : tell_type(telldata::tn_box)
{
   addfield("p1", telldata::tn_pnt, pfld);
   addfield("p2", telldata::tn_pnt, pfld);
};
Beispiel #10
0
//=============================================================================
telldata::point_type::point_type() : tell_type(telldata::tn_pnt)
{
   addfield("x", telldata::tn_real, NULL);
   addfield("y", telldata::tn_real, NULL);
};
Beispiel #11
0
/**
 * json_events - Read JSON event file from disk and call event callback.
 * @fn: File name to read or NULL for default.
 * @func: Callback to call for each event
 * @data: Abstract pointer to pass to func.
 *
 * The callback gets the data pointer, the event name, the event 
 * in perf format and a description passed.
 *
 * Call func with each event in the json file 
 * Return: -1 on failure, otherwise 0.
 */
int json_events(const char *fn,
	  int (*func)(void *data, char *name, char *event, char *desc, char *pmu),
	  void *data)
{
	int err = -EIO;
	size_t size;
	jsmntok_t *tokens, *tok;
	int i, j, len;
	char *map;
	char buf[128];
	const char *orig_fn = fn;

	if (!fn)
		fn = json_default_name("-core");
	tokens = parse_json(fn, &map, &size, &len);
	if (!tokens)
		return -EIO;
	EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array");
	tok = tokens + 1;
	for (i = 0; i < tokens->size; i++) {
		char *event = NULL, *desc = NULL, *name = NULL;
		char *pmu = NULL;
		char *filter = NULL;
		unsigned long long eventcode = 0;
		struct msrmap *msr = NULL;
		jsmntok_t *msrval = NULL;
		jsmntok_t *precise = NULL;
		jsmntok_t *obj = tok++;

		EXPECT(obj->type == JSMN_OBJECT, obj, "expected object");
		for (j = 0; j < obj->size; j += 2) {
			jsmntok_t *field, *val;
			int nz;

			field = tok + j;
			EXPECT(field->type == JSMN_STRING, tok + j,
			       "Expected field name");
			val = tok + j + 1;
			EXPECT(val->type == JSMN_STRING, tok + j + 1,
			       "Expected string value");

			nz = !json_streq(map, val, "0");
			if (match_field(map, field, nz, &event, val)) {
				/* ok */
			} else if (json_streq(map, field, "EventCode")) {
				char *code = NULL;
				addfield(map, &code, "", "", val);
				eventcode |= strtoul(code, NULL, 0);
				free(code);
			} else if (json_streq(map, field, "ExtSel")) {
				char *code = NULL;
				addfield(map, &code, "", "", val);
				eventcode |= strtoul(code, NULL, 0) << 21;
				free(code);
			} else if (json_streq(map, field, "EventName")) {
				addfield(map, &name, "", "", val);
			} else if (json_streq(map, field, "BriefDescription")) {
				addfield(map, &desc, "", "", val);
				fixdesc(desc);
			} else if (json_streq(map, field, "PEBS") && nz && desc &&
				   !strstr(desc, "(Precise Event)")) {
				precise = val;
			} else if (json_streq(map, field, "MSRIndex") && nz) {
				msr = lookup_msr(map, val);
			} else if (json_streq(map, field, "MSRValue")) {
				msrval = val;
			} else if (json_streq(map, field, "Errata") &&
				   !json_streq(map, val, "null")) {
				addfield(map, &desc, ". ",
					" Spec update: ", val);
			} else if (json_streq(map, field, "Data_LA") && nz) {
				addfield(map, &desc, ". ",
					" Supports address when precise",
					NULL);
			} else if (json_streq(map, field, "Unit")) {
				const char *ppmu;
				char *s;

				ppmu = field_to_perf(unit_to_pmu, map, val);
				if (ppmu) {
					pmu = strdup(ppmu);
				} else {
					addfield(map, &pmu, "", "", val);
					for (s = pmu; *s; s++)
						*s = tolower(*s);
				}
				addfield(map, &desc, ". ", "Unit: ", NULL);
				addfield(map, &desc, "", pmu, NULL);
			} else if (json_streq(map, field, "Filter")) {
				addfield(map, &filter, "", "", val);
			}
			/* ignore unknown fields */
		}
		if (precise) {
			if (json_streq(map, precise, "2"))
				addfield(map, &desc, " ", "(Must be precise)",
						NULL);
			else
				addfield(map, &desc, " ",
						"(Precise event)", NULL);
		}
		snprintf(buf, sizeof buf, "event=%#llx", eventcode);
		addfield(map, &event, ",", buf, NULL);
		if (filter)
			addfield(map, &event, ",", filter, NULL);
		if (msr != NULL)
			addfield(map, &event, ",", msr->pname, msrval);
		if (!pmu)
			pmu = strdup("cpu");
		err = -EIO;
		if (name && event) {
			fixname(name);
			err = func(data, name, event, desc, pmu);
		}
		free(event);
		free(desc);
		free(name);
		free(pmu);
		free(filter);
		if (err)
			break;
		tok += j;
	}
	EXPECT(tok - tokens == len, tok, "unexpected objects at end");
	err = 0;
out_free:
	free_json(map, size, tokens);
	if (!orig_fn && !err) {
		fn = json_default_name("-uncore");
		err = json_events(fn, func, data);
		/* Ignore open error */
		if (err == -EIO)
			return 0;
	}
	if (!orig_fn)
		free((char *)fn);
	return err;
}
Beispiel #12
0
static void
dumpfield(int index, char* n8, int isxdr)
{
    char line[1024];
    char tmp[32];

    union {
	unsigned int uv;
	int sv;
	char cv[4];
	float fv;
    } form;
    union {
	char cv[8];
        unsigned long long ll;
        double d;
    } dform;

    line[0] = '\0';

    /* offset */
    sprintf(tmp,"%6d",index);
    addfield(tmp,line,5);

    memcpy(form.cv,n8,4);

    /* straight hex*/
    sprintf(tmp,"%08x",form.uv);
    addfield(tmp,line,8);

    if(isxdr) {swapinline32(&form.uv);}

    /* unsigned integer */
    sprintf(tmp,"%12u",form.uv);
    addfield(tmp,line,12);

    /* signed integer */
    sprintf(tmp,"%12d",form.sv);
    addfield(tmp,line,12);

    /* float */
    sprintf(tmp,"%#g",form.fv);
    addfield(tmp,line,12);

    /* char[4] */
    {
        /* use raw form (i.e. n8)*/
        int i;
	tmp[0] = '\0';
        for(i=0;i<4;i++) {
	    char stmp[64];
	    unsigned int c = (n8[i] & 0xff);
	    if(c < ' ' || c > 126)
                snprintf(stmp,sizeof(stmp),"\\%02x",c);
	    else
                snprintf(stmp,sizeof(stmp),"%c",c);
	    if(!occoncat(tmp,sizeof(tmp),1,stmp))
		return;
        }
    }

    addfield(tmp,line,16);

    /* double */
    memcpy(dform.cv,n8,2*XDRUNIT);
    if(isxdr) xxdrntohdouble(dform.cv,&dform.d);
    sprintf(tmp,"%#g",dform.d);
    addfield(tmp,line,12);

    fprintf(stdout,"%s\n",line);
}
Beispiel #13
0
void AddProjectForm::genfields(int& line, Item* project) //создаст массив полей
{
    FIELD* f;
    delfields();
    if (project != NULL)
    {
	//сообщение об ошибке
	errmsgfield = getfieldcount();
	f = addfield(new_field(1, getwidth()-2, line++, 0, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, "Errr"))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_RED) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	if (E_OK != field_opts_off(f, O_VISIBLE)) //по умолчанию невидима
	    ERROREX();
	//url
	Item* url = project->findItem("url");
	std::string s = "url          : ";
	if (url !=NULL)
	    projurl = url->getsvalue();
	s = s + projurl;
	f = addfield(new_field(1, getwidth()-4, line++, 1, 0, 0));
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	//area
	Item* general_area = project->findItem("general_area");
	s = "General area : ";
	if (general_area !=NULL)
	    s = s + general_area->getsvalue();
	f = addfield(new_field(1, getwidth()-4, line++, 1, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	//specific area
	Item* specific_area = project->findItem("specific_area");
	s = "Specific area: ";
	if (specific_area !=NULL)
	    s = s + specific_area->getsvalue();
	f = addfield(new_field(1, getwidth()-4, line++, 1, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	//home
	s = "Home         : ";
	Item* home = project->findItem("home");
	if (home !=NULL)
	    s = s + home->getsvalue();
	f = addfield(new_field(1, getwidth()-4, line++, 1, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	//description
	s = "Description  : ";
	line++;
	Item* description = project->findItem("description");
	if (description !=NULL)
	    s = s + description->getsvalue();
	int h = s.size()/(getwidth() - 4) + 1;
	if (h > 4)
	    h = 4;
	f = addfield(new_field(h, getwidth()-4, line, 1, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	line += h+1;
	//platforms
	Item* platforms = project->findItem("platforms");
	s = "Platforms    : ";
	if (platforms !=NULL)
	{
	    std::vector<Item*> namelist = platforms->getItems("name"); //список названий платформ
	    std::vector<Item*>::iterator it;
	    for (it = namelist.begin(); it!=namelist.end(); it++)
	    {
		Item* name = (*it)->findItem("name");
		if (it != namelist.begin())
		    s = s + ',';
		s = s + name->getsvalue();
	    }
	}
	h = s.size()/(getwidth() - 4) + 1;
	if (h > 5)
	    h = 5;
	f = addfield(new_field(h, getwidth()-4, ++line, 1, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, s.c_str()))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	line += h + 1;
    }
    //email
    line++;
    f = addfield(new_field(1, 10, line, 1 , 0, 0));
    if (!f)
	ERROREX();
    if (E_OK != set_field_buffer(f, 0, "email"))
	ERROREX();
    if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	ERROREX();
    if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	ERROREX();
    emailfield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    if (!f)
	ERROREX();
    if (E_OK != field_opts_off(f, O_AUTOSKIP))
	ERROREX();
    if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD))
	ERROREX();
    //password
    line++;
    f = addfield(new_field(1, 10, line, 1 , 0, 0));
    if (!f)
	ERROREX();
    if (E_OK != set_field_buffer(f, 0, "password"))
	ERROREX();
    if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	ERROREX();
    if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	ERROREX();
    passwfield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    if (!f)
	ERROREX();
    if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD))
	ERROREX();
    if (E_OK != field_opts_off(f, O_AUTOSKIP))
	ERROREX();
    if (!userexist)
    {
	//user name
	line++;
	f = addfield(new_field(1, 10, line, 1 , 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, "username"))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	usernamefield = getfieldcount();
	f = addfield(new_field(1, 40, line++, 15, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != field_opts_off(f, O_AUTOSKIP))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD))
	    ERROREX();
	//team name
	line++;
	f = addfield(new_field(1, 10, line, 1 , 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_buffer(f, 0, "teamname"))
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	    ERROREX();
	teamfield = getfieldcount();
	f = addfield(new_field(1, 40, line++, 15, 0, 0));
	if (!f)
	    ERROREX();
	if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD))
	    ERROREX();
	if (E_OK != field_opts_off(f, O_AUTOSKIP))
	    ERROREX();
    }
    //подсказки
    line++;
    f = addfield(new_field(1, getwidth()-25, line++, 20 , 0, 0));
    if (!f)
	ERROREX();
    if (E_OK != set_field_buffer(f, 0, "Enter-Ok    Esc-Cancel"))
	ERROREX();
    if (E_OK != set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD))
	ERROREX();
    if (E_OK != field_opts_off(f, O_ACTIVE)) //статический текст
	ERROREX();
    //финализация списка полей
    addfield(NULL);
}
Beispiel #14
0
/**
 * json_events - Read JSON event file from disk and call event callback.
 * @fn: File name to read or NULL for default.
 * @func: Callback to call for each event
 * @data: Abstract pointer to pass to func.
 *
 * The callback gets the data pointer, the event name, the event
 * in perf format and a description passed.
 *
 * Call func with each event in the json file
 * Return: -1 on failure, otherwise 0.
 */
int json_events(const char *fn,
                int (*func)(void *data, char *name, char *event, char *desc),
                void *data)
{
    int err = -EIO;
    size_t size;
    jsmntok_t *tokens, *tok;
    int i, j, len;
    char *map;

    if (!fn)
        fn = json_default_name();
    tokens = parse_json(fn, &map, &size, &len);
    if (!tokens)
        return -EIO;
    EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array");
    tok = tokens + 1;
    for (i = 0; i < tokens->size; i++) {
        char *event = NULL, *desc = NULL, *name = NULL;
        struct msrmap *msr = NULL;
        jsmntok_t *msrval = NULL;
        jsmntok_t *precise = NULL;
        jsmntok_t *obj = tok++;

        EXPECT(obj->type == JSMN_OBJECT, obj, "expected object");
        for (j = 0; j < obj->size; j += 2) {
            jsmntok_t *field, *val;
            int nz;

            field = tok + j;
            EXPECT(field->type == JSMN_STRING, tok + j,
                   "Expected field name");
            val = tok + j + 1;
            EXPECT(val->type == JSMN_STRING, tok + j + 1,
                   "Expected string value");

            nz = !json_streq(map, val, "0");
            if (match_field(map, field, nz, &event, val)) {
                /* ok */
            } else if (json_streq(map, field, "EventName")) {
                addfield(map, &name, "", "", val);
            } else if (json_streq(map, field, "BriefDescription")) {
                addfield(map, &desc, "", "", val);
                fixdesc(desc);
            } else if (json_streq(map, field, "PEBS") && nz && desc &&
                       !strstr(desc, "(Precise Event)")) {
                precise = val;
            } else if (json_streq(map, field, "MSRIndex") && nz) {
                msr = lookup_msr(map, val);
            } else if (json_streq(map, field, "MSRValue")) {
                msrval = val;
            } else if (json_streq(map, field, "Errata") &&
                       !json_streq(map, val, "null")) {
                addfield(map, &desc, ". ",
                         " Spec update: ", val);
            } else if (json_streq(map, field, "Data_LA") && nz) {
                addfield(map, &desc, ". ",
                         " Supports address when precise",
                         NULL);
            }
            /* ignore unknown fields */
        }
        if (precise) {
            if (json_streq(map, precise, "2"))
                addfield(map, &desc, " ", "(Must be precise)",
                         NULL);
            else
                addfield(map, &desc, " ",
                         "(Precise event)", NULL);
        }
        if (msr != NULL)
            addfield(map, &event, ",", msr->pname, msrval);
        err = -EIO;
        if (name && event) {
            fixname(name);
            err = func(data, name, event, desc);
        }
        free(event);
        free(desc);
        free(name);
        if (err)
            break;
        tok += j;
    }
    EXPECT(tok - tokens == len, tok, "unexpected objects at end");
    err = 0;
out_free:
    free_json(map, size, tokens);
    return err;
}
Beispiel #15
0
void AddAccMgrForm::genfields(int& line, Item* mgr) //создаст массив полей
{
    FIELD* f;
    delfields();
    //сообщение об ошибке
    errmsgfield = getfieldcount();
    f = addfield(new_field(1, getwidth()-2, line++, 0, 0, 0));
    set_field_buffer(f, 0, "Errr");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_RED) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    field_opts_off(f, O_VISIBLE); //по умолчанию невидима
    //получить url и имя менеджера (или из конфига или от boinc клиента
    if (mgr != NULL)
    {
        Item* url = mgr->findItem("url");
        if (url !=NULL)
	    mgrurl = url->getsvalue();
    }
    else
    {
        //взять url из конфига (если есть)
	Item* boinctui_cfg = gCfg->getcfgptr();
	if (boinctui_cfg != NULL)
	{
	    std::vector<Item*> mgrlist = boinctui_cfg->getItems("accmgr");
	    std::vector<Item*>::iterator it;
	    for (it = mgrlist.begin(); it != mgrlist.end(); it++)
	    {
		Item* name = (*it)->findItem("name");
		if (name != NULL)
		    if (name->getsvalue() == mgrname)
		    {
			Item* url = (*it)->findItem("url");
			if (url != NULL)
			{
			    mgrurl = url->getsvalue();
			    break;
			}
		    }
	    }
	}
    }
    //имя менеджера
    f = addfield(new_field(1, getwidth()-4, line, 2, 0, 0));
    set_field_buffer(f, 0, "Description  ");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    namefield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    if (mgr != NULL)
    {
	field_opts_off(f, O_STATIC);
	field_opts_off(f, O_ACTIVE); //статический текст
    }
    else
	set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD);
    field_opts_off(f, O_AUTOSKIP);
    set_max_field(f,128); //max width 128
    char buf[129];
    strncpy(buf, gettitle(), 128);
    buf[128] = '\0';
    char* p;
    p = ltrim(buf);
    rtrim(buf);
    set_field_buffer(f, 0, p);
    //url
    line++;
    f = addfield(new_field(1, getwidth()-4, line, 2, 0, 0));
    set_field_buffer(f, 0, "URL          ");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    urlfield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    if (mgr != NULL)
    {
	field_opts_off(f, O_STATIC);
	field_opts_off(f, O_ACTIVE); //статический текст
    }
    else
	set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD);
    field_opts_off(f, O_AUTOSKIP);
    set_max_field(f,128); //max width 128
    set_field_buffer(f, 0, mgrurl.c_str());
    //help
    line++;
    f = addfield(new_field(3, getwidth()-4, line++, 2, 0, 0));
    set_field_buffer(f, 0,  "If you have not yet registered with this account manager" \
    			"     please do so before proceeding.");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    line = line + 2;
    //user name
    line++;
    f = addfield(new_field(1, 10, line, 2 , 0, 0));
    set_field_buffer(f, 0, "username");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    usernamefield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    field_opts_off(f, O_AUTOSKIP);
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD);
    //password
    line++;
    f = addfield(new_field(1, 10, line, 2 , 0, 0));
    set_field_buffer(f, 0, "password");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    passwfield = getfieldcount();
    f = addfield(new_field(1, 40, line++, 15, 0, 0));
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_CYAN) | A_BOLD);
    field_opts_off(f, O_AUTOSKIP);
    //подсказки
    line++;
    f = addfield(new_field(1, getwidth()-25, line++, 20 , 0, 0));
    set_field_buffer(f, 0, "Enter-Ok    Esc-Cancel");
    set_field_back(f, getcolorpair(COLOR_WHITE,COLOR_BLACK) | A_BOLD);
    field_opts_off(f, O_ACTIVE); //статический текст
    //финализация списка полей
    addfield(NULL);
}