src/message.c
author ali@juiblex.co.uk
Mon Jan 29 20:22:01 2007 +0000 (2007-01-29)
changeset 0 acc07f1f4b1e
permissions -rw-r--r--
Initial check-in. Mostly sort of works. Ish.
ali@0
     1
/*
ali@0
     2
 * $Id: message.c,v 1.5 2004/12/30 09:07:47 ali Exp $
ali@0
     3
 * Copyright (C) 2007 J. Ali Harlow
ali@0
     4
 * Min Hack may be freely redistributed.  See license for details. 
ali@0
     5
 */
ali@0
     6
ali@0
     7
#include <stdlib.h>
ali@0
     8
#include <stdio.h>
ali@0
     9
#include <string.h>
ali@0
    10
#include "minhack.h"
ali@0
    11
ali@0
    12
char minhack_yn_function(const char *ques, const char *choices, char def,
ali@0
    13
  int *count)
ali@0
    14
{
ali@0
    15
    int i,x,ch,n=0,cnt=0;
ali@0
    16
    waddstr(windows[message_win].win,ques);
ali@0
    17
    if (*choices)
ali@0
    18
    {
ali@0
    19
	waddstr(windows[message_win].win," [");
ali@0
    20
	for(i=0;choices[i] && choices[i]!='\033';i++)
ali@0
    21
	    waddch(windows[message_win].win,choices[i]);
ali@0
    22
	waddstr(windows[message_win].win,"] ");
ali@0
    23
	if (def)
ali@0
    24
	{
ali@0
    25
	    char buf[5];
ali@0
    26
	    sprintf(buf,"(%c) ",def);
ali@0
    27
	    waddstr(windows[message_win].win,buf);
ali@0
    28
	}
ali@0
    29
	wclrtoeol(windows[message_win].win);
ali@0
    30
	getyx(windows[message_win].win,i,x);
ali@0
    31
	for(;;)
ali@0
    32
	{
ali@0
    33
	    ch=wgetch(windows[message_win].win);
ali@0
    34
	    switch(ch)
ali@0
    35
	    {
ali@0
    36
		case '\033':
ali@0
    37
		    if (strchr(choices,'q'))
ali@0
    38
			return 'q';
ali@0
    39
		    else if (strchr(choices,'n'))
ali@0
    40
			return 'n';
ali@0
    41
		    else
ali@0
    42
			return def;
ali@0
    43
		    break;
ali@0
    44
		case ' ':
ali@0
    45
		case '\r':
ali@0
    46
		case '\n':
ali@0
    47
		    return def;
ali@0
    48
		    break;
ali@0
    49
		default:
ali@0
    50
		    if (strchr(choices,'#') && strchr("0123456789",ch))
ali@0
    51
		    {
ali@0
    52
			waddch(windows[message_win].win,ch);
ali@0
    53
			n++;
ali@0
    54
			cnt*=10;
ali@0
    55
			cnt+=ch-'0';
ali@0
    56
		    }
ali@0
    57
		    else if (strchr(choices,ch))
ali@0
    58
		    {
ali@0
    59
			if (n)
ali@0
    60
			    *count=cnt;
ali@0
    61
			return ch;
ali@0
    62
		    }
ali@0
    63
		    else if (cnt && (ch=='\b' || ch==127))
ali@0
    64
		    {
ali@0
    65
			n--;
ali@0
    66
			wmove(windows[message_win].win,0,n+x);
ali@0
    67
			wclrtoeol(windows[message_win].win);
ali@0
    68
			cnt/=10;
ali@0
    69
		    }
ali@0
    70
		    break;
ali@0
    71
	    }
ali@0
    72
	}
ali@0
    73
    }
ali@0
    74
    else
ali@0
    75
	return wgetch(windows[message_win].win);
ali@0
    76
}
ali@0
    77
ali@0
    78
char *minhack_getlin(const char *query)
ali@0
    79
{
ali@0
    80
    int ch,n=0,x,i,j;
ali@0
    81
    static char line[80];
ali@0
    82
    nhproxy_cb_flush_screen();
ali@0
    83
    minhack_putstr(message_win,0,query);
ali@0
    84
    wclrtoeol(windows[message_win].win);
ali@0
    85
    getyx(windows[message_win].win,i,x);
ali@0
    86
    for(;;)
ali@0
    87
    {
ali@0
    88
	ch=wgetch(windows[message_win].win);
ali@0
    89
	if (ch>=' ' && ch<='~' && n<sizeof(line)-1)
ali@0
    90
	{
ali@0
    91
	    waddch(windows[message_win].win,ch);
ali@0
    92
	    line[n++]=ch;
ali@0
    93
	}
ali@0
    94
	else if (n && (ch=='\b' || ch==127))
ali@0
    95
	{
ali@0
    96
	    n--;
ali@0
    97
	    wmove(windows[message_win].win,0,n+x);
ali@0
    98
	    wclrtoeol(windows[message_win].win);
ali@0
    99
	}
ali@0
   100
	else if (ch=='\n' || ch=='\r')
ali@0
   101
	{
ali@0
   102
	    line[n]='\0';
ali@0
   103
	    return line;
ali@0
   104
	}
ali@0
   105
	else if (ch=='\033')
ali@0
   106
	{
ali@0
   107
	    line[0]='\033';
ali@0
   108
	    line[1]='\0';
ali@0
   109
	    return line;
ali@0
   110
	}
ali@0
   111
    }
ali@0
   112
}
ali@0
   113
ali@0
   114
int minhack_get_ext_cmd(void)
ali@0
   115
{
ali@0
   116
    int i,cmd=-1;
ali@0
   117
    char *line;
ali@0
   118
    struct nhproxy_cb_get_extended_commands_res *commands;
ali@0
   119
    commands=nhproxy_cb_get_extended_commands();
ali@0
   120
    line=minhack_getlin("# ");
ali@0
   121
    for(i=0;i<commands->n_commands;i++)
ali@0
   122
	if (!strcmp(commands->commands[i],line))
ali@0
   123
	{
ali@0
   124
	    cmd=i;
ali@0
   125
	    break;
ali@0
   126
	}
ali@0
   127
    nhproxy_cb_free_extended_commands(commands);
ali@0
   128
    return cmd;
ali@0
   129
}