~ubuntu-branches/ubuntu/wily/eso-midas/wily-proposed

« back to all changes in this revision

Viewing changes to prim/tw3/libsrc/tvclear.c

  • Committer: Package Import Robot
  • Author(s): Ole Streicher
  • Date: 2014-04-22 14:44:58 UTC
  • Revision ID: package-import@ubuntu.com-20140422144458-okiwi1assxkkiz39
Tags: upstream-13.09pl1.2+dfsg
ImportĀ upstreamĀ versionĀ 13.09pl1.2+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*===========================================================================
 
2
  Copyright (C) 1986-2009 European Southern Observatory (ESO)
 
3
 
 
4
  This program is free software; you can redistribute it and/or 
 
5
  modify it under the terms of the GNU General Public License as 
 
6
  published by the Free Software Foundation; either version 2 of 
 
7
  the License, or (at your option) any later version.
 
8
 
 
9
  This program is distributed in the hope that it will be useful,
 
10
  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
  GNU General Public License for more details.
 
13
 
 
14
  You should have received a copy of the GNU General Public 
 
15
  License along with this program; if not, write to the Free 
 
16
  Software Foundation, Inc., 675 Massachusetss Ave, Cambridge, 
 
17
  MA 02139, USA.
 
18
 
 
19
  Corresponding concerning ESO-MIDAS should be addressed as follows:
 
20
        Internet e-mail: midas@eso.org
 
21
        Postal address: European Southern Observatory
 
22
                        Data Management Division 
 
23
                        Karl-Schwarzschild-Strasse 2
 
24
                        D 85748 Garching bei Muenchen 
 
25
                        GERMANY
 
26
===========================================================================*/
 
27
 
 
28
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
29
 
 
30
.TYPE           Module
 
31
.IDENTIFICATION tvclear.c
 
32
.AUTHOR         Francois Ochsenbein [ESO-IPG]
 
33
.LANGUAGE       C
 
34
.KEYWORDS       Terminal Independant i/o Package.
 
35
.ENVIRONMENT    TermWindows
 
36
.COMMENTS       This module includes clear functions.
 
37
\begin{TeX}
 
38
Used Capabilities:
 
39
$$\begin{tabular}{|lp{30em}|} \hline
 
40
{\tt cl=}       & Clear whole screen (and cursor to home position)      \\
 
41
{\tt cu=}       & Clear Up (from top of screen to cursor inclusive)     \\
 
42
{\tt cd=}       & Clear Down (from cursor inclusive to bottom of screen)\\
 
43
{\tt ce=}       & Clear from cursor to end of line                      \\
 
44
{\tt cs=}       & Clear from start of line to cursor inclusive  \\
 
45
\hline
 
46
\end{tabular}$$
 
47
\end{TeX}
 
48
.VERSION 1.0    07-Jul-1986:    Creation
 
49
.VERSION 1.1    12-Aug-1986:    Clearing lines or screen also means stop insert mode.
 
50
 
 
51
.VERSION 1.2    23-Oct-1986:    Take care of possible existing scrolling region
 
52
 
 
53
.VERSION 2.0    03-Dec-1986     New terminal-independant graphic characters
 
54
                        with output buffering version.
 
55
.VERSION 2.1    11-Jun-1987     Modify a bit for hard_copy terminals:
 
56
                        Useless to clear characters!!!
 
57
.VERSION 2.2    23-Jun-1987     Adapted to UNIX
 
58
.VERSION 3.0    20-Mar-1988     Version '3' of TermWindows.
 
59
 
 
60
 090831         last modif
 
61
----------------------------------------------------------------------------*/
 
62
 
 
63
#define DEBUG           0       /* Only for debugging   */
 
64
 
 
65
#define PM_LEVEL        LEVEL_TV
 
66
 
 
67
#include <midas_def.h>
 
68
 
 
69
 
 
70
#define TW_MACROS       0               /* Don't use TermWindows Macros */
 
