diff options
| -rw-r--r-- | gramscii.c | 139 | 
1 files changed, 132 insertions, 7 deletions
| @@ -17,6 +17,7 @@  #define TEXT   0x04 +#define DIR_N  0x00  #define DIR_R  0x01  #define DIR_U  0x02  #define DIR_D  0x04 @@ -50,12 +51,12 @@ int y;  int step;  char cursor;  char corner; -char hlines[]  = {"-~=#@._"}; -char vlines[]  = {"|H#@:;i"}; +char hlines[]  = {"-~=#@._ "}; +char vlines[]  = {"|H#@:;i "};  char corners[] = {"+'H#@.\""}; -int hlines_sz= sizeof(hlines); -int vlines_sz= sizeof(vlines); -int corners_sz = sizeof(corners); +int hlines_sz= sizeof(hlines) -1; +int vlines_sz= sizeof(vlines) -1; +int corners_sz = sizeof(corners) -1;  int cur_hl, cur_vl, cur_corn;  char line_h;  char line_v; @@ -137,7 +138,6 @@ void redraw(){  	}  	status_bar();  	show_cursor(); -	step = 1;  }  void update_current(){ @@ -235,8 +235,8 @@ void draw_box(int x1, int y1, int fix){  void get_box(){  	char c;  	int orig_x=x, orig_y=y; -	  	redraw(); +	step = 1;  	draw_box(x,y,NOFIX);  	while((c=getchar())!=EOF && c != 27 && c!= 'b'){  		switch(c){ @@ -259,6 +259,7 @@ void get_box(){  		}  		check_bound();  		redraw(); +		step = 1;  		draw_box(orig_x, orig_y, NOFIX);  		status_bar();  		show_cursor(); @@ -270,6 +271,126 @@ void get_box(){  } +int progr_x(int dir){ +	switch(dir){ +		case DIR_L: +			return -1; +		case DIR_R: +			return +1; +		default: +			return 0; +	} +	return 0; +} + + +int progr_y(int dir){ +	switch(dir){ +		case DIR_D: +			return +1; +		case DIR_U: +			return -1; +		default: +			return 0; +	} +	return 0; +} + + +/* FIXME: fix pointer position */ +/* FIXME: set initial and final markers */ +/* FIXME: draw "corner" as first char after change of dir */ +void draw_arrow(int x, int y, char *a, int a_len, int fix){ + +	int i, j; +	char line; +	void (*f)(int, int, char); + +		 +	if (fix == FIX) +		f = set_xy; +	else +		f = draw_xy; + +	if (!a_len){ +		f(x,y,corner); +		return; +	} +	line = (a[0] & DIR_L) || (a[0] & DIR_R) ? line_h : line_v; +	f(x,y,line); +	for (i=0; i<a_len; i+=2){ +		for(j=0; j<a[i+1]; j++){ +			line = (a[i] & DIR_L) || (a[i] & DIR_R) ? line_h : line_v; +			x += progr_x(a[i]); +			y += progr_y(a[i]); +			f(x, y, line);  +		} +	} +	show_cursor(); +} + +void get_arrow(){ + +	char c; +	int orig_x=x, orig_y=y, arrow_len; +	static char *arrow = NULL; +	static int arrow_sz; + +	if (!arrow){ +		arrow_sz = 100; +		arrow = malloc(arrow_sz * sizeof(char)); +	} +	arrow_len = 0; +	dir = DIR_N; +	 +	redraw(); +	step = 1; +	//draw_arrow(x,y,NOFIX); +	while((c=getchar())!=EOF && c != 27 && c!= 'a'){ +		switch(c){ +			case 'H': step = 5; +			case 'h':  +				dir = DIR_L; +				x -= step; +				break;	 +			case 'J': step = 5; +			case 'j': +				dir = DIR_D; +				y += step; +				break; +			case 'K': step = 5; +			case 'k': +				dir = DIR_U; +				y -= step; +				break; +			case 'L': step = 5; +			case 'l': +				dir = DIR_R; +				x += step; +				break; +			default: +				continue; +		} +		check_bound(); +		/* FIXME: if we are out of bound, do nothing? */ +		if (arrow_len == arrow_sz){ +			arrow_sz *=2; +			arrow = realloc(arrow, arrow_sz * sizeof(char)); +		} +		arrow[arrow_len++] = dir; +		arrow[arrow_len++] = step; +		redraw(); +		step = 1; +		draw_arrow(orig_x, orig_y, arrow, arrow_len, NOFIX); +		status_bar(); +		show_cursor(); +	} +	if (c == 'a') +		draw_arrow(orig_x, orig_y, arrow, arrow_len, FIX); +	redraw(); +	state = MOVE; +} +  void write_file(){  	char fname[256];  	FILE *f; @@ -333,6 +454,10 @@ void commands(){  				state = BOX;  				get_box();  				break; +			case 'a': +				state = ARROW; +				get_arrow(); +				break;  			case 'w':  				write_file();  				break; | 
