コード例 #1
0
ファイル: tomjson.c プロジェクト: tomsmeding/tomjson
static Jsonnode* parsearray(const char *str,const char **endp){
#define FAILRETURN \
		do { \
			for(int i=0;i<length;i++)json_free(elems[i]); \
			free(elems); \
			return NULL; \
		} while(0)

	SKIPSPACESRETNULL(str);
	if(str[0]!='[')return NULL;
	const char *cursor=str+1;
	SKIPSPACES(cursor);
	if(*cursor==']'){
		Jsonnode *node=malloc(sizeof(Jsonnode));
		assert(node);
		node->type=JSON_ARRAY;
		node->arrval.capacity=1;
		node->arrval.length=0;
		node->arrval.elems=malloc(1);
		assert(node->arrval.elems);
		*endp=cursor+1;
		return node;
	}

	int sz=16,length=0;
	Jsonnode **elems=malloc(sz*sizeof(Jsonnode*));
	assert(elems);
	//fprintf(stderr,"ARR: start\n");
	while(*cursor){
		const char *elemend;
		Jsonnode *elem=json_parse_endp(cursor,&elemend);
		//fprintf(stderr,"ARR: elem %p, parsing from %s\n",elem,cursor);
		if(!elem)FAILRETURN;
		if(length==sz){
			sz*=2;
			elems=realloc(elems,sz*sizeof(Jsonnode*));
			assert(elems);
		}
		elems[length++]=elem;
		cursor=elemend;
		SKIPSPACES(cursor);
		if(*cursor==']')break;
		if(*cursor!=',')FAILRETURN;
		cursor++;
	}
	if(*cursor!=']')return NULL;

	Jsonnode *node=malloc(sizeof(Jsonnode));
	assert(node);
	node->type=JSON_ARRAY;
	node->arrval.length=length;
	node->arrval.capacity=sz;
	node->arrval.elems=elems;
	*endp=cursor+1;
	return node;

#undef FAILRETURN
}
コード例 #2
0
ファイル: cmd.c プロジェクト: radare/ired
static int cmd_search(const char *arg) {
	ut8 *buf, *barg;
	size_t len;
	int i, hit = 0;
	SKIPSPACES(arg);
	if(*arg=='"') {
		arg++;
		barg = (ut8*)strdup(arg);
		len = strlen((const char *)barg)-1;
		// TODO: ensure last char is '"'
		barg[len]='\0';
	} else {
		barg = (ut8*)strdup(arg);
		len = hexstr2raw(barg);
	}
	if((buf = getcurblk("", &bsize)))
	do {
		for(i=0;i<bsize;i++) {
			if(barg[hit++]!=buf[i]) hit = 0;
			else if(hit == len)
				printf("0x%"LLF"x\n", curseek+i-len+1);
		}
		curseek += bsize;
	} while(io_read(buf, bsize)>0);
	free(buf);
	free(barg);
	return 1;
}
コード例 #3
0
ファイル: cmd.c プロジェクト: radare/ired
static int cmd_write(const char *arg) {
	ut8 *barg;
	int len;
	SKIPSPACES(arg);
	if(*arg=='"') {
		barg = (ut8*)strdup (arg+1);
		len = strlen(++arg)-1;
		// TODO: ensure last char is "
		barg[len] = '\0';
	} else {
		barg = (ut8*)strdup (arg);
		len = hexstr2raw(barg);
	}
	if (len<2)  {
		printf ("Invalid hexpair\n");
		return 2;
	}
	io_seek(curseek, SEEK_SET);
	if(len<1 || io_write(barg, len)<len) {
		perror("io_write");
		return -1;
	}
	//free ((void*)arg);
	return 1;
}
コード例 #4
0
ファイル: ired.c プロジェクト: radare/ired
static int red_prompt() {
    char *at, *at2, line[BUFSZ];
    if(verbose) {
        printf("[0x%08"LLF"x]> ", curseek);
        fflush(stdout);
    }
    if(fgets(line, sizeof(line), stdin) == NULL)
        return 0;
    line[strlen(line)-1] = '\0';
    if(*line != '!') {
        at = strchr(line, '@');
        oldseek = curseek;
        obsize = bsize;
        if(at) {
            *at = 0;
            at2 = strchr(++at, ':');
            if(at2) {
                *at2 = 0;
                at2++;
                if(*at2) bsize = (int)str2ut64(at2);
            }
            if(*at) curseek = str2ut64(at);
        }
    }
    at = line;
    SKIPSPACES(at);
    return red_cmd(at);
}
コード例 #5
0
ファイル: asm.c プロジェクト: 13572293130/radare2
int rarvm_assemble (Bitbuf *b, const char *c) {
	char* arg0 = NULL;
	char* arg1 = NULL;
	int opnum;
	char *p, *str = strdup (skipspaces (c));
	p = strchr (str, ' ');
	if (p) {
		*p = 0;
		arg0 = p+1;
		SKIPSPACES (arg0);
		arg1 = strchr (arg0, ',');
		if (arg1)
			*arg1++ = 0;
	}
	opnum = opcode_num (str);
	if (opnum>=0 && opnum<=7) {
		bitadd (b, 0, 1);
		bitadd (b, opnum, 3);
	} else
	if (opnum>=8 && opnum<=39) {
		bitadd (b, 1, 1);
		bitadd (b, opnum+24, 5);
	} else {
		free (str);
		fprintf (stderr, "Oops. unsupported opcode\n");
		return 0;
	}

	if (1 && opcodes[opnum].flags & T_BYTE) {
		bitadd (b, 0, 1);
	}

	if (opcodes[opnum].flags & 1) {
		SKIPSPACES (arg0);
		if (!assemble_arg (b, arg0)) {
                        free (str);
			return 0;
                }
		if (opcodes[opnum].flags & 2) {
			SKIPSPACES (arg1);
			if (!assemble_arg (b, arg1))
				return 0;
		}
	}
	free (str);
	return b->bits;
}
コード例 #6
0
ファイル: ired.c プロジェクト: radare/ired
static int red_cmd(char *cmd) {
    char *arg = cmd+1;
    SKIPSPACES(arg);
    switch(*cmd) {
    case 'q':
        return 0;
    case ';':
    case '#':
        break; // comment
    case '>':
        return cmd_dump(arg);
        break;
    case '<':
        return cmd_load(arg);
        break;
    case '.':
        return red_interpret(arg);
        break;
    case 's':
        return cmd_seek(arg);
        break;
    case 'b':
        return cmd_bsize(arg);
        break;
    case '/':
        return cmd_search(arg);
        break;
    case 'd':
        return cmd_system ("echo X | ired -n $BLOCK | rasm2 -o $OFFSET -D - |head -n $(($LINES-1))");
    case 'p':
        return cmd_print(arg);
        break;
    case 'r':
        return cmd_resize(arg);
        break;
    case 'x':
        return cmd_hexdump(arg);
        break;
    case 'X':
        return cmd_bytedump(arg);
        break;
    case 'w':
        return cmd_write(arg);
        break;
    case '!':
        return cmd_system(arg);
        break;
    case 'V':
        return cmd_system("vired $FILE");
        break;
    case '?':
        return cmd_help(arg);
        break;
    default:
        fprintf(stderr, "? %s\n", cmd);
    }
    return 1;
}
コード例 #7
0
ファイル: tomjson.c プロジェクト: tomsmeding/tomjson
static Jsonnode* json_parse_endp(const char *str,const char **endp){
	Jsonnode *node;
	node=parsenumber(str,endp); if(node){SKIPSPACES(*endp); return node;}
	node=parsestring(str,endp); if(node){SKIPSPACES(*endp); return node;}
	node=parsebool  (str,endp); if(node){SKIPSPACES(*endp); return node;}
	node=parsenull  (str,endp); if(node){SKIPSPACES(*endp); return node;}
	node=parsearray (str,endp); if(node){SKIPSPACES(*endp); return node;}
	node=parseobject(str,endp); if(node){SKIPSPACES(*endp); return node;}
	return NULL;
}
コード例 #8
0
ファイル: color.c プロジェクト: bngabonziza/miktex
void stringrgb(const char* color,int *r,int *g,int *b)
{
  char* end;
  static int unloaded=0;

  DEBUG_PRINT(DEBUG_COLOR,("\n  COLOR SPEC:\t'%s' (",color));
  SKIPSPACES(color);
  if (strcmp(color,"Black")==0) {
    *r = *g = *b = 0;
  } else if (strcmp(color,"White")==0) {
    *r = *g = *b = 255;
  } else if (strncmp(color,"gray ",5)==0) {
    color+=5;
    *r = *g = *b = NEXTFLOAT255(color);
  } else if (strncmp(color,"rgb ",4)==0) {
    color+=4;
    *r = NEXTFLOAT255(color);
    *g = NEXTFLOAT255(color);
    *b = NEXTFLOAT255(color);
   } else if (strncmp(color,"Gray ",5)==0) {
    color+=5;
    *r = *g = *b = NEXTINT(color);
  } else if (strncmp(color,"RGB ",4)==0) {
    color+=4;
    *r = NEXTINT(color);
    *g = NEXTINT(color);
    *b = NEXTINT(color);
  } else if (strncmp(color,"HTML ",5)==0) {
    color+=5;
    *b = NEXTHEX(color);
    *r = *b/65536;
    *g = *b/256;
    *b -= *g*256;
    *g -= *r*256;
  } else if (strncmp(color,"cmy ",4)==0
	     || strncmp(color,"cmyk ",5)==0) {
    int c,m,y,k;
    color+=3;
    k=(*color=='k');
    if (k)
      color++;
    c = NEXTFLOAT255(color);
    m = NEXTFLOAT255(color);
    y = NEXTFLOAT255(color);
    if (k)
      k = NEXTFLOAT255(color);
    *r = c+k<255 ? 255-(c+k) : 0;
    *g = m+k<255 ? 255-(m+k) : 0;
    *b = y+k<255 ? 255-(y+k) : 0;
  } else if (strncmp(color,"hsb ",4)==0
	     || strncmp(color,"HSB ",4)==0) {
    /* The hsb and HSB models really need more presicion.
       Use double and convert back*/
    double hu,sa,br,f,R,G,B;
    int i;
    if (*color=='h') {
      color+=4;
      hu = NEXTFLOAT(color);
      sa = NEXTFLOAT(color);
      br = NEXTFLOAT(color);
    } else {
      color+=4;
      hu = (float)NEXTINT(color); hu /= 255;
      sa = (float)NEXTINT(color); sa /= 255;
      br = (float)NEXTINT(color); br /= 255;
    }
    i=6*hu;
    f=6*hu-i;
    switch(i) {
    case 0:
      R = br*(1-sa*0);     G = br*(1-sa*(1-f)); B = br*(1-sa*1); break;
    case 1:
      R = br*(1-sa*f);     G = br*(1-sa*0);     B = br*(1-sa*1); break;
    case 2:
      R = br*(1-sa*1);     G = br*(1-sa*0);     B = br*(1-sa*(1-f)); break;
    case 3:
      R = br*(1-sa*1);     G = br*(1-sa*f);     B = br*(1-sa*0); break;
    case 4:
      R = br*(1-sa*(1-f)); G = br*(1-sa*1);     B = br*(1-sa*0); break;
    case 5:
      R = br*(1-sa*0);     G = br*(1-sa*1);     B = br*(1-sa*f); break;
    default:
      R = br*(1-sa*0);     G = br*(1-sa*1);     B = br*(1-sa*1);
    }
    *r=FTO255(R);
    *g=FTO255(G);
    *b=FTO255(B);
  } else {
    /* Model not found, probably a color name */
    struct colorname *tmp;

    if (xcp==NULL && xcpname!=NULL)
      xcp=LoadXColorPrologue();
    tmp=xcp;
    while(tmp!=NULL && strcmp(color,tmp->name)!=0)
      tmp=tmp->next;
    if (tmp==NULL) {
      while (colornamep==NULL && colordef[unloaded]!=NULL)
        colornamep=LoadColornameFile(colordef[unloaded++]);
      tmp=colornamep;
      while(tmp!=NULL && strcmp(color,tmp->name)!=0) {
        while (tmp->next==NULL && colordef[unloaded]!=NULL)
          tmp->next=LoadColornameFile(colordef[unloaded++]);
        tmp=tmp->next;
      }
    }
    if (strcmp(color,tmp->name)==0) {
      /* Found: one-level recursion */
      DEBUG_PRINT(DEBUG_COLOR,("\n    ---RECURSION--- "))
      stringrgb(tmp->color,r,g,b);
    } else {
      /* Not found, warn */
      page_flags |= PAGE_GAVE_WARN;
      Warning("unimplemented color specification '%s'",color);
    }
  }
  DEBUG_PRINT(DEBUG_COLOR,("%d %d %d) ",*r,*g,*b))
}
コード例 #9
0
ファイル: tomjson.c プロジェクト: tomsmeding/tomjson
static Jsonnode* parseobject(const char *str,const char **endp){
	SKIPSPACESRETNULL(str);
	if(*str!='{')return NULL;
	str++;
	SKIPSPACESRETNULL(str);
	if(*str=='}'){
		Jsonnode *node=malloc(sizeof(Jsonnode));
		assert(node);
		node->type=JSON_OBJECT;
		node->objval.capacity=1;
		node->objval.numkeys=0;
		node->objval.keys=malloc(1);
		assert(node->objval.keys);
		node->objval.values=malloc(1);
		assert(node->objval.values);
		*endp=str+1;
		return node;
	}
	int sz=16,numkeys=0;
	char **keys=malloc(sz*sizeof(char*));
	assert(keys);
	Jsonnode **values=malloc(sz*sizeof(Jsonnode*));
	assert(values);

#define FAILRETURN \
		do { \
			for(int i=0;i<numkeys;i++)free(keys[i]); \
			for(int i=0;i<numkeys;i++)json_free(values[i]); \
			free(keys); free(values); \
			return NULL; \
		} while(0)

	const char *cursor=str;
	while(*cursor){
		const char *keyend,*valend;
		Jsonnode *keynode=parsestring(cursor,&keyend);
		if(!keynode)FAILRETURN;
		SKIPSPACES(keyend);
		if(*keyend!=':'){
			json_free(keynode);
			FAILRETURN;
		}
		cursor=keyend+1;
		SKIPSPACES(cursor);
		Jsonnode *valnode=json_parse_endp(cursor,&valend);
		if(!valnode){
			json_free(keynode);
			FAILRETURN;
		}
		if(numkeys==sz){
			sz*=2;
			keys=realloc(keys,sz*sizeof(char*));
			assert(keys);
			values=realloc(values,sz*sizeof(Jsonnode*));
			assert(values);
		}
		keys[numkeys]=keynode->strval;
		free(keynode);
		values[numkeys]=valnode;
		numkeys++;
		cursor=valend;
		SKIPSPACES(cursor);
		if(*cursor=='}')break;
		if(*cursor!=',')FAILRETURN;
		cursor++;
	}
	if(*cursor!='}')return NULL;

	Jsonnode *node=malloc(sizeof(Jsonnode));
	assert(node);
	node->type=JSON_OBJECT;
	node->objval.numkeys=numkeys;
	node->objval.capacity=sz;
	node->objval.keys=keys;
	node->objval.values=values;
	*endp=cursor+1;
	return node;

#undef FAILRETURN
}