www.pudn.com > ASM86_64.rar > string.c



/*
 *	a64's string function 
 */

int str_cmp(char *d, char *s) {
	if (!d || !s)
		return 0;
	while (*d && *s && *d == *s) {
		d++; s++;
	}
		
	return ((*d == *s) && (*(d-1) == *(s-1)));
}

int str_len(char *s) {
	int ret = 0;
	if (!s) return 0;
	while (*s++) ret++;
	return ret;
}


/******************************************************
*******************************************************/
int trim_space(char *d, char *s)
{
	if (!d || !s || !s[0]) 
		return 0;

	int i = 0, j = 0;
	char *p = s;
	char *q = s;

	while (*s) {
		if (*s != ' ') 
			*d++ = *s++;

		else if (s == p) {	/* head */
			while (*s && (*s == ' ')) s++;
		} else {
			q = s - 1;
			while (*s && (*s == ' ')) s++;
			if ((is_c(*q) || is_n(*q)) && (is_c(*s) || is_n(*s)))
				*d++ = ' ';
		}
	}
	*d = 0;

	return 1;
}


int get_c(char *s, char c) 
{
	int ret = 0;
	
	while (*s) {
		ret += (*s == c);
		s++;
	}

	return ret;
}



int is_c(char c) {
	return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
}

int is_n(char c) {
	return (c >= '0' && c <= '9');
}

int is_hc(char c) {
	return ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
}


int is_dec(char *s) {
	if (!s) return 0;
	while (*s) {
		if (!(*s >= '0' && *s <= '9'))
			return 0;
		s++;
	}
	return 1;
}


int is_hex(char *s) {
	if (!s) return 0;

	if ((*s == '0') && (*(s+1) == 'x' || *(s+1) == 'X')) 
	{
		s += 2;

		while (*s) {
			if (!(is_n(*s) || is_hc(*s)))
				return 0;
			s++;
		}	
	} else if ((*s == '0') && is_hc(*(s+1))) {
		s += 2;
		while (*s) {
			if (!(is_n(*s) || is_hc(*s)))
				break;
			s++;
		}
		if (*s == 0) 
			return 0;
		if ((*s == 'h' || *s == 'H') && (*(s+1) == 0))
			return 1;
	} else 
		return 0;

	return 1;
}

int is_binary(char *s) {
	if (!s) return 0;
	while (*s && (*s == '0' || *s == '1')) 
		s++;
	if (*s == 0)
		return 0;
	else if ((*s == 'b' || *s == 'B') && (*(s+1) == 0))
		return 1;
	else 
		return 0;

	return 1;
}




int is_numeric(char *s) {
	int ret = 0;

	if (!s) return 0;
	
	if (is_c(*s))
		return 0;

	if (!(ret = is_hex(s)))
		if (!(ret = is_dec(s)))
			ret = is_binary(s);

	return ret;
}



int get_sizeof(long long n) 
{
	int ret = 0;

	union {
		long long ll;
		long l[2];
	} u;
	u.ll = n;

	if (n) {
		if (u.l[1])
			ret = 8;
		else if (n <= 0xff)
			ret = 1;
		else if (n <= 0xffff)
			ret = 2;
		else if (n <= 0xffffffff)
			ret = 4;
	} 

	return ret;
}


/* ----------------------------------------------- */

unsigned char get_regid(char *s) 
{
	reg_t *p = regs;
	
	if (!s || !s[0])
		return 0;

	while (p->reg && !str_cmp(s, p->reg))
		p++;

	return p->reg_id;
}


unsigned char get_osegid(char *s) 
{
	oseg_t *p = osegs;
	
	if (!s || !s[0])
		return 0;

	while (p->oseg && !str_cmp(s, p->oseg))
		p++;
	
	return p->oseg_id;
}

unsigned char get_scaleid(char *s) 
{
	scale_t *p = scales;

	if (!s || !s[0])
		return 0;

	while (p->scale && !str_cmp(s, p->scale))
		p++;
	
	return p->scale_id;
}

