示例#1
0
int cmd_idcode(int argc, const char** argv)
{
	cable* cbl;
    chip* dev;
	int index;
	const char* param;

	// Position
	param = cmdline_get_non_opt(argc, argv, 0);
	if (param == NULL || str2num(param, &index) || index <= 0)
	{
        msgf(STR_INVALID_PARAMETERS);
		return 0;
    }

	cbl = open_cable(1);
    if (cbl == NULL)
        return 0;

    dev = select_device_in_chain(index - 1);
    if (dev)
        msgf(STR_DEVICE_IDCODE, index, dev->id);
	    
	close_cable(cbl);
	
    return 0;
}
示例#2
0
int cmd_erase(int argc, const char** argv)
{
	cable* cbl = NULL;
	int index;
	chip* dev;
	const char* param;

	// Position
	param = cmdline_get_non_opt(argc, argv, 0);
	if (param == NULL || str2num(param, &index) || index <= 0)
	{
        msgf(STR_INVALID_PARAMETERS);
		return 0;
    }
    
    cbl = open_cable(1);
    if (cbl == NULL)
        return 0;
	
    dev = select_device_in_chain(index - 1);
    if (dev == NULL)
        return -1;

	msgf(STR_ERASING, index, dev->name.c_str());
	
	if (dev->erase(cbl) == 0)
		msgf(STR_SUCCESS_COMPLETED);

	close_cable(cbl);

    return 0;
}
示例#3
0
int cmd_read(int argc, const char** argv)
{
	u8* data = NULL;
	cable* cbl;
	const char* param;
	chip* dev;
	int index, length;
	program_file* f = NULL;

	// Position
	param = cmdline_get_non_opt(argc, argv, 0);
	if (param == NULL || str2num(param, &index) || index <= 0)
	{
        msgf(STR_INVALID_PARAMETERS);
		return 0;
    }

	// File name
	param = cmdline_get_non_opt(argc, argv, 1);
	if (param == NULL)
	{
        msgf(STR_INVALID_PARAMETERS);
		return 0;
    }

    cbl = open_cable(1);
    if (cbl == NULL)
        goto cleanup;
	
    dev = select_device_in_chain(index - 1);
    if (dev == NULL)
        goto cleanup;

    msgf(STR_READING, index, dev->name.c_str());
	length = dev->readback(cbl, &data);
	if (length <= 0 || data == NULL)
		goto cleanup;

    f = create_program_file(dev, argc, argv);
	if (f == NULL)
		goto cleanup;

	if (f->save(param, data, length))
		goto cleanup;

	msgf(STR_SUCCESS_COMPLETED);
    
cleanup:

	close_cable(cbl);

	if (data)
        free(data);

    if (f)
        delete f;
    
    return 0;
}
示例#4
0
int
load(TickReq *tick,int *pntick,int nmax) {
    int ntick = *pntick;
    FILE *tickf = NULL;
    char *cp;
    char buf[256];
    int lno = 0;

    memset(tick,0,sizeof *tick * ntick);

    /*
     * Open tickers.rc file :
     */
    tickf = fopen(TICKPATH,"r");
    if ( !tickf ) {
        msgf('e',"%s: opening %s for reading",
            strerror(errno),TICKPATH);
        return -1;
    }

    /*
     * Load tickers from file :
     */
    while ( fgets(buf,sizeof buf,tickf) ) {
        ++lno;
        cp = strtick(buf);
        if ( cp - buf <= 0 ) {
            msgf('e',"Line %d: Bad ticker\n",
                lno);
            continue;
        }

        /*
         * Load one more ticker :
         */
        *cp = 0;
        strncpy(tick[ntick].ticker,
            buf, TICKLEN)[TICKLEN] = 0;
        tick[ntick].flags = 0;
        tick[ntick++].next_samp = 0;

        /*
         * Don't load beyond the array limits:
         */
        if ( ntick >= nmax ) {
            msgf('w',
                "Stopping at max of %d tickers.",
                ntick);
            break;
        }
    }

    fclose(tickf);
    msgf('i',"%d tickers loaded.",ntick);
    *pntick = ntick;    /* Return count */

    return 0;
}
示例#5
0
int process_command_line(const char* line)
{
    int argc = 0;
    char** argv = NULL;
    int i, rc = 0;
    const char* str_cmd;

    if (line == NULL)
        return 0;

	current_command_line = line;

    if (parse_cmdline_args(line, &argc, &argv) < 0)
	{
		rc = -1;
		goto cleanup;
	}

    if (argc == 0)
        goto cleanup;

    for (i = 0; commands[i].fn != NULL; i++)
    {
        str_cmd = res_str(commands[i].res_id);
        if (strcmp(str_cmd, argv[0]) == 0)
        {
            rc = commands[i].fn(argc, (const char**)argv);
            break;
        }
    }
    
    if (commands[i].fn == NULL)
    {
        msgf(STR_UNKNOWN_COMMAND);
        rc = 0;
    }
    else
    {
        switch (rc)
        {
        case CMDLINE_INVALID_PARAMETER:
            msgf(STR_INVALID_PARAMETERS);
			help(argv[0]);
            break;
        }
    }

cleanup:

    if (argv != NULL)
        free(argv);

	current_command_line = NULL;

    return rc;
}
示例#6
0
文件: psndread.c 项目: spathiwa/pacq
void setpath(char *path)
{
  short bytes;

  freepath();

  bytes=strlen(path+1);
  defpathname = (char *) AllocMem(bytes,0);

  msgf("Path len %d\n",bytes-1);

  strcpy(defpathname, path);

  msgf("New path: %s\n",defpathname);
}
int target_set_medium(target_context_t *tc, const char *medium)
{
	char cmdbuf [CMDBUF_LENGTH];

	msgf("setting medium to %s\n", medium);

#ifndef WIN32
	/* if medium is Ethernet, negotiate remote MAC before switching */
	if (!strcmp(medium, TM_ETHERNET))
		if(target_negotiate_mac(tc) == -1){
			return -1;
		}
#endif

	snprintf(cmdbuf, sizeof cmdbuf, "medium %s", medium);
	target_write_command(tc, cmdbuf);
	if(target_confirm_response(tc) == -1){
		return -1;
	}
	if (!strcmp(medium, TM_ETHERNET)) {
		tc->mtu = ETHERNET_MTU;
#ifndef WIN32
		tc->write = target_write_ethernet;
#endif
	} else if (!strcmp(medium, TM_SERIAL)) {
		tc->mtu = SERIAL_MTU;
		tc->write = target_write_serial;
	} else{
		panicf("unknown medium: %s", medium);
		return -1;
	}
	tc->medium = medium;
	return 0;
}
示例#8
0
int enable_user_mode_io()
{
#if defined(WIN32) && !defined(__CYGWIN__)
    HANDLE h;
    
	h = CreateFile(
            "\\\\.\\giveio",
            GENERIC_READ,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    if (h != INVALID_HANDLE_VALUE)
    {
        // Giveio activated successfully
        CloseHandle(h);
        return 0;
    }
#else
    if (iopl(3) == 0)
        // Success
        return 0;
#endif

    msgf(STR_ENABLE_USERMODE_IO_ERROR);
    return -1;
}
static int target_get_mac(target_context_t *tc)
{
	char buf [LINE_LENGTH];

	/* read MAC address from target */
	msg("getting target MAC\n");
	target_write_command(tc, "mac");
	target_gets(tc, buf, sizeof buf);
	if(target_confirm_response(tc) == -1){
		return -1;
	}

	/* and parse it */
	msgf("target-provided remote MAC: %s", buf);
	if (parsemac(tc->remote_mac, buf)){
		panicf("can't parse target-provided remote MAC: %s", buf);
		return -1;
	}
	if (opt_verbose) {
		msg("target-provided remote MAC (parsed): ");
		printmac(stdout, tc->remote_mac);
		msg("\n");
	}
	return 0;
}
示例#10
0
void qmail_finish(const char* sender)
{
  int status;

  close(msgfd);
  if(waitpid(inject_pid, &status, WUNTRACED) == -1)
    fail_temp("Failed to catch exit status of qmail-inject");
  if(!WIFEXITED(status))
    fail_temp("qmail-inject crashed");
  if(WEXITSTATUS(status))
    fail_temp("qmail-inject failed");

  write_envelope(sender);
  close(envfd);

  if(waitpid(queue_pid, &status, WUNTRACED) == -1)
    fail_temp("Failed to catch exit status of qmail-queue");
  if(!WIFEXITED(status))
    fail_temp("qmail-queue crashed");
  if(WEXITSTATUS(status))
    fail_temp("qmail-queue failed");

  if (!opt_quiet)
    msgf("{Sent response qp }d", queue_pid);
}
示例#11
0
int cmd_cable(int argc, const char** argv)
{
    cable* cbl;
	int i;
    string desc, cable_def;
    
    if (argc > 1)
	{
		for (i = 1; i < argc; i++)
        {
            cable_def += argv[i];
            if (i + 1 < argc)
                cable_def += ' ';
        }

		g.vars[strCABLE] = cable_def;
	}
	else
	{
		if (g.vars.get(strCABLE, cable_def))
		{
            msgf(STR_INVALID_CABLE_DEF);
			return -1;
		}
	}

    cbl = cable::factory(cable_def.c_str());
    if (cbl == NULL)
        return 0;

    cbl->get_description(desc);
    //msgf(STR_SELECTED_CABLE, desc.c_str());

    return 0;
}
示例#12
0
cable* open_cable(int detect)
{
    cable* cbl;
    string desc, cable_def;

	if (g.vars.get(strCABLE, cable_def))
	{
		msgf(STR_INVALID_CABLE_DEF);
		return NULL;
	}

    cbl = cable::factory(cable_def.c_str());
    if (cbl == NULL)
        return NULL;

    cbl->get_description(desc);
    //msgf(STR_OPENING, desc.c_str());

    if (cbl->open())
    {
        delete cbl;
        return NULL;
    }

    if (detect)
        cbl->detect_chain();

    return cbl;
}
示例#13
0
int cable::detect_chain()
{
    u32 id;
    vector<u32> ids;
	bool unknown = false;
	unsigned int i;
	chip* dev;
	string desc;

	g.dev_chain.clear();

	msgf(STR_IDENTIFY_CHAIN);

	detect_chain_ids(ids);
		
	for (i = 1; i <= ids.size(); i++)
    {
		id = ids[ids.size() - i];
		dev = g.chips.find_chip(id);
		if (dev && dev->family)
		{
			g.dev_chain.push_back(device_chain_item(id, dev));

            dev->family->vars.get(strDESC, desc);
			printf("\'%d\' %s %s\n", i, dev->name.c_str(), desc.c_str());
		}
		else
		{
            msgf(STR_UNKNOWN_DEVICE_IDCODE, i, id);
			unknown = true;
		}
    }

    if (unknown)
     {
		g.dev_chain.clear();
        msgf(STR_UNKNOWN_DEVICES);
        return -1;
	}

	if (g.sel_dev >= (int)g.dev_chain.size())
	    g.sel_dev = 0;

    msgf(STR_DEVICES_FOUND, g.dev_chain.size());
    
    return g.dev_chain.size();
}
示例#14
0
int bin_file::load(const char* name)
{
    FILE *f;
	struct stat st;
    int rc = -1;
    
    if (data || length)
        // Call clear() first
        return -1;

    if (stat(name, &st) < 0)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}
    
    f = fopen(name, "rb");
    if (f == NULL)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}

	// File length
	length = st.st_size;
	data = (u8*)malloc(length);
	if (data == NULL)
		goto cleanup;

	if (fread(data, 1, length, f) != length)
	{
		msgf(STR_INVALID_FILE_FORMAT);
		goto cleanup;
	}

	rc = 0;