71
#define TW_import       0       
 
72
#define TW_STRUCT       0       /* Do not use window Structures         */
 
73
#include <twset.h>
 
74
 
 
75
 
 
76
extern int tv_buffer(), tv_send(), tv_goto(), tv_out();
 
77
extern int tv_line(), tv_where(), tv_open(), tv_attr();
 
78
extern int tv_nl(), tv_sr0(), tv_home();
 
79
 
 
80
extern int pm_ed_i(), pm_iexit(), pm_enter();
 
81
 
 
82
 
 
83
MID_RSTATIC  char       clear_cap[] = "cucdcbce";
 
84
MID_STATIC   short int  old_pos[2] = {0,0};
 
85
 
 
86
#if     DEBUG
 
87
#       define  TERMTEST        if(!terms->version) tv_gopen();\
 
88
                                tv_ed(terms)
 
89
#else
 
90
#       define  TERMTEST        if(!terms->version) tv_gopen()
 
91
#endif
 
92
 
 
93
#define FIN_CURSOR      goto RESET_CURSOR
 
94
 
 
95
#define ENTER_TV(x)     static int      state_buffer;                   \
 
96
                        ENTER(x);       TERMTEST;                       \
 
97
                        state_buffer  = tv_buffer(TRUE);        
 
98
#define EXIT_TV(f)      FIN:                                            \
 
99
                        tv_buffer(state_buffer);                        \
 
100
                        EXIT(f)
 
101
 
 
102
MID_EXTERN  TERM        *terms ;                
 
103
 
 
104
#define         SEND(p)         tv_send(p,1)
 
105
 
 
106
                /* Macros just to improve readibility   */
 
107
 
 
108
#define         oldl                    old_pos[0]
 
109
#define         oldc                    old_pos[1]
 
110
#define         curl                    (terms->pos[0])
 
111
#define         curc                    (terms->pos[1])
 
112
#define         diml                    (terms->dim[0])
 
113
#define         dimc                    (terms->dim[1])
 
114
#define         BUFS                    (terms->bufs)
 
115
 
 
116
 
 
117
        MONITOR (ZTCLEAR);
 
118
 
 
119
/*==========================================================================
 
120
 *                      clear_h()
 
121
 *==========================================================================*/
 
122
static int clear_h(dir)
 
123
/*++++++++++++++++++++++++
 
124
.DES Clear at left / right of cursor (inclusive)
 
125
.RET OK / NOK
 
126
.REM Not traced. Never called for hard-copy terminals. Cursor moves
 
127
        if blanks are sent.
 
128
-----------------------*/
 
129
        int dir;        /* IN: Direction (left or right)        */
 
130
{
 
131
        register char *p;
 
132
        register int i, s;
 
133
 
 
134
                        /* Use TermCapabilities when possible   */
 
135
  p = SearchCap(&clear_cap[dir*2]);
 
136
  if (p)        return(SEND(p));
 
137
 
 
138
  s = OK;
 
139
  if (dir == _LEFT_)
 
140
  {     tv_out("\r",1); 
 
141
        i = curc + 1;
 
142
        curc = 0;
 
143
  }
 
144
  else  i = dimc - curc;
 
145
 
 
146
  if (i > 0)
 
147
  {     oscfill(BUFS,i,' ');
 
148
        s = tv_line(BUFS, i);
 
149
  }
 
150
  
 
151
  return(s);
 
152
}
 
153
 
 
154
/*==========================================================================
 
155
 *                      tv_cc
 
156
 *==========================================================================*/
 
157
int     tv_cc(nchar)
 
158
/*+++++++++++
 
159
.DES Clear n chars from the cursor inclusive.
 
160
.RET OK
 
161
.REM The cursor position remains unchanged. Simply write blanks ---
 
162
        or do nothing for hard_copy terminals!
 
163
        If nchar<0, clear chars at the left of the cursor.
 
164
----------*/
 
165
        int nchar;              /* IN: Number of chars to clear */
 