unsigned char get_castid(char *s) 
{
	cast_t *p = casts;

	if (!s || !s[0]) 
		return 0;
	
	while (p->cast && !str_cmp(s, p->cast))
		p++;

	return p->cast_id;
}


unsigned char get_prefixid(char *s)
{
	i_prefix_t *p = i_prefixs;

	if (!s || !s[0])
		return 0;

	while (p->prefix && !str_cmp(s, p->prefix))
		p++;

	return p->prefix_id;
}


unsigned char get_modeid(char *s) 
{
	mode_t *p = modes;

	if (!s || !s[0])
		return 0;

	while (p->mode && !str_cmp(s, p->mode))
		p++;

	return p->mode_id;
}

unsigned char get_bitsid(char *s)
{
	bits_t *p = bits;

	if (!s || !s[0])
		return 0;

	while (p->bits && !str_cmp(s, p->bits))
		p++;

	return p->bits_id;
}

/*************************************************************/
int check_cast(unsigned char cast)
{
	if (cast && (current_mode == LONG_64 || current_bits == 64)) {
	} else if (!cast || cast == 64)
		return 0;
		
	return 1;
}


int check_oseg(unsigned char oseg)
{
	if (oseg && (current_mode != LONG_64 && current_bits != 64)) { 
		/* 32-bit */
	} else if (!oseg || (oseg == 0x2e) || (oseg ==  0x3e) || 
			(oseg == 0x26) || (oseg == 0x36))
		/* in 64-bit mode: the CS,DS,ES and SS is invalid */
		return 0;

	return 1;
}

/**************************************************
 the funtion check base or index register
***************************************************/
int check_mreg(unsigned char regid)
{
	if (!regid || ((regid & 0xF0) == 0x10))	/* 1-byte register */
		return 0;
	else if ((regid & 0xf0) >= 0xa0)	/* not GPR */
		return 0;
	else if ((regid & 0xF0) == 0x20) {	/* 2-byte register */
		if (current_mode == LONG_64 || current_bits == 64)
			return 0;
		else if (regid == BX || regid == BP || regid == SI 
			|| regid == DI) {
			/* at 32-bit or 16-bit... OK */
		} else 
			return 0;
	}
	

	return 1;
}

/*********************************************************
 check the string is var ????
**********************************************************/
int check_var(char *s)
{
	return 1;
}


/************************************************************/
int is_keyword(char *s) {
	char **p = keyword;

	if (!s) return 0;
	
	while (*p && !str_cmp(*p, s)) 
		p++;

	if (*p == 0)
		return 0;
	return 1;
}


long long strd_to_n(char *s) {
	long long retval = 0;
	while (*s)
		retval = retval * 10 + (*s++ - '0');
	return retval;
}

long long strh_to_n(char *s) {
	long long retval = 0;
	int i = 0;

	s++;
	if (*s == 'x' || *s == 'X') {
		s++;
		while (*s) {
			if (is_n(*s))
				i = *s - '0';
			else if (is_hc(*s))
				i = *s - 'a' + 10;
			else
				return 0;
			retval = retval * 16 + i;
			s++;
		}
	} else {
		while (*s) {
			if (*s == 'h' || *s == 'H')
				break;
			if (is_n(*s))
				i = *s - '0';	
			else if (is_hc(*s))
				i = *s - 'a' + 10;
			else
				return 0;
			retval = retval * 16 + i;
			s++;
		}
	}

	return retval;
}

long long strb_to_n(char *s) {
	long long retval = 0;

	while (*s) {
		if (*s == 'b' || *s == 'B')
			break;
		retval = retval * 2 + (*s - '0');
		s++;
	}
	return retval;
}


long long str_to_n(char *s) {
	long long retval = 0;

	if (!s || !s[0]) return 0;

	if (is_hex(s)) 
		retval = strh_to_n(s);
	else if (is_dec(s))
		retval = strd_to_n(s);
	else if (is_binary(s))
		retval = strb_to_n(s);
	else
		return 0;

	return retval;
}




