- struct Item *curritem = NULL; /* item currently being read */
- struct Menu *prevmenu = NULL; /* menu the previous item was added to */
- struct Item *item; /* dummy item for for loops */
- struct Menu *menu; /* dummy menu for for loops */
- size_t count = 0; /* number of items in the current menu */
-
- rootmenu = NULL;
-
- while (fgets(buf, BUFSIZ, stdin) != NULL) {
- level = 0;
- s = buf;
-
- while (*s == '\t') {
- level++;
- s++;
- }
-
- label = output = s;
-
- while (*s != '\0' && *s != '\t' && *s != '\n')
- s++;
-
- while (*s == '\t')
- *s++ = '\0';
-
- if (*s != '\0' && *s != '\n')
- output = s;
-
- while (*s != '\0' && *s != '\n')
- s++;
-
- if (*s == '\n')
- *s = '\0';
-
- curritem = allocitem(label, output);
-
- if (prevmenu == NULL) { /* there is no menu yet */
- menu = allocmenu(NULL, curritem, level);
- rootmenu = menu;
- prevmenu = menu;
- count = 1;
- curritem->prev = NULL;
- curritem->next = NULL;
- } else if (level < prevmenu->level) { /* item is continuation of a parent menu*/
- for (menu = prevmenu, i = level;
- menu != NULL && i < prevmenu->level;
- menu = menu->parent, i++)
- ;
-
- if (menu == NULL)
- errx(1, "reached NULL menu");
-
- for (item = menu->list; item->next != NULL; item = item->next)
- ;