# this script breaks awk.  The printf can be change to a print and
# it will break differently.
awk '
BEGIN	{ FS="," }
	{
	tables[$2] = 1;
}

END	{
	for (i in tables) printf "#define %s\t%dn", i, num++
}
' <<!
	"v_gne", T_NE, O_GET, sizeof (struct v_ne), OUT, v_gne,
	"v_pne", T_NE, O_PUT, sizeof (struct v_ne), IN, v_pne,
	"v_dne", T_NE, O_DEF, sizeof (struct v_ne), OUT, v_dne,
	"v_gt1", T_T1, O_GET, sizeof (struct v_t1), OUT, v_gt1,
	"v_pt1", T_T1, O_PUT, sizeof (struct v_t1), IN, v_pt1,
	"v_dt1", T_T1, O_DEF, sizeof (struct v_t1), OUT, v_dt1,
	"v_rmt1", T_T1, O_REMOVE, sizeof (struct v_t1), IN, v_rmt1,
	"v_grack", T_RACK, O_GET, sizeof (struct v_rack), OUT, v_grack,
	"v_prack", T_RACK, O_PUT, sizeof (struct v_rack), IN, v_prack,
	"v_drack", T_RACK, O_DEF, sizeof (struct v_rack), OUT, v_drack,
	"v_rmrack", T_RACK, O_REMOVE, sizeof (struct v_rack), IN, v_rmrack,
	"v_gshelf", T_SHELF, O_GET, sizeof (struct v_shelf), OUT, v_gshelf,
	"v_pshelf", T_SHELF, O_PUT, sizeof (struct v_shelf), IN, v_pshelf,
	"v_dshelf", T_SHELF, O_DEF, sizeof (struct v_shelf), OUT, v_dshelf,
	"v_rmshelf", T_SHELF, O_REMOVE, sizeof (struct v_shelf), IN, v_rmshelf,
	"v_gcard", T_CARD, O_GET, sizeof (struct v_card), OUT, v_gcard,
	"v_pcard", T_CARD, O_PUT, sizeof (struct v_card), IN, v_pcard,
	"v_dcard", T_CARD, O_DEF, sizeof (struct v_card), OUT, v_dcard,
	"v_rmcard", T_CARD, O_REMOVE, sizeof (struct v_card), IN, v_rmcard,
	"v_gmic", T_MIC, O_GET, sizeof (struct v_mic), OUT, v_gmic,
	"v_pmic", T_MIC, O_PUT, sizeof (struct v_mic), IN, v_pmic,
	"v_dmic", T_MIC, O_DEF, sizeof (struct v_mic), OUT, v_dmic,
	"v_rmmic", T_MIC, O_REMOVE, sizeof (struct v_mic), IN, v_rmmic,
	"v_pmat", T_MAT, O_PUT, sizeof (struct v_mat), IN, v_pmat,
	"v_gmat", T_MAT, O_GET, sizeof (struct v_mat), OUT, v_gmat,
	"v_dmat", T_MAT, O_DEF, sizeof (struct v_mat), OUT, v_dmat,
	"v_rmmat", T_MAT, O_REMOVE, sizeof (struct v_mat), IN, v_rmmat,
	"v_gtim", T_TIM, O_GET, sizeof (struct v_tim), OUT, v_gtim,
	"v_ptim", T_TIM, O_PUT, sizeof (struct v_tim), IN, v_ptim,
	"v_dtim", T_TIM, O_DEF, sizeof (struct v_tim), OUT, v_dtim,
	"v_rmtim", T_TIM, O_REMOVE, sizeof (struct v_tim), IN, v_rmtim,
	"v_gps", T_PS, O_GET, sizeof (struct v_ps), OUT, v_gps,
	"v_pps", T_PS, O_PUT, sizeof (struct v_ps), IN, v_pps,
	"v_dps", T_PS, O_DEF, sizeof (struct v_ps), OUT, v_dps,
	"v_rmps", T_PS, O_REMOVE, sizeof (struct v_ps), IN, v_rmps,
	"v_gt3", T_T3, O_GET, sizeof (struct v_t3), OUT, v_gt3,
	"v_pt3", T_T3, O_PUT, sizeof (struct v_t3), IN, v_pt3,
	"v_dt3", T_T3, O_DEF, sizeof (struct v_t3), OUT, v_dt3,
	"v_rmt3", T_T3, O_REMOVE, sizeof (struct v_t3), IN, v_rmt3,
	"v_gcrs1", T_CRS1, O_GET, sizeof (struct v_crs1), OUT, v_gcrs1,
	"v_pcrs1", T_CRS1, O_PUT, sizeof (struct v_crs1), IN, v_pcrs1,
	"v_dcrs1", T_CRS1, O_DEF, sizeof (struct v_crs1), OUT, v_dcrs1,
	"v_rmcrs1", T_CRS1, O_REMOVE, sizeof (struct v_crs1), IN, v_rmcrs1,
	"v_gcrs3", T_CRS3, O_GET, sizeof (struct v_crs3), OUT, v_gcrs3,
	"v_pcrs3", T_CRS3, O_PUT, sizeof (struct v_crs3), IN, v_pcrs3,
	"v_dcrs3", T_CRS3, O_DEF, sizeof (struct v_crs3), OUT, v_dcrs3,
	"v_rmcrs3", T_CRS3, O_REMOVE, sizeof (struct v_crs3), IN, v_rmcrs3,
!