166
{
 
167
        register int n;
 
168
        unsigned char old_attr;
 
169
 
 
170
  ENTER_TV("tv_cc");
 
171
 
 
172
  TRACE_ED_I("Clearing chars: ", nchar);
 
173
 
 
174
  status = OK;
 
175
  if (nchar == 0)                       FINISH;
 
176
  if (terms->flags & TERM_hard)         FINISH;
 
177
 
 
178
  tv_where(old_pos);
 
179
  old_attr = terms->attr;
 
180
  tv_attr(terms->attr_init);
 
181
 
 
182
  n = 0;                        /* Number of blanks to issue    */
 
183
  if (nchar < 0)
 
184
  {     if (oldc + nchar < 0)                   /* Optimize     */
 
185
                status = clear_h(_LEFT_);
 
186
        else    tv_goto(oldl, oldc + nchar +1), n = -nchar;
 
187
  }
 
188
  else
 
189
  {     if (oldc + n >= dimc)                   /* Optimize     */      
 
190
                status = clear_h(_RIGHT_);
 
191
        else    n = nchar;
 
192
  }
 
193
 
 
194
        /* Can't clear with optimized TermCapabilities;
 
195
         * issue blanks.                                */
 
196
 
 
197
  if (n)
 
198
  {     oscfill(BUFS,n,' ');
 
199
        status = tv_line(BUFS, n);
 
200
  }
 
201
 
 
202
  tv_goto(oldl,oldc);
 
203
  tv_attr(old_attr);
 
204
 
 
205
  EXIT_TV(status);
 
206
}
 
207
 
 
208
/*==========================================================================
 
209
 *                      tv_cl
 
210
 *==========================================================================*/
 
211
int     tv_cl()
 
212
/*+++++++++++++
 
213
.DES Clear the complete line; the cursor is moved to the left margin.
 
214
.RET OK
 
215
.REM 
 
216
--------------*/
 
217
{
 
218
        unsigned char old_attr;
 
219
 
 
220
  ENTER_TV("tv_cl");
 
221
 
 
222
#if (TW_LEVEL > 0)
 
223
  status = OK;
 
224
 
 
225
        /* For hard-copy terminals, issue a new line    */
 
226
 
 
227
  if (terms->flags & TERM_hard) 
 
228
  {     tv_nl();
 
229
        curl--;         /* ... but line unchanged       */
 
230
        FINISH;
 
231
  }
 
232
#endif
 
233
 
 
234
        /* Simply go to line beginning, and clear it    */
 
235
 
 
236
  old_attr = terms->attr;
 
237
  tv_attr(terms->attr_init);
 
238
  tv_out("\r", 1);      curc = 0;
 
239
  status = clear_h(_RIGHT_);
 
240
  tv_goto(curl,0);
 
241
  tv_attr(old_attr);
 
242
 
 
243
  EXIT_TV(status);
 
244
}
 
245
 
 
246
/*==========================================================================
 
247
 *                      tv_clear
 
248
 *==========================================================================*/
 
249
int tv_clear(direction)
 
250
/*+++++++++++++++++
 
251
.DES Clear the terminal, according to the specified direction:
 
252
\begin{TeX}
 
253
\begin{itemize}
 
254
\item \_UP\_ : from the top of the screen, to the cursor (inclusive).
 
255
                The cursor does not move.
 
256
\item \_DOWN\_ : from the cursor (inclusive) to the end of the screen.
 
257
                The cursor does not move.
 
258
\item \_LEFT\_ : from the left margin of the current line
 
259
                to the cursor (inclusive) .
 
260
                The cursor does not move.
 
261
\item \_RIGHT\_ : from the cursor (inclusive) to the end of the line.
 
262
                The cursor does not move.
 
263
\item \_WHOLE\_ : the complete screen (the cursor goes to home, \ie [0,0]
 
264
                        position.
 
265
\end{itemize}
 
266
\end{TeX}
 
267
.RET OK/NOK
 
268
.REM Insert Mode turned off. For hard-copy terminals, only _WHOLE_
 
269
        has some signification.
 
270
-------------------*/
 