cleanup:

	if (rc)
		clear();

	if (f)
		fclose(f);

    return rc;
}
void mem_map_read_from_file(target_context_t *tc,
			    const char *pathname)
{
	msgf("reading memory map from file %s\n", pathname);
	region_destroy(tc->memmap);
	tc->memmap = NULL;
	per_line(pathname, &mem_map_add_iter, tc);
}
示例#16
0
chip* select_device_in_chain(int index)
{
    if (index >= (int)g.dev_chain.size())
    {
        msgf(STR_INVALID_DEVICE);
        return NULL;
    }

    g.sel_dev = index;
	return  g.dev_chain[index].dev;
}
示例#17
0
文件: psndread.c 项目: spathiwa/pacq
int getIFF(char *filename, struct svx_info *info)
{
  int file;
  short bytes;
  char *fullname;

  msg("Going to malloc for fullname\n");

  bytes= strlen(defpathname)+strlen(filename)+1;

  fullname = (char *) AllocMem(bytes,0);
  /* *fullname = 0; */

  msgf("Path: %s\n",defpathname);
  msgf("Filename: %s\n",filename);
  
  strcpy(fullname, defpathname);
  strcat(fullname, filename);
  
  msgf("Loading %s...\n",fullname);

  if ((file = open(fullname, O_RDONLY,0)) == -1)
  {
    printerror("Can't open file");
    FreeMem(fullname,bytes);
    return (-1);
  }
    
  FreeMem(fullname,bytes);
  
  switch (getID(file))
  {
    case ID_FORM: getFORM(file,info); break;
    case ID_CAT:  getCAT(file);  break;
    case ID_LIST: getLIST(file); break;

    default: NotIFF(file);
  }
  close(file);
  return 0;
}
void target_per_line(target_context_t *tc, iter_func_t *func, void *arg)
{
	char buf [LINE_LENGTH];

	assert(tc);
	assert(func);
	while (1) {
		target_gets(tc, buf, sizeof buf);	/* XXX handle error */
		msgf("read line from target: %s", buf);
		if (ok_or_ng(buf))
			break;
		if (func(buf, arg) < 0)
			break;
	}
}
示例#19
0
cable* cable::factory(const char* s)
{
    cable* cbl = NULL;
    int argc;
    char** argv = NULL;
    int addr;

    if (*s == 0)
        return NULL;

    parse_cmdline_args(s, &argc, &argv);

    if (argc == 0)
        return NULL;

    if (stricmp(argv[0], "xil3") == 0) {
        if (argc == 1)
            addr = 0x378;
        else {
            if (str2num(argv[1], &addr))
                goto cleanup;
        }
        
        cbl = new parport((unsigned int)addr);
    }
    else if (stricmp(argv[0], "dusb") == 0)
        cbl = new digilent;
    else if (stricmp(argv[0],"znuhtag") == 0) {
	    int num=0;
	    if(argc > 1)
		    str2num(argv[1], &num);
	cbl = new znuhtag(num);
    }
    else if (stricmp(argv[0],"amontec") == 0) {
	    int speed = 0;
	    if (argc > 1)
		    str2num(argv[1], &speed);
	cbl = new amontec(speed);
    }
    else {
        msgf(STR_INVALID_CABLE_DEF);
        return NULL;
    }

cleanup:

    return cbl;
}
示例#20
0
int mcs_file::save(const char* file, void* data, int len)
{
	FILE* f;
	int rc = -1;
    int addr, addr_offs, count;
	const int buff_len = 16;
	union {
		u8 buff[buff_len];
		u16 word;
	} u;

	f = fopen(file, "wt");
	if (f == NULL)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
		return -1;
	}

    addr = 0;
    addr_offs = 0;
    
    u.word = 0x0000;
    if (write_record(f, 2, 0, RECORD_ADDRESS, u.buff))
        goto cleanup;
    
    while (addr_offs + addr < len)
    {
        if (addr_offs + addr + buff_len < len)
            count = buff_len;
        else
            count = len - addr_offs - addr;

        if (write_record(f, count, addr, RECORD_DATA, (u8*)data + addr_offs + addr))
            goto cleanup;

        addr += count;

        if (addr >= 0x10000 && addr_offs + addr < len)
        {
            addr_offs += 0x10000;
            addr &= 0xFFFF;
            u.word = HTON16(addr_offs >> 16);
            if (write_record(f, 2, 0, RECORD_ADDRESS, u.buff))
                goto cleanup;
        }
    }