/* -------------------------------------------------------- */
#if 0
o_link_t *get_o_link() {
	op_link_t *tp_op_link = 0;

	if (tp_op_link = malloc(sizeof(op_link_t))) {	// success
		tp_op_link->ops = 0;
		tp_op_link->n = 0;
		tp_op_link->next = 0;
	}

	return tp_op_link;
}


int release_op_link(op_link_t *op_link) {
	op_link_t *tp_op_link = op_link;	
	op_link_t *next = 0;


	if (!op_link)
		return 0;
	
	for (; tp_op_link; next = tp_op_link->next) {
		if (tp_op_link->ops)
			free(tp_op_link->ops);
		free(tp_op_link);
		tp_op_link = next;	
	}
	return 1;
}


int get_ops(op_link_t *op_link, char *s) {
	int i = 0;
	int j = 0;

	char *p = s + str_len(s) - 1;
	char *q = 0;
	
	op_link->n = 1;

	while (p >= s) {
		q = p;
	 	while (*p && (*p != ',') && (*p != ' ')) 
			p--;

		if (*p == ',') {
			i++;
			if (i > op_link->n) {
				op_link->next = malloc(sizeof(op_link_t));
				op_link->n++;
				op_link = op_link->next;
			}
			p++;
			j = 0;
			while (p+j <= q)
				j++;
			op_link->ops = (char *)malloc(j + 1);
			j = 0;
			while (p+j <= q) {
				op_link->ops[j] = *(p+j);
				j++;
			}
			op_link->ops[j] = 0;
			op_link->next = 0;
			p--;

		} else if (*p == ' ') {
			i++;
			if (i > op_link->n) {
				op_link->next = malloc(sizeof(op_link_t));
				op_link->n++;
				op_link = op_link->next;
			}

			p++;
			j = 0;
			while (p+j <= q) 
				j++;
			op_link->ops = (char *)malloc(j + 1);
			j = 0;
			while (p+j <= q) {
				op_link->ops[j] = *(p+j);
				j++;
			}
			op_link->ops[j] = 0;
			op_link->next = 0;
			p--;
	
		}
			
		p--; 
	}

		
	return 1;

}

#endif


/**********************************************************
**********************************************************/
/*
e_key_t *get_ekey_from_elem(void *elem)
{
	if (!elem)
		return 0;

	return (elem - ((e_key_t *)0
}

*/

/***********************************************************
 *  i_key_t *get_i_key(char *s)
 *  return value: i_key if found
 *                  0   if no found
************************************************************/
i_key_t *get_ins(char *s)
{
	i_set_t *p = i_set;

	if (!s || !s[0])
		return 0;

	while (p->mnemonic && !str_cmp(s, p->mnemonic)) 
		p++;

	return p->i_key;
}


i_key_t *get_i_key(i_key_t *i_key, ops_attr_t *ops_attr)
{
	if (!i_key || !ops_attr)
			return 0;

	while (i_key->opcode || i_key->i_attr) {

		if ((ops_attr->to_attr == i_key->to_attr) &&
			(ops_attr->do_attr == i_key->do_attr) &&
			(ops_attr->so_attr == i_key->so_attr))
			return i_key;

		else if ((SIZE(i_key->so_attr) == 0xe) &&
			(SIZE(i_key->do_attr) == 0xe) && 
			(SIZE(ops_attr->so_attr) != SIZE(ops_attr->do_attr))) {
				i_key++;	
				continue;

		} else if (((!ops_attr->to_attr && !i_key->to_attr) ||
			(ops_attr->to_attr && i_key->to_attr)) &&
			((!ops_attr->do_attr && !i_key->do_attr) ||
			(ops_attr->do_attr && i_key->do_attr)) &&
			((!ops_attr->so_attr && !i_key->so_attr) ||
			(ops_attr->so_attr && i_key->so_attr)))
		if (((ops_attr->to_attr & i_key->to_attr) == ops_attr->to_attr)
		 && ((ops_attr->do_attr & i_key->do_attr) == ops_attr->do_attr)
		 && ((ops_attr->so_attr & i_key->so_attr) == ops_attr->so_attr))
			return i_key;
			
		i_key++;
	}
		
	return 0;
}




