[go: up one dir, main page]

File: loop.c

package info (click to toggle)
cftp 0.10-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 880 kB
  • ctags: 611
  • sloc: ansic: 7,586; sh: 327; makefile: 82
file content (118 lines) | stat: -rw-r--r-- 2,083 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
  loop -- main loop
  Copyright (C) 1996, 1997, 1998, 1999, 2000 Dieter Baron

  This file is part of cftp, a fullscreen ftp client
  The author can be contacted at <dillo@giga.or.at>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/



#include "directory.h"
#include "bindings.h"
#include "functions.h"
#include "display.h"
#include "tty.h"
#include "list.h"
#include "tag.h"

int fnexit(void);

static int loop_readkey(void);

static int _loop_key;



void
loop()
{
    int c;
    struct binding *binding;
    function *f;

    _loop_key = -1;
    list_do(1);
    tty_lowleft();
    fflush(stdout);
    
    while ((c=loop_readkey()) != -1) {
	binding = get_function(c, bs_none);
	if (binding->fn != -1) {
	    f = functions+binding->fn;

	    if (f->type == FN_EXIT
		&& fnexit() == 0)
		return;

	    if (f->type != FN_PRE)
		disp_status("");

	    if (f->type != FN_EXIT)
		f->fn(binding->args);

	    if (f->type != FN_PRE)
		void_prefix();
	}
	else {
	    disp_status("");
	    void_prefix();
	}

	tty_lowleft();
	fflush(stdout);
    }
}



int
fnexit(void)
{
    int c, ret = 0;
    
    if (tag_anytags()) {
	c = read_char("Tags remaining; really quit? ");
	if (c != 'y' && c != 'Y')
	    ret = 1;
    }

    return ret;
}



static int
loop_readkey(void)
{
    int k;
    
    if (_loop_key != -1) {
	k = _loop_key;
	_loop_key = -1;
	return k;
    }

    return tty_readkey();
}

void
loop_putkey(int k)
{
    _loop_key = k;
}