Beispiel #1
0
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;
    }
}
Beispiel #2
0
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;
    }
    }
}
Beispiel #3
0
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);
}
Beispiel #4
0
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);
    }
}
Beispiel #5
0
/* редактор списка структур */
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;
		}
	}
}