+# ifdef PTO_COLOR
+/* set a nice color to an object descriptor */
+static void pto_name_set_obj_color (obj_desc_t *obj_desc, int col_idx)
+{
+ int i;
+
+ for (i = 0; i < obj_desc->n_fields; i ++) {
+ qset_t *ptos = obj_desc->values [i];
+
+ desc_t *tgt = (desc_t*) qset_start (ptos);
+
+ while (NULL != tgt) {
+ pto_name_set_color (tgt, col_idx);
+
+ tgt = (desc_t*) qset_next (ptos);
+ }
+ }
+}
+
+/* set a nice color to an array descriptor */
+static void pto_name_set_arr_color (arr_desc_t *arr_desc, int col_idx)
+{
+ qset_t *ptos = arr_desc->value;
+
+ desc_t *tgt = (desc_t*) qset_start (ptos);
+
+ while (NULL != tgt) {
+ pto_name_set_color (tgt, col_idx);
+
+ tgt = (desc_t*) qset_next (ptos);
+ }
+}
+
+/* set a nice color to a descriptor */
+static void pto_name_set_color (desc_t *desc, int col_idx)
+{
+ /* assert (0 == desc->col_idx); */
+
+ desc->col_idx = col_idx;
+
+ if (FALSE == desc->visit) {
+ desc->visit = TRUE;
+ if (object == desc->kind) {
+ pto_name_set_obj_color ((obj_desc_t*) desc, col_idx);
+ } else if (array == desc->kind) {
+ pto_name_set_arr_color ((arr_desc_t*) desc, col_idx);
+ }
+
+ desc->visit = FALSE;
+ }
+}
+
+
+/* allocate nice colors for an object descriptor */
+static int pto_name_alloc_obj_color (obj_desc_t *obj_desc)
+{
+ int i;
+ int col_idx = 0;
+
+ for (i = 0; (0 == col_idx) && (i < obj_desc->n_fields); i ++) {
+ qset_t *ptos = obj_desc->values [i];
+ desc_t *tgt = (desc_t*) qset_start (ptos);
+
+ while ((0 == col_idx) && (NULL != tgt)) {
+ col_idx = pto_name_alloc_color (tgt);
+
+ tgt = (desc_t*) qset_next (ptos);
+ }
+ }
+
+ return (col_idx);
+}
+
+/* allocate nice colors for an array descriptor */
+static int pto_name_alloc_arr_color (arr_desc_t *arr_desc)
+{
+ int col_idx = 0;
+
+ qset_t *ptos = arr_desc->value;
+
+ desc_t *tgt = (desc_t*) qset_start (ptos);
+
+ while ((NULL != tgt) && (0 == col_idx)) {
+ col_idx = pto_name_alloc_color (tgt);
+ tgt = (desc_t*) qset_next (ptos);
+ }
+
+ return (col_idx);
+}
+
+/* allocate nice colors for the given descriptor */
+static int pto_name_alloc_color (desc_t *desc)
+{
+ int col_idx = 0;
+
+ if (0 != desc->col_idx) {
+ return (desc->col_idx);
+ }
+
+ if (FALSE == desc->visit) {
+ desc->visit = TRUE;
+ if (object == desc->kind) {
+ col_idx = pto_name_alloc_obj_color ((obj_desc_t*) desc);
+ } else if (array == desc->kind) {
+ col_idx = pto_name_alloc_arr_color ((arr_desc_t*) desc);
+ }
+ desc->visit = FALSE;
+ }
+
+ if (0 == col_idx) {
+ col_idx = ++ last_col_idx;
+ }
+
+ pto_name_set_color (desc, col_idx);
+
+ return (col_idx);
+}
+
+/* allocate nice colors */
+static void pto_name_alloc_colors (void)
+{
+ desc_t *desc = all_descs;
+
+ while (NULL != desc) {
+ pto_name_alloc_color (desc);
+
+ desc = desc->prev;
+ }
+}
+# endif /* defined PTO_COLOR */
+