static void list_uplevel(int type) { if (!listp) return; if (type == LIST_INCBIN || type == LIST_TIMES) { suppress |= (type == LIST_INCBIN ? 1 : 2); list_out(listoffset, type == LIST_INCBIN ? "<incbin>" : "<rept>"); return; } listlevel++; if (mistack && mistack->inhibiting && type == LIST_INCLUDE) { MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit)); temp->next = mistack; temp->level = listlevel; temp->inhibiting = false; mistack = temp; } else if (type == LIST_MACRO_NOLIST) { MacroInhibit *temp = nasm_malloc(sizeof(MacroInhibit)); temp->next = mistack; temp->level = listlevel; temp->inhibiting = true; mistack = temp; } }
static void list_output(int32_t offset, const void *data, enum out_type type, uint64_t size) { char q[20]; if (!listp || suppress || user_nolist) /* fbk - 9/2/00 */ return; switch (type) { case OUT_RAWDATA: { uint8_t const *p = data; if (size == 0 && !listdata[0]) listoffset = offset; while (size--) { HEX(q, *p); q[2] = '\0'; list_out(offset++, q); p++; } break; } case OUT_ADDRESS: list_address(offset, "[]", *(int64_t *)data, abs((int)size)); break; case OUT_REL1ADR: list_address(offset, "()", *(int64_t *)data, 1); break; case OUT_REL2ADR: list_address(offset, "()", *(int64_t *)data, 2); break; case OUT_REL4ADR: list_address(offset, "()", *(int64_t *)data, 4); break; case OUT_REL8ADR: list_address(offset, "()", *(int64_t *)data, 8); break; case OUT_RESERVE: { snprintf(q, sizeof(q), "<res %08"PRIX64">", size); list_out(offset, q); break; } } }
static void list_address(int32_t offset, const char *brackets, int64_t addr, int size) { char q[20]; char *r = q; nasm_assert(size <= 8); *r++ = brackets[0]; while (size--) { HEX(r, addr); addr >>= 8; r += 2; } *r++ = brackets[1]; *r = '\0'; list_out(offset, q); }
static void list_output(long offset, const void *data, unsigned long type) { unsigned long typ, size; if (!listp || suppress || user_nolist) /* fbk - 9/2/00 */ return; typ = type & OUT_TYPMASK; size = type & OUT_SIZMASK; if (typ == OUT_RAWDATA) { unsigned char const *p = data; char q[3]; while (size--) { HEX(q, *p); q[2] = '\0'; list_out(offset++, q); p++; } } else if (typ == OUT_ADDRESS) { unsigned long d = *(long *)data; char q[11]; unsigned char p[4], *r = p; if (size == 4) { q[0] = '['; q[9] = ']'; q[10] = '\0'; WRITELONG(r, d); HEX(q + 1, p[0]); HEX(q + 3, p[1]); HEX(q + 5, p[2]); HEX(q + 7, p[3]); list_out(offset, q); } else { q[0] = '['; q[5] = ']'; q[6] = '\0'; WRITESHORT(r, d); HEX(q + 1, p[0]); HEX(q + 3, p[1]); list_out(offset, q); } } else if (typ == OUT_REL2ADR) { unsigned long d = *(long *)data; char q[11]; unsigned char p[4], *r = p; q[0] = '('; q[5] = ')'; q[6] = '\0'; WRITESHORT(r, d); HEX(q + 1, p[0]); HEX(q + 3, p[1]); list_out(offset, q); } else if (typ == OUT_REL4ADR) { unsigned long d = *(long *)data; char q[11]; unsigned char p[4], *r = p; q[0] = '('; q[9] = ')'; q[10] = '\0'; WRITELONG(r, d); HEX(q + 1, p[0]); HEX(q + 3, p[1]); HEX(q + 5, p[2]); HEX(q + 7, p[3]); list_out(offset, q); } else if (typ == OUT_RESERVE) { char q[20]; snprintf(q, sizeof(q), "<res %08lX>", size); list_out(offset, q); } }
/* редактор списка структур */ void list_edit(LPLIST lpList) { int ItemIndex = -1; /* текущий индекс элемента */ LPITEM lpItem = 0; /* выбранный элемент */ if (lpList->Count > 0) ItemIndex = 0; /* цикл */ while (1) { clrscr(); /* заголовок */ printf("Edit List [Count = %d] [Max Count = %d] ", lpList->Count, BUFF_SIZE); if (ItemIndex < 0) printf("[no selected]\n"); else printf("[Current elem = %d]\n", ItemIndex); separator(); /* клавиши управления */ printf("q - exit\n"); printf("a - add\n"); printf("d - delete\n"); printf("e - edit\n"); printf("l - print list\n"); printf("s = sorter\n"); printf("c - clear list\n"); printf("f - find item\n"); printf("b - back elem\tn - next elem\n\n"); if (ItemIndex >= 0) { table_head(); item_out(&lpList->Items[ItemIndex]); } separator(); /* обработка клавиш */ switch (getch()) { case 'c': /* очистка списка */ list_clear(lpList); ItemIndex = -1; break; case 'b': /* переход на предыдущий элемент */ if (ItemIndex > 0) ItemIndex--; break; case 'n': /* переход на следующий элемент */ if (ItemIndex < lpList->Count - 1) ItemIndex++; break; case 's': sort_mode(lpList); list_out(lpList); printf("\npress any key to back menu"); getch(); break; case 'f': ItemIndex = find_mode(lpList); break; case 'd': if (ItemIndex >= 0) { list_delete_index(lpList, ItemIndex); if (ItemIndex >= lpList->Count) ItemIndex = lpList->Count - 1; } break; case 'e': if (ItemIndex >= 0) { item_edit(&lpList->Items[ItemIndex]); } break; case 'a': /* добавление элемента в список */ lpItem = list_find_empty(lpList); /* поиск пустой структуры в списке */ if (lpItem) { lpList->Count++; item_in(lpItem); ItemIndex = list_index_of(lpList, lpItem); } else printf("no empty element!"); break; case 'l': /* отображаем список в виде таблицы */ list_out(lpList); printf("\npress any key to back menu"); getch(); break; case 'q': /* выход из программы */ exit(1); break; } } }