FreeBSD/contrib/mdocml/roff.c
/*
 * Duplicate an input string, making the appropriate character
 * conversations (as stipulated by `tr') along the way.
 * Returns a heap-allocated string with all the replacements made.
 */
Duplicate an input string, making the appropriate character
conversations (as stipulated by `tr') along the way.
Returns a heap-allocated string with all the replacements made.
Duplicate an input string making the appropriate character conversations ( as stipulated by ` tr ' ) along the way . Returns a heap - allocated string with all the replacements made .
char *
roff_strdup(const struct roff *r, const char *p)
{
	const struct roffkv *cp;
	char		*res;
	const char	*pp;
	size_t		 ssz, sz;
	enum mandoc_esc	 esc;
	if (NULL == r->xmbtab && NULL == r->xtab)
		return mandoc_strdup(p);
	else if ('\0' == *p)
		return mandoc_strdup("");
	res = NULL;
	ssz = 0;
	while ('\0' != *p) {
		if ('\\' != *p && r->xtab && r->xtab[(int)*p].p) {
			sz = r->xtab[(int)*p].sz;
			res = mandoc_realloc(res, ssz + sz + 1);
			memcpy(res + ssz, r->xtab[(int)*p].p, sz);
			ssz += sz;
			p++;
			continue;
		} else if ('\\' != *p) {
			res = mandoc_realloc(res, ssz + 2);
			res[ssz++] = *p++;
			continue;
		}
		for (cp = r->xmbtab; cp; cp = cp->next)
			if (0 == strncmp(p, cp->key.p, cp->key.sz))
				break;
		if (NULL != cp) {
			res = mandoc_realloc(res,
			    ssz + cp->val.sz + 1);
			memcpy(res + ssz, cp->val.p, cp->val.sz);
			ssz += cp->val.sz;
			p += (int)cp->key.sz;
			continue;
		}
		pp = p++;
		esc = mandoc_escape(&p, NULL, NULL);
		if (ESCAPE_ERROR == esc) {
			sz = strlen(pp);
			res = mandoc_realloc(res, ssz + sz + 1);
			memcpy(res + ssz, pp, sz);
			break;
		}
		sz = (int)(p - pp);
		res = mandoc_realloc(res, ssz + sz + 1);
		memcpy(res + ssz, pp, sz);
		ssz += sz;
	}
	res[(int)ssz] = '\0';
	return res;
}
char * roff_strdup ( const struct roff * r , const char * p ) { const struct roffkv * cp ; char * res ; const char * pp ; size_t ssz , sz ; enum mandoc_esc esc ; if ( NULL == r -> xmbtab && NULL == r -> xtab ) return mandoc_strdup ( p ) ; else if ( ' \0 ' == * p ) return mandoc_strdup ( " " ) ; res = NULL ; ssz = 0 ; while ( ' \0 ' != * p ) { if ( ' \\ ' != * p && r -> xtab && r -> xtab [ ( int ) * p ] . p ) { sz = r -> xtab [ ( int ) * p ] . sz ; res = mandoc_realloc ( res , ssz + sz + 1 ) ; memcpy ( res + ssz , r -> xtab [ ( int ) * p ] . p , sz ) ; ssz += sz ; p ++ ; continue ; } else if ( ' \\ ' != * p ) { res = mandoc_realloc ( res , ssz + 2 ) ; res [ ssz ++ ] = * p ++ ; continue ; } for ( cp = r -> xmbtab ; cp ; cp = cp -> next ) if ( 0 == strncmp ( p , cp -> key . p , cp -> key . sz ) ) break ; if ( NULL != cp ) { res = mandoc_realloc ( res , ssz + cp -> val . sz + 1 ) ; memcpy ( res + ssz , cp -> val . p , cp -> val . sz ) ; ssz += cp -> val . sz ; p += ( int ) cp -> key . sz ; continue ; } pp = p ++ ; esc = mandoc_escape ( & p , NULL , NULL ) ; if ( ESCAPE_ERROR == esc ) { sz = strlen ( pp ) ; res = mandoc_realloc ( res , ssz + sz + 1 ) ; memcpy ( res + ssz , pp , sz ) ; break ; } sz = ( int ) ( p - pp ) ; res = mandoc_realloc ( res , ssz + sz + 1 ) ; memcpy ( res + ssz , pp , sz ) ; ssz += sz ; } res [ ( int ) ssz ] = ' \0 ' ; return res ; }
Duplicate an input string, making the appropriate character
 conversations (as stipulated by `tr') along the way.
Duplicate an input string making the appropriate character conversations ( as stipulated by ` tr ' ) along the way .
/*
	 * Step through each character looking for term matches
	 * (remember that a `tr' can be invoked with an escape, which is
	 * a glyph but the escape is multi-character).
	 * We only do this if the character hash has been initialised
	 * and the string is >0 length.
	 */ /* Search for term matches. */ /*
			 * A match has been found.
			 * Append the match to the array and move
			 * forward by its keysize.
			 */ /*
		 * Handle escapes carefully: we need to copy
		 * over just the escape itself, or else we might
		 * do replacements within the escape itself.
		 * Make sure to pass along the bogus string.
		 */ /*
		 * We bail out on bad escapes.
		 * No need to warn: we already did so when
		 * roff_res() was called.
		 */