271
        int     direction; /* IN: Clearing direction _WHOLE_, _UP_, _DOWN_, etc */
 
272
{
 
273
        register char *p;
 
274
        unsigned char old_attr;
 
275
 
 
276
  ENTER_TV("tv_clear");
 
277
 
 
278
  status = OK;
 
279
  terms->flags &= (~TERM_IMODE);
 
280
 
 
281
  tv_where(old_pos);            /* Save present position        */
 
282
  curc = oldc;                  /* For wrap (cursor passed right margin) */
 
283
  old_attr = terms->attr;
 
284
  tv_attr(terms->attr_init);
 
285
 
 
286
  if ( (direction < 0) || (direction > 3) )
 
287
  {                                     /* Whole screen is the default  */
 
288
                        /* Reset the scrolling region to whole screen   */
 
289
        tv_sr0();
 
290
 
 
291
        /* Look if "cl" cap exists (already stored in TERM)
 
292
                otherwise, simply put a new line        */
 
293
 
 
294
        p = terms->tt_clear;
 
295
        if (p)  
 
296
                status = SEND(p);
 
297
        else    status = tv_nl();       /* No cap: Simply go to newline ... */
 
298
 
 
299
        oldc = 0; oldl = 0;             /* New cursor position  */
 
300
        FIN_CURSOR;
 
301
  }
 
302
 
 
303
  if (terms->flags & TERM_hard) FINISH;
 
304
 
 
305
 
 
306
        /* Change the direction for optimisation                */
 
307
 
 
308
  switch(direction)
 
309
  { case _UP_   :
 
310
        if (curl != 0)                  break;
 
311
    case _LEFT_ :                               /* Cont. _UP_   */
 
312
        status = clear_h(_LEFT_);       FIN_CURSOR;
 
313
    case _DOWN_ :
 
314
        if (curl != diml-1)             break;
 
315
    case _RIGHT_:                               /* Cont. _DOWN_ */
 
316
        status = clear_h(_RIGHT_);      FIN_CURSOR;
 
317
  }
 
318
 
 
319
        /* Here only in case of _UP_/_DOWN_ clearing            */
 
320
 
 
321
        /* Test if a scrolling region exists --- Use tv_sr0     */
 
322
 
 
323
  if ( (terms->scregion[0] != 0) || (terms->scregion[1] < diml-1) )
 
324
  {     tv_sr0();
 
325
        tv_goto(oldl, oldc);
 
326
  }
 
327
 
 
328
                        /* Use TermCapabilities when possible   */
 
329
  p = SearchCap(&clear_cap[direction*2]);
 
330
  if (p)        { status = SEND(p); FIN_CURSOR;}
 
331
 
 
332
                        /* Simulate Clearing with blanks        */
 
333
  switch(direction)
 
334
  { case _UP_:                  /* Clear from top left corner   */
 
335
        tv_home();      /* ... Cursor position is updated       */
 
336
        while (curl < oldl)
 
337
        {       clear_h(_RIGHT_);
 
338
                tv_nl();
 
339
        }                       /* We are on original line...   */
 
340
        tv_goto(oldl, oldc);    /* ... and continue with _LEFT_ */
 
341
        status = clear_h(_LEFT_);
 
342
        break;
 
343
 
 
344
    case _DOWN_:        /* `cd' capability doesn't exist        */
 
345
        status = clear_h(_RIGHT_);      /* clear current line...*/
 
346
        while (curl < diml-1)
 
347
                tv_nl(), clear_h(_RIGHT_);
 
348
  }
 
349
 
 
350
  RESET_CURSOR:
 
351
  tv_goto(oldl,oldc);
 
352
  tv_attr(old_attr);
 
353
 
 
354
  EXIT_TV(status);
 
355
}
 
356