/****************************************************************
****************************************************************/
label_t *init_label_table()
{
	label_t *head_label_table = label_table;

	if (!head_label_table) {
		label_table = (label_t *)malloc(sizeof(label_t));
		if (!label_table) {
			fprintf(stderr, "no engouth memory\n");
			exit(1);
		} 
		memset(label_table, 0, sizeof(label_t));
		head_label_table = label_table;

	} else {
		while (head_label_table->next)
			head_label_table = head_label_table->next;
		head_label_table->next = (label_t *)malloc(sizeof(label_t));
		if (!head_label_table->next) {
			fprintf(stderr, "no engouth memory\n");
			exit(1);
		}
		memset(head_label_table->next, 0, sizeof(label_t));
		head_label_table = head_label_table->next;
	}

	return head_label_table;
}

variable_t *init_var_table()
{
	variable_t *head_var_table = var_table;

	if (!head_var_table) {
		var_table = (variable_t *)malloc(sizeof(variable_t));
		if (!var_table) {
			fprintf(stderr, "no enought memory\n");
			exit(1);
		}
		memset(var_table, 0, sizeof(variable_t));
		head_var_table = var_table;

	} else {
		while (head_var_table->next) 
			head_var_table = head_var_table->next;
		head_var_table->next = 
			(variable_t *)malloc(sizeof(variable_t));
		if (!head_var_table->next) {
			fprintf(stderr, "no enought memory\n");
			exit(1);
		}
		memset(head_var_table->next, 0, sizeof(variable_t));
		head_var_table = head_var_table->next;
	}

	return head_var_table;
}



/******************************************************
 function: int is_free_sym(char *s)
 return: true if the symbol is free and can by used
******************************************************/
int is_free_sym(char *s)
{
	if (!s || !s[0])
		return 0;
	
	char str[80];
	label_t *head_label_table = label_table;
	variable_t *head_var_table = var_table;

	trim_space(str, s);
	if (is_c(*str) || (*str == '_')) {	/* OK */
		while (head_label_table && 
			!str_cmp(head_label_table->token, str)) 
			head_label_table = head_label_table->next;

		while (head_var_table && !str_cmp(head_var_table->token, str))
			head_var_table = head_var_table->next;


		return !head_label_table && !head_var_table;
	}

	return 0;
}


int is_label(char *s)
{
	label_t *head_label_table = label_table;
	char str[80];

	if (!s || !s[0])
		return 0;

	if (is_c(*str) || (*str == '_')) {
		while (head_label_table && 
			!str_cmp(head_label_table->token, str))
			head_label_table = head_label_table->next;

		return (int)head_label_table;
	}
	
	return 0;
}

int is_variable(char *s)
{
	variable_t *head_var_table = var_table;
	char str[80];
	
	if (!s || !s[0])
		return 0;

	trim_space(str, s);
	if (is_c(*str) || (*str == '_')) {
		while (head_var_table && !str_cmp(head_var_table->token, str))
			head_var_table = head_var_table->next;

		return (int)head_var_table;
	}


	return 0;
}

/*

int is_valid_sym(char *s)
{
	if (!s || !s[0])	
		return 0;

	symbol_t *head_sym_table = sym_table;
	char str[80];
	trim_space(str, s);

	if (is_c(*str) || (*str == '_')) {
		while (head_sym_table && !str_cmp(head_sym_table->token, str))
			head_sym_table = head_sym_table->next;
		return (int)head_sys_table;
	} 
	
	return 0;
}

*/

/********************************************************************/
/*

main() {
	printf("%x: %d\n", 0xe,get_sum_of_1bit(0xe));
}

*/