示例#21
0
int cmd_cd(int argc, const char** argv)
{
    char dir[256] = "";

    if (argc == 2)
    {
        if (set_current_directory(argv[1]))
            msgf(STR_CHDIR_ERROR);
    }
    else
    {
        if (get_current_directory(dir, sizeof(dir)) == 0)
            printf("%s\n", dir);
    }
    
    return 0;
}
static int target_set_mac(target_context_t *tc, const unsigned char *mac)
{
	char buf [CMDBUF_LENGTH];

	/* set MAC address on target */
	strcpy(buf, "mac ");
	sprintmac(buf + 4, mac);
	msgf("setting target MAC to `%s'\n", buf + 4);
	target_write_command(tc, buf);
	if(target_confirm_response(tc) == -1){
		return -1;
	}
	
	/* update our local copy on success */
	memcpy(tc->remote_mac, mac, 6);
	return 0;
}
int target_retry_command_and_data(target_context_t *tc,
				   const char *command,
				   const void *data, size_t count)
{
	int retries = 3;

	while (retries--) {
		msgf("trying command/data (retries = %d)\n", retries);
		target_write_command(tc, command);
		if (target_get_response(tc))
			continue;
		target_write_data(tc, data, count);
		if (target_get_response(tc) == 0)
			return 0;
	}
	panic("command/data write retry count exceeded.");
	return -1;
}
void target_write_command(target_context_t *tc, const char *command)
{
	char buf [MAX_COMMAND_LENGTH + 1];
	size_t len;

	assert(tc);
	assert(command);
	assert(strlen(command) < sizeof buf - 2);

	/* tack '\n' onto the end of the command */
	len = strlen(command);
	memcpy(buf, command, len);
	buf[len++] = '\n';
	buf[len] = '\0';
	msgf("writing command: %s", buf);
	assert(tc->write);
	tc->write(tc, buf, len);
}
示例#25
0
int help(const char* cmd)
{
    int i;
    const char* str_cmd = NULL;
    const char* str_help = NULL;
    const char* str_usage = NULL;

    if (cmd == NULL)
    {
        printf("%s:\n\n", res_str(STR_HELP));
        for (i = 0; commands[i].fn != NULL; i++)
        {
            str_cmd = res_str(commands[i].res_id);
            str_help = str_cmd + strlen(str_cmd) + 1;

            printf("%-20s %s\n", str_cmd, str_help);
        }
        printf("\n");
    }
    else
    {
        for (i = 0; commands[i].fn != NULL; i++)
        {
            str_cmd = res_str(commands[i].res_id);
            if (strcmp(str_cmd, cmd) == 0)
            {
                str_help = str_cmd + strlen(str_cmd) + 1;
                str_usage = str_help + strlen(str_help) + 1;
                break;
            }
        }

        if (commands[i].fn != NULL)
			printf("%s\n\n%s\n", str_help, str_usage);
        else
            msgf(STR_UNKNOWN_COMMAND);
    }
    return 0;
}
示例#26
0
int bin_file::save(const char* file, void* data, int len)
{
	FILE* f;
	int rc = -1;

	f = fopen(file, "wb");
	if (f == NULL)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
		return -1;
	}

	if (fwrite(data, len, 1, f) != (size_t)len)
		goto cleanup;

	rc = 0;

