mangle.c

来自「基于LWVCL开发的库」· C语言 代码 · 共 831 行 · 第 1/2 页

C
831
字号
			2 + /* 'cl' */			2 + /* '0x' */			(sizeof(void *) * 2); /* the number */		quals++;	}	if( !error && (retval = (char *)KMALLOC(prepend + total_len + 1)) )	{		char *dest;		/* Start after the prepended section */		dest = retval + prepend;		dest[0] = 0;		if( quals )		{			/*			 * Its a qualified name, print out how many qualifiers			 * there are before continuing			 */			quals++;			if( quals < 10 )				sprintf(dest, "Q%d", quals);			else				sprintf(dest, "Q_%d_", quals);			quals--;		}		dest += strlen(dest);		/* Encode the class loader, if there is one */		if( cl )		{			int cl_len;			sprintf(dest + 3, "l%p", cl);			cl_len = strlen(dest + 3) + 1;			sprintf(dest, "%d", cl_len);			dest[2] = 'c'; /* The previous sprintf overwrote it */			dest += cl_len + 2;			quals--;		}		curr = name;		while( curr < end )		{			if( (m_len = mangleLength(curr,						  quals ? -1 : end - curr,						  NAME_SEPARATORS,						  &len)) )			{#if MANGLE_GCJ				*dest = 'U';				dest++;#endif			}			else			{				m_len = len;			}			/* Write the length of the name */			sprintf(dest, "%d", m_len);			dest += strlen(dest);			/* Mangle the string */			mangleString(dest, curr, len, m_len != len);			/* Move on to the next name */			dest += strlen(dest);			curr += len + 1;			quals--;		}		assert((dest - retval) <= (ptrdiff_t)(prepend + total_len + 1));	}	return( retval );}char *mangleType(size_t prepend, const char *type){	char *retval = 0;	switch(type[0])	{	case 'L':		/* Object reference */		if( (retval = mangleClassType((int)prepend + 1, 0, type + 1)) )			retval[prepend] = 'P';		break;	case '[':		/* Array type */		if( (retval = mangleType(prepend + 11, type + 1)) )			strncpy(&retval[prepend], "Pt6JArray1Z", 11);		break;	default:		/* Most likely a primitive */		{			const char *prim;			if( (prim = manglePrimitiveType(type[0])) )			{				if( (retval = (char *)KMALLOC(prepend + 2)) )				{					retval[prepend] = prim[0];					retval[prepend + 1] = 0;				}			}		}		break;	}	return( retval );}size_t mangleLength(const char *string, int len, const char *term, size_t *out_len){	int num_chars = 0, need_escapes = 0, num_underscores = 0;	int retval = -1, error = 0;	const char *curr, *end;	curr = string;	if( len < 0 )		end = (char *)-1; /* ick */	else		end = string + len;	while( !error && ((len < 0) || (curr < end)) )	{		int ch = UTF8_GET(curr, end);		if( ch < 0 )		{			error = 1;			break;		}		else if( term )		{			int found_term = 0;			int lpc;			for( lpc = 0; term[lpc]; lpc++ )			{				if( term[lpc] == ch )					found_term = 1;			}			if( found_term )			{				/* Found the specified terminator */				break;			}		}		if( (ch >= '0') && (ch <= '9') )		{			/* If a number starts a name then we need an escape */			if( (curr - 1) == string)				need_escapes++;		}		else if( ch == '_' && bad_underscore(curr, end))		{#if MANGLE_GCJ			num_underscores++;#else			need_escapes++;#endif		}		else if( ((ch < 'a') || (ch > 'z')) &&			 ((ch < 'A') || (ch > 'Z')) &&			 (ch != '_') )		{			/* Special character, we'll need an escape */			need_escapes++;		}		num_chars++;	}	if( !error )	{		if( need_escapes )		{			retval = num_chars +				4 * (need_escapes + num_underscores);		}		else			retval = 0;		/* Write back the length */		if( out_len )			*out_len = num_chars;	}	return( retval );}size_t mangleString(char *dest, const char *src, size_t slen, int _unicode){	int retval = 0, ch, error = 0, need_escape = 0;	char *start;	const char *curr, *end;	start = dest;	curr = src;	end = src + slen;	while( (curr < end) && !error )	{		ch = UTF8_GET(curr, end);		if( ch < 0 )		{			error = 1;		}		else if( (ch >= '0') && (ch <= '9') )		{			if( (curr - 1) == src )				need_escape = 1;			else				need_escape = 0;		}		else if( ch == '_' )		{			if( _unicode && bad_underscore(curr, end) )			{				need_escape = 1;			}		}		else if( ((ch < 'a') || (ch > 'z')) &&			 ((ch < 'A') || (ch > 'Z')) )		{			need_escape = 1;		}		else		{			need_escape = 0;		}		if( !error )		{			if( need_escape )			{				sprintf(dest, "_%04x", ch);				dest += 5;			}			else			{				*dest = ch;				dest++;			}		}	}	*dest = 0;	if( error )		retval = -1;	else		retval = dest - start + 1;	return( retval );}static int fputss(const char *str, size_t len, FILE *stream){    size_t lpc;    int retval = 0;    for( lpc = 0; lpc < len; lpc++ )    {	putc(str[lpc], stream);    }    return( retval );}int vfmanglef(FILE *file, const char *format, va_list args){    unsigned int sindex, eindex;    int retval = 0;    for( sindex = eindex = 0; format[eindex] != '\0'; eindex++ )    {	switch( format[eindex] )	{	case '%':	    {		int done = 0;		while( !done )		{		    eindex += 1;		    switch( format[eindex] )		    {		    case 'q': /* qualified string */			{			    const char *quals, *str;			    size_t offset = 0, len;			    void *ptr;			    			    quals = va_arg(args, const char *);			    str = va_arg(args, const char *);			    ptr = va_arg(args, void *);			    			    len = strlen(str);			    while( offset < len )			    {				char buffer[1 + 2 + sizeof(void *) * 2 + 1];				const char *sub_end;				size_t slen;				buffer[0] = '\0';				sub_end = strpbrk(&str[offset], quals);				if( sub_end == NULL )				{				    sub_end = &str[len];				    if( ptr != NULL )				    {					snprintf(buffer,						 sizeof(buffer),						 "_%p",						 ptr);				    }				}				slen = sub_end - &str[offset];				fprintf(file, "%d", slen + strlen(buffer));				fputss(&str[offset], slen, file);				fprintf(file, "%s", buffer);				offset += slen + 1;			    }			    done = 1;			}			break;		    case 't':			{			    const char *in, *out, *str;			    unsigned int lpc;			    in = va_arg(args, const char *);			    out = va_arg(args, const char *);			    str = va_arg(args, const char *);			    			    assert(strlen(in) == strlen(out));			    for( lpc = 0; str[lpc] != '\0'; lpc++ )			    {				const char *rep;				if( (rep = strchr(in, str[lpc])) != NULL )				{				    putc(out[rep - in], file);				}				else				{				    putc(str[lpc], file);				}			    }			    done = 1;			}			break;		    case 'c':			{				char c;				c = (char)va_arg(args, int);				fprintf(file, "%c", c);				done = 1;			}			break;		    case 'd':			{			    int i;			    i = va_arg(args, int);			    fprintf(file, "%d", i);			    done = 1;			}			break;		    case 'p':			{			    void *ptr;			    ptr = va_arg(args, void *);			    fprintf(file, "%p", ptr);			    done = 1;			}			break;		    case 's':			{			    const char *str;			    			    str = va_arg(args, const char *);			    fprintf(file, "%s", str);			    done = 1;			}			break;		    case 'S':			{			    const char *str;			    size_t len;			    			    str = va_arg(args, const char *);			    len = va_arg(args, size_t);			    fputss(str, len, file);			    done = 1;			}			break;		    default:			assert(0);			break;		    }		}	    }	    break;	default:	    putc(format[eindex], file);	    break;	}    }    return( retval );}int fmanglef(FILE *file, const char *format, ...){    va_list args;    int retval;    va_start(args, format);    retval = vfmanglef(file, format, args);    va_end(args);    return( retval );}#endif /* defined(KAFFE_XDEBUGGING) || defined(KAFFE_XPROFILER) */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?