FreeBSD/usr.bin/xlint/lint2/emit2.c
/*
 * Write type into the output buffer.
 */
Write type into the output buffer.
Write type into the output buffer .
static void
outtype(type_t *tp)
{
	int	t, s, na;
	tspec_t	ts;
	type_t	**ap;
	while (tp != NULL) {
		if ((ts = tp->t_tspec) == INT && tp->t_isenum)
			ts = ENUM;
		switch (ts) {
		case CHAR:	t = 'C';	s = '\0';	break;
		case SCHAR:	t = 'C';	s = 's';	break;
		case UCHAR:	t = 'C';	s = 'u';	break;
		case SHORT:	t = 'S';	s = '\0';	break;
		case USHORT:	t = 'S';	s = 'u';	break;
		case INT:	t = 'I';	s = '\0';	break;
		case UINT:	t = 'I';	s = 'u';	break;
		case LONG:	t = 'L';	s = '\0';	break;
		case ULONG:	t = 'L';	s = 'u';	break;
		case QUAD:	t = 'Q';	s = '\0';	break;
		case UQUAD:	t = 'Q';	s = 'u';	break;
		case FLOAT:	t = 'D';	s = 's';	break;
		case DOUBLE:	t = 'D';	s = '\0';	break;
		case LDOUBLE:	t = 'D';	s = 'l';	break;
		case VOID:	t = 'V';	s = '\0';	break;
		case PTR:	t = 'P';	s = '\0';	break;
		case ARRAY:	t = 'A';	s = '\0';	break;
		case ENUM:	t = 'T';	s = 'e';	break;
		case STRUCT:	t = 'T';	s = 's';	break;
		case UNION:	t = 'T';	s = 'u';	break;
		case FUNC:
			if (tp->t_args != NULL && !tp->t_proto) {
				t = 'f';
			} else {
				t = 'F';
			}
			s = '\0';
			break;
		default:
			errx(1, "internal error: outtype() 1");
		}
		if (tp->t_const)
			outchar('c');
		if (tp->t_volatile)
			outchar('v');
		if (s != '\0')
			outchar(s);
		outchar(t);
		if (ts == ARRAY) {
			outint(tp->t_dim);
		} else if (ts == ENUM || ts == STRUCT || ts == UNION) {
			if (tp->t_istag) {
				outint(1);
				outname(tp->t_tag->h_name);
			} else if (tp->t_istynam) {
				outint(2);
				outname(tp->t_tynam->h_name);
			} else if (tp->t_isuniqpos) {
				outint(3);
				outint(tp->t_uniqpos.p_line);
				outchar('.');
				outint(tp->t_uniqpos.p_file);
				outchar('.');
				outint(tp->t_uniqpos.p_uniq);
			} else
				errx(1, "internal error: outtype() 2");
		} else if (ts == FUNC && tp->t_args != NULL) {
			na = 0;
			for (ap = tp->t_args; *ap != NULL; ap++)
				na++;
			if (tp->t_vararg)
				na++;
			outint(na);
			for (ap = tp->t_args; *ap != NULL; ap++)
				outtype(*ap);
			if (tp->t_vararg)
				outchar('E');
		}
		tp = tp->t_subt;
	}
}
static void outtype ( type_t * tp ) { int t , s , na ; tspec_t ts ; type_t * * ap ; while ( tp != NULL ) { if ( ( ts = tp -> t_tspec ) == INT && tp -> t_isenum ) ts = ENUM ; switch ( ts ) { case CHAR : t = ' ' ; s = ' \0 ' ; break ; case SCHAR : t = ' ' ; s = ' ' ; break ; case UCHAR : t = ' ' ; s = ' ' ; break ; case SHORT : t = ' ' ; s = ' \0 ' ; break ; case USHORT : t = ' ' ; s = ' ' ; break ; case INT : t = ' ' ; s = ' \0 ' ; break ; case UINT : t = ' ' ; s = ' ' ; break ; case LONG : t = ' ' ; s = ' \0 ' ; break ; case ULONG : t = ' ' ; s = ' ' ; break ; case QUAD : t = ' ' ; s = ' \0 ' ; break ; case UQUAD : t = ' ' ; s = ' ' ; break ; case FLOAT : t = ' ' ; s = ' ' ; break ; case DOUBLE : t = ' ' ; s = ' \0 ' ; break ; case LDOUBLE : t = ' ' ; s = ' ' ; break ; case VOID : t = ' ' ; s = ' \0 ' ; break ; case PTR : t = ' ' ; s = ' \0 ' ; break ; case ARRAY : t = ' ' ; s = ' \0 ' ; break ; case ENUM : t = ' ' ; s = ' ' ; break ; case STRUCT : t = ' ' ; s = ' ' ; break ; case UNION : t = ' ' ; s = ' ' ; break ; case FUNC : if ( tp -> t_args != NULL && ! tp -> t_proto ) { t = ' ' ; } else { t = ' ' ; } s = ' \0 ' ; break ; default : errx ( 1 , " " ) ; } if ( tp -> t_const ) outchar ( ' ' ) ; if ( tp -> t_volatile ) outchar ( ' ' ) ; if ( s != ' \0 ' ) outchar ( s ) ; outchar ( t ) ; if ( ts == ARRAY ) { outint ( tp -> t_dim ) ; } else if ( ts == ENUM || ts == STRUCT || ts == UNION ) { if ( tp -> t_istag ) { outint ( 1 ) ; outname ( tp -> t_tag -> h_name ) ; } else if ( tp -> t_istynam ) { outint ( 2 ) ; outname ( tp -> t_tynam -> h_name ) ; } else if ( tp -> t_isuniqpos ) { outint ( 3 ) ; outint ( tp -> t_uniqpos . p_line ) ; outchar ( ' ' ) ; outint ( tp -> t_uniqpos . p_file ) ; outchar ( ' ' ) ; outint ( tp -> t_uniqpos . p_uniq ) ; } else errx ( 1 , " " ) ; } else if ( ts == FUNC && tp -> t_args != NULL ) { na = 0 ; for ( ap = tp -> t_args ; * ap != NULL ; ap ++ ) na ++ ; if ( tp -> t_vararg ) na ++ ; outint ( na ) ; for ( ap = tp -> t_args ; * ap != NULL ; ap ++ ) outtype ( * ap ) ; if ( tp -> t_vararg ) outchar ( ' ' ) ; } tp = tp -> t_subt ; } }
Write type into the output buffer.
Write type into the output buffer .