cleanup:

	fclose(f);

	return rc;
}
示例#27
0
int context_menu_cave(int cy, int cx, int adjacent, int mx, int my)
{
	menu_type *m;
	rect_region r;
	int selected;
	char *labels;

	cave_type *c_ptr = area(cx,cy);
	pcave_type *pc_ptr = parea(cx,cy);
	feature_type *feat;
	object_type *o_ptr;

	/* paranoia */
	if (!in_boundsp(cx,cy)) return 0;

	m = menu_dynamic_new();
	if (!m) {
		return 0;
	}

	labels = (char*)string_make(lower_case);
	m->selections = labels;

	feat  = &(f_info[c_ptr->feat]);

	menu_dynamic_add_label(m, "Look At", 'l', 1, labels);
	if (c_ptr->m_idx) {
		menu_dynamic_add_label(m, "Recall Info", '/', 18, labels);
	}
	menu_dynamic_add_label(m, "Use Item On", 'u', 2, labels);
	if (player_can_cast()) {
		menu_dynamic_add_label(m, "Cast On", 'm', 3, labels);
	}
	if (adjacent) {
		if (c_ptr->m_idx && m_list[c_ptr->m_idx].ml) {
			menu_dynamic_add_label(m, "Attack", '+', 4, labels);
		} else {
			menu_dynamic_add_label(m, "Alter", '+', 4, labels);
		}
		if (c_ptr->o_idx) {
			o_ptr = chest_check(cx,cy);
			if (o_ptr && o_ptr->pval) {
				//if (!squelch_item_ok(o_ptr)) {
					if (object_known_p(o_ptr)) {
						if (chest_traps[o_ptr->pval]) {
							menu_dynamic_add_label(m, "Disarm Chest", 'D', 5, labels);
							menu_dynamic_add_label(m, "Open Chest", 'o', 8, labels);
						} else {
							menu_dynamic_add_label(m, "Open Disarmed Chest", 'o', 8, labels);
						}
					} else {
						menu_dynamic_add_label(m, "Open Chest", 'o', 8, labels);
					}
				//}
			}
		}
		if (is_visible_trap(c_ptr)) {
			menu_dynamic_add_label(m, "Disarm", 'D', 5, labels);
			menu_dynamic_add_label(m, "Jump Onto", 'W', 6, labels);
		}
		if (pc_ptr->feat) {
			if ((feat->flags & FF_CLOSEABLE)
				|| ((feat->flags & FF_BROKEN) && (feat->flags & FF_DOOR)))
			{
				menu_dynamic_add_label(m, "Close", 'c', 7, labels);
			}
			if (feat->flags & FF_CLOSED) {
				menu_dynamic_add_label(m, "Open", 'o', 8, labels);
				menu_dynamic_add_label(m, "Bash Open", 'B', 9, labels);
				menu_dynamic_add_label(m, "Lock", 'D', 5, labels);
				menu_dynamic_add_label(m, "Jam", 'j', 10, labels);
			}
			if (feat->flags & FF_DIG) {
				menu_dynamic_add_label(m, "Tunnel", 'T', 11, labels);
			}
		}
		menu_dynamic_add_label(m, "Search", 's', 12, labels);
		menu_dynamic_add_label(m, "Walk Towards", ';', 14, labels);
	} else {
		menu_dynamic_add_label(m, "Pathfind To", ',', 13, labels);
		menu_dynamic_add_label(m, "Walk Towards", ';', 14, labels);
		menu_dynamic_add_label(m, "Run Towards", '.', 15, labels);
	}
	if (player_can_fire()) {
		menu_dynamic_add_label(m, "Fire On", 'f', 16, labels);
	}
	if (c_ptr->m_idx && m_list[c_ptr->m_idx].ml) {
		if (is_pet(&(m_list[c_ptr->m_idx]))) {
			menu_dynamic_add_label(m, "Pet Commands", 'p', 19, labels);
		}
	}
	menu_dynamic_add_label(m, "Throw To", 'v', 17, labels);

	/* work out display region */
	r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */
	if (mx > Term->wid - r.width - 1) {
		r.col = Term->wid - r.width - 1;
	} else {
		r.col = mx + 1;
	}
	r.page_rows = m->count;
	if (my > Term->hgt - r.page_rows - 1) {
		if (my - r.page_rows - 1 <= 0) {
			/* menu has too many items, so put in upper right corner */
			r.row = 1;
			r.col = Term->wid - r.width - 1;
		} else {
			r.row = Term->hgt - r.page_rows - 1;
		}
	} else {
		r.row = my + 1;
	}

	/* Hack -- no flush needed */
	msg_flag = FALSE;

	screen_save();
	button_backup_all(TRUE);

	/* if there is a monster, draw a target path, which will be erased by the
	 * screen load below */
	if (c_ptr->m_idx && m_list[c_ptr->m_idx].ml) {
		sint path_n;
		coord path_g[2*MAX_RANGE+1];

		/* Find the path. */
		path_n = project_path(path_g, p_ptr->px, p_ptr->py, cx, cy, PROJECT_THRU);
		/* Draw the path. */
		draw_path(path_n, path_g, NULL, NULL, p_ptr->px, p_ptr->py);
	}

	menu_layout(m, &r);
	rect_region_erase_bordered(&r);

	/* display the prompt for the context menu */
	target_look_grid_prompt(0, 0, cx, cy,
		format("($UEnter to select command$Y\n$V, $UESC$ to cancel$Y%c$V) You see", ESCAPE));

	/* Hack - redraw stuff to show the target health bar */
	health_redraw();

	/* show the menu and pick from it */
	selected = menu_dynamic_select(m);

	menu_dynamic_free(m);
	string_free(labels);

	button_restore();
	screen_load();

	if (selected == 1) {
		/* look at the spot */
		if (target_set_interactive(TARGET_LOOK, cx, cy)) {
			msgf("Target Selected.");
		}
	} else
	if (selected == 2) {
		/* use an item on the spot */
		p_ptr->cmd.dir = 5;
		p_ptr->cmd.cmd = 'u';
		repeat_check();
		do_cmd_use();
		/*cmd_insert(CMD_USE_AIMED);
		cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET);*/
	} else
	if (selected == 3) {
		/* cast a spell on the spot */
		p_ptr->cmd.dir = 5;
		p_ptr->cmd.cmd = 'm';
		repeat_check();
		do_cmd_cast_wrapper();
		/*if (textui_obj_cast_ret() >= 0) {
			cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET);
		}*/
	} else
	if (selected == 4) {
		/* attack a spot adjacent to the player */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.arg = 16;
		p_ptr->cmd.cmd = '+';
		repeat_check();
		do_cmd_alter();
		/*cmd_insert(CMD_ALTER);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 5) {
		/* disarm an adjacent trap or chest */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.arg = 1;
		p_ptr->cmd.cmd = 'D';
		repeat_check();
		do_cmd_disarm();
		/*cmd_insert(CMD_DISARM);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 6) {
		/* walk onto an adjacent spot even if there is a trap there */
		bool orig_disarm = easy_disarm;
		easy_disarm = always_pickup;
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.arg = 1;
		p_ptr->cmd.cmd = 'W';
		repeat_check();
		do_cmd_walk(always_pickup);
		easy_disarm = orig_disarm;
		/*cmd_insert(CMD_JUMP);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 7) {
		/* close a door */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		/*p_ptr->cmd.arg = 1;*/
		p_ptr->cmd.cmd = 'c';
		repeat_check();
		do_cmd_close();
		/*cmd_insert(CMD_CLOSE);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 8) {
		/* open a door or chest */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		/*p_ptr->cmd.arg = 1;*/
		p_ptr->cmd.cmd = 'o';
		repeat_check();
		do_cmd_open();
		/*cmd_insert(CMD_OPEN);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 9) {
		/* bash a door */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		/*p_ptr->cmd.arg = 1;*/
		p_ptr->cmd.cmd = 'o';
		repeat_check();
		do_cmd_open();
		/*p_ptr->cmd.cmd = 'B';
		do_cmd_bash();*/
		/*cmd_insert(CMD_BASH);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 10) {
		/* jam a door */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		/*p_ptr->cmd.arg = 1;*/
		p_ptr->cmd.cmd = 'j';
		repeat_check();
		do_cmd_spike();
		/*cmd_insert(CMD_JAM);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 11) {
		/* Tunnel in a direction */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.arg = 16;
		p_ptr->cmd.cmd = 'T';
		repeat_check();
		do_cmd_tunnel();
		/*cmd_insert(CMD_TUNNEL);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 12) {
		/* Search */
		/*p_ptr->cmd.arg = 1;*/
		p_ptr->cmd.cmd = 's';
		repeat_check();
		do_cmd_search();
		/*cmd_insert(CMD_SEARCH);*/
	} else
	if (selected == 13) {
		/* pathfind to the spot */
		/*p_ptr->cmd.arg = 16;*/
		p_ptr->cmd.cmd = ',';
		do_cmd_pathfind(cx,cy);
		/*cmd_insert(CMD_PATHFIND);
		cmd_set_arg_point(cmd_get_top(), 0, cx, cy);*/
	} else
	if (selected == 14) {
		/* walk towards the spot */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.cmd = ';';
		repeat_check();
		do_cmd_walk(always_pickup);
		/*cmd_insert(CMD_WALK);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 15) {
		/* run towards the spot */
		p_ptr->cmd.dir = coords_to_dir(cx, cy);
		p_ptr->cmd.cmd = '.';
		repeat_check();
		do_cmd_run();
		/*cmd_insert(CMD_RUN);
		cmd_set_arg_direction(cmd_get_top(), 0, coords_to_dir(cy,cx));*/
	} else
	if (selected == 16) {
		/* Fire ammo towards the spot */
		p_ptr->cmd.dir = 5;
		p_ptr->cmd.cmd = 'f';
		repeat_check();
		do_cmd_fire();
		/*cmd_insert(CMD_FIRE);
		cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET);*/
	} else
	if (selected == 17) {
		/* throw an item towards the spot */
		p_ptr->cmd.dir = 5;
		p_ptr->cmd.cmd = 'v';
		repeat_check();
		do_cmd_throw();
		/*cmd_insert(CMD_THROW);
 		cmd_set_arg_target(cmd_get_top(), 1, DIR_TARGET);*/
	} else
	if (selected == 18) {
		/* recall monster Info */
		monster_type *m_ptr = &m_list[c_ptr->m_idx];
		if (m_ptr) {

			/* Save screen */
			screen_save();
			button_backup_all(TRUE);

			/* Recall on screen */
			screen_roff_mon(m_ptr->r_idx, 0);

			/* wait for a key or mouse press */
			inkey();

			/* Load screen */
			button_restore();
			screen_load();
		}
	} else
	if (selected == 19) {
		/* issue a pet command */
		p_ptr->cmd.cmd = 'p';
		repeat_check();
		do_cmd_pet();
	}

	return 1;
}
示例#28
0
int context_menu_player(int mx, int my)
{
	menu_type *m;
	rect_region r;
	int selected;
	char *labels;

	cave_type *c_ptr = area(p_ptr->px,p_ptr->py);
	pcave_type *pc_ptr = parea(p_ptr->px,p_ptr->py);
	feature_type *feat;

	m = menu_dynamic_new();
	if (!m) {
		return 0;
	}

	labels = (char*)string_make(lower_case);
	m->selections = labels;

	feat  = &(f_info[c_ptr->feat]);

	menu_dynamic_add_label(m, "Use Item", 'u', 1, labels);
	/* if player can cast, add casting option */
	if (player_is_caster()) {
		if (player_can_cast()) {
			menu_dynamic_add_label(m, "Cast", 'm', 2, labels);
		} else {
			menu_dynamic_add_label(m, "$Cast", 'm', 2, labels);
		}
	}
	/* if player can use racial powers or mutations, add option */
	if (player_has_power()) {
		if (player_can_use_power()) {
			menu_dynamic_add_label(m, "Use Power", 'U', 16, labels);
		} else {
			menu_dynamic_add_label(m, "$Use Power", 'U', 16, labels);
		}
	}
	/* if player is on stairs add option to use them */
	if (feat->flags & FF_EXIT_UP) {
		menu_dynamic_add_label(m, "Go Up", '<', 11, labels);
	}
	if (feat->flags & FF_EXIT_DOWN) {
		menu_dynamic_add_label(m, "Go Down", '>', 12, labels);
	}
	menu_dynamic_add_label(m, "Search", 's', 3, labels);
	menu_dynamic_add_label(m, "Look", 'l', 6, labels);
	menu_dynamic_add_label(m, "Rest", 'R', 4, labels);
	menu_dynamic_add_label(m, "Inventory", 'i', 5, labels);
	/* if object under player add pickup option */
	if (c_ptr->o_idx) {
		object_type *o_ptr = &(o_list[c_ptr->o_idx]);
		//if (!squelch_item_ok(o_ptr)) {
  			menu_dynamic_add_label(m, "Floor", 'i', 13, labels);
			if (inven_carry_okay(o_ptr)) {
  				menu_dynamic_add_label(m, "Pickup", 'g', 14, labels);
			} else {
  				menu_dynamic_add_label(m, "$Pickup", 'g', 14, labels);
			}
		//}
	}
	menu_dynamic_add_label(m, "Character", 'C', 7, labels);
	/* XXX Don't show the keymap line until the keymap list is implemented, to
	 * avoid confusion as to what should be there */
	/*menu_dynamic_add(m, "Keymaps", 10);*/
	if (!OPT(center_player)) {
		menu_dynamic_add_label(m, "^Center Map", 'L', 15, labels);
	}
	menu_dynamic_add_label(m, "Other", ' ', 9, labels);

	/* work out display region */
	r.width = menu_dynamic_longest_entry(m) + 3 + 2; /* +3 for tag, 2 for pad */
	if (mx > Term->wid - r.width - 1) {
		r.col = Term->wid - r.width - 1;
	} else {
		r.col = mx + 1;
	}
	r.page_rows = m->count;
	if (my > Term->hgt - r.page_rows - 1) {
		if (my - r.page_rows - 1 <= 0) {
			/* menu has too many items, so put in upper right corner */
			r.row = 1;
			r.col = Term->wid - r.width - 1;
		} else {
			r.row = Term->hgt - r.page_rows - 1;
		}
	} else {
		r.row = my + 1;
	}

	/* Hack -- no flush needed */
	msg_flag = FALSE;

	screen_save();
	button_backup_all(TRUE);

	menu_layout(m, &r);
	rect_region_erase_bordered(&r);

	prtf(0, 0, "($UEnter to select$Y\n$V, $UESC$Y%c$V) Command:", ESCAPE);
	selected = menu_dynamic_select(m);

	menu_dynamic_free(m);
	string_free(labels);

	button_restore();
	screen_load();

	switch(selected) {
	case 1:
		{
			/* use an item */
			p_ptr->cmd.cmd = 'u';
			repeat_check();
			do_cmd_use();
		} break;
	case 2:
		{
			/* Cast a spell */
			p_ptr->cmd.cmd = 'm';
			repeat_check();
			do_cmd_cast_wrapper();
		} break;
	case 3:
		{
			/* search */
			p_ptr->cmd.cmd = 's';
			repeat_check();
			do_cmd_search();
		} break;
	case 4:
		{
			/* rest */
			p_ptr->cmd.cmd = 'R';
			repeat_check();
			do_cmd_rest();
		} break;
	case 5:
		{
			/* show inventory screen */
			Term_keypress('i');//,0);
		} break;
	case 6:
		{
			/* look mode */
			if (target_set(TARGET_LOOK)) {
			//if (target_set_interactive(TARGET_LOOK, p_ptr->px, p_ptr->py)) {
				msgf("Target Selected.");
			}
		} break;
	case 7:
		{
			/* show character screen */
			do_cmd_character();
		} break;
	case 9:
		{
			/* show another layer of menu options screen */
			int res;
			while ((res = context_menu_player_2(mx,my)) == 3);
			if (res == 2) return 3;
		} break;
	case 10:
		{
			/* show the commands */
			int res;
			while ((res = context_menu_command(mx,my)) == 3);
			if (res == 2) return 3;
		} break;
	case 11:
		{
			/* go up stairs */
			p_ptr->cmd.cmd = '<';
			repeat_check();
			do_cmd_go_up();
		} break;
	case 12:
		{
			/* go down stairs */
			p_ptr->cmd.cmd = '>';
			repeat_check();
			do_cmd_go_down();
		} break;
	case 13:
		{
			if (c_ptr->o_idx) {
				object_type *o_ptr = &(o_list[c_ptr->o_idx]);
				/* there is an item on the floor, show the inventory screen starting
				 * from the floor */
				if (o_ptr->next_o_idx) {
					do_cmd_inven_floor();
				} else {
					/* if  we only have one item, show the context menu directly */
					if (o_ptr->k_idx) {
						/* Track the object kind */
						object_kind_track(o_ptr->k_idx);

						while (context_menu_object(o_ptr) == 2);
					}
				}
			}
		} break;
	case 14:
		{
			/* pick the item up */
			//cmd_insert(CMD_PICKUP);
			//cmd_set_arg_item(cmd_get_top(), 0, -1);
			carry(TRUE);
		} break;
	case 15:
		{
			/* center the map on the player */
			/*panel_center(p_ptr->px, p_ptr->py);*/
			do_cmd_center_map();
		} break;
	case 16:
		{
			/* use character powers */
			p_ptr->cmd.cmd = 'U';
			repeat_check();
			do_cmd_racial_power();
		} break;

	}

	return 1;
}
示例#29
0
int program_file::save(const char*, void*, int)
{
    msgf(STR_INVALID_FILE_FORMAT);
	return -1;
}
示例#30
0
int mcs_file::load(const char* name)
{
    FILE *f;
    int rc = -1;
    char line[256];
	struct stat st;
	int len, type, addr;
	unsigned char buff[64];
	int addr_offs = 0;
	u32 max_length;

    if (data || length)
        // Call clear() first
        return -1;

	if (stat(name, &st) < 0)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}
    
    f = fopen(name, "rt");
    if (f == NULL)
	{
		msgf(STR_UNABLE_TO_OPEN_FILE);
        return -1;
	}

	// This size must be enough!
	max_length = st.st_size / 2;
	data = (u8*)malloc(max_length);
	if (data == NULL)
		goto cleanup;

	memset(data, 0xFF, max_length);
	length = 0;
  
    // Read lines
    while(!feof(f))
    {
        if (fgets(line, sizeof(line), f) == NULL)
			break;

		strip_whitespaces(line);

		if (parse_record(line, &len, &addr, &type, buff, sizeof(buff)))
		{
			msgf(STR_INVALID_FILE_FORMAT);
			goto cleanup;
		}

		if (type == RECORD_DATA)
		{
			if ((u32)(addr_offs + addr + len) > max_length)
			{
				msgf(STR_INVALID_FILE_FORMAT);
				goto cleanup;
			}
			
			memcpy(data + addr_offs + addr, buff, len);
			
			if ((u32)(addr_offs + addr + len) > length)
				length = (u32)(addr_offs + addr + len);
		}
		else
		if (type == RECORD_ADDRESS)
			addr_offs = (buff[0] << 24) + (buff[1] << 16);
		else
		if (type == RECORD_EOF)
			// EOF
			break;
    }

	rc = 0;

cleanup:

	if (rc)
		clear();

    if (f)
        fclose(f);

    return rc;
}