| United States | 
  | 
  
| Previous | Contents | Index | 
The <curses.h> header file defines variables and constants useful for implementing Curses (see Table 6-2).
| Name | Type | Description | 
|---|---|---|
| curscr | WINDOW * | Window of current screen | 
| stdscr | WINDOW * | Default window | 
| LINES | int | Number of lines on the terminal screen | 
| COLS | int | Number of columns on the terminal screen | 
| ERR | --- | Flag (0) for failed routines | 
| OK | --- | Flag (1) for successful routines | 
| TRUE | --- | Boolean true flag (1) | 
| FALSE | --- | Boolean false flag (0) | 
| _BLINK | --- | Parameter for setattr and clrattr | 
| _BOLD | --- | Parameter for setattr and clrattr | 
| _REVERSE | --- | Parameter for setattr and clrattr | 
| _UNDERLINE | --- | Parameter for setattr and clrattr | 
For example, you can use the predefined macro ERR to test the success or failure of a Curses function. Example 6-4 shows how to perform such a test.
| Example 6-4 Curses Predefined Variables | 
|---|
      
#include <curses.h> 
 
WINDOW  *win1, *win2, *win3; 
 
main() 
{ 
   initscr(); 
   win1 = newwin(10, 10, 1, 5); 
      . 
      . 
      . 
   if (mvwin(win1, 1, 10) == ERR) 
      addstr("The MVWIN function failed."); 
      . 
      . 
      . 
   endwin(); 
} 
 | 
In Example 6-4, if the
mvwin
 function fails, the program adds a string to
stdscr
 that explains the outcome. The Curses
mvwin
 function moves the starting position of a window.
6.6 Cursor Movement
In the UNIX system environment, you can use Curses functions to move the cursor across the terminal screen. With other implementations, you can either allow Curses to move the cursor using the move function, or you can specify the origin and the destination of the cursor to the mvcur function, which moves the cursor in a more efficient manner.
In Compaq C for OpenVMS Systems, the two functions are functionally equivalent and move the cursor with the same efficiency.
Example 6-5 shows how to use the move and mvcur functions.
| Example 6-5 The Cursor Movement Functions | 
|---|
      
#include <curses.h> 
 
main() 
{ 
   initscr(); 
      . 
      . 
      . 
(1)   clear(); 
(2)   move(10, 10); 
(3)   move(LINES/2, COLS/2); 
(4)   mvcur(0, COLS-1, LINES-1, 0); 
      . 
      . 
      . 
   endwin(); 
} 
 
 | 
Key to Example 6-5:
The following program example shows the effects of many of the Curses macros and functions. You can find explanations of the individual lines of code, if not self-explanatory, in the comments to the right of the particular line. Detailed discussions of the functions follow the source code listing.
Example 6-6 shows the definition and manipulation of one user-defined window and stdscr .
| Example 6-6 stdscr and Occluding Windows | 
|---|
      
/*        CHAP_6_STDSCR_OCCLUDE.C                       */ 
 
/* This program defines one window: win1.  win1 is      */ 
/* located towards the center of the default window     */ 
/* stdscr.  When writing to an occluding window (win1)  */ 
/* that is later erased, the writing is erased as well. */ 
 
#include <curses.h>     /* Include header file.         */ 
 
WINDOW *win1;                   /* Define windows.      */ 
 
main() 
{ 
    char str[80];               /* Variable declaration.*/ 
 
    initscr();  /* Set up Curses.   */ 
    noecho();   /* Turn off echo.   */ 
 
    /* Create window.             */ 
    win1 = newwin(10, 20, 10, 10); 
 
    box(stdscr, '|', '-');  /* Draw a box around stdscr. */ 
    box(win1, '|', '-');    /* Draw a box around win1.   */ 
 
    refresh();  /* Display stdscr on screen.  */ 
 
    wrefresh(win1);     /* Display win1 on screen.  */ 
 
(1)   getstr(str);      /* Pause. Type a few words!   */ 
 
   mvaddstr(22, 1, str); 
(2)   getch(); 
     /* Add string to win1.        */ 
 
    mvwaddstr(win1, 5, 5, "Hello"); 
    wrefresh(win1);     /* Add win1 to terminal scr.  */ 
 
    getch();    /* Pause.  Press Return.      */ 
 
    delwin(win1);       /* Delete win1.           */ 
 
(3)   touchwin(stdscr); /* Refresh all of stdscr.     */ 
 
   getch();                   /* Pause.  Press Return.      */ 
   endwin();                  /* Ends session.              */ 
} 
 | 
Key to Example 6-6:
Figure 6-4 An Example of the getch Macro
Table 7-1 lists and describes the math functions in the Compaq C Run-Time Library (RTL). For more detailed information on each function, see the Reference Section.
| Function | Description | 
|---|---|
| abs | Returns the absolute value of an integer. | 
| acos | Returns a value in the range 0 to Pi sign, which is the arc cosine of its radian argument. | 
| asin | Returns a value in the range --Pi sign/2 to Pi sign/2, which is the arc sine of its radian argument. | 
| atan | Returns a value in the range - pi /2 to Pi sign/2, which is the arc tangent of its radian argument. | 
| atan2 | Returns a value in the range - pi to Pi sign, which is the arc tangent of y/x where y and x are the two arguments. | 
| cabs | Returns: sqrt ( x * x + y * y ). | 
| ceil | Returns (as a double ) the smallest integer that is greater than or equal to its argument. | 
| cos | Returns the cosine of its radian argument. | 
| cot | Returns the cotangent of its radian argument. | 
| cosh | Returns the hyperbolic cosine of its argument. | 
| drand48 , erand48 , jrand48 , lrand48 , mrand48 , nrand48 | Generates uniformly distributed pseudorandom number sequences. Returns 48-bit, nonnegative, double-precision floating-point values. | 
| exp | Returns the base e raised to the power of the argument. | 
| fabs | Returns the absolute value of a floating-point value. | 
| floor | Returns (as a double ) the largest integer that is less than or equal to its argument. | 
| fmod | Computes the floating-point remainder of the first argument to fmod divided by the second. | 
| frexp | Calculates the fractional and exponent parts of a double value. | 
| hypot | Returns the square root of the sum of the squares of two arguments. | 
| initstate | Initializes random number generators. | 
| labs | Returns the absolute value of an integer as a long int . | 
| lcong48 | Initializes a 48-bit uniformly distributed pseudorandom number sequence. | 
| llabs, qabs (ALPHA ONLY) | Returns the absolute value of an __int64 integer. | 
| ldexp | Returns its first argument multiplied by 2 raised to the power of its second argument. | 
| ldiv, div | Returns the quotient and remainder after the division of their arguments. | 
| lldiv, qdiv (ALPHA ONLY) | Returns the quotient and remainder after the division of their arguments. | 
| log, log 10 | Returns the logarithm of their arguments. | 
| modf | Returns the positive fractional part of its first argument and assigns the integral part, expressed as a double , to the object whose address is specified by the second argument. | 
| pow | Returns the first argument raised to the power of the second argument. | 
| rand, srand | Returns pseudorandom numbers in the range 0 to 2 31-1 . | 
| random , srandom | Generates pseudorandom numbers in a more random sequence. | 
| seed48 , srand48 | Initializes a 48-bit random number generator. | 
| setstate | Restarts, and changes random number generators. | 
| sin | Returns the sine of its radian argument. | 
| sinh | Returns the hyperbolic sine of its argument. | 
| sqrt | Returns the square root of its argument. | 
| tan | Returns a double value that is the tangent of its radian argument. | 
| tanh | Returns a double value that is the hyperbolic tangent of its double argument. | 
The following additional Compaq C RTL math routines are supported for Compaq C on OpenVMS Alpha systems only. They are defined in <math.h> . Many of them are float , double , and long double variants of the routines listed in the preceding table. See the Compaq Portable Mathematics Library (DPML) manual for descriptions of these routines.
Note that for programs compiled without /L_DOUBLE=64 (that is, compiled with the default /L_DOUBLE=128), the long double variants of these Compaq C RTL math routines map to the X_FLOAT entry points documented in the DPML manual.
      
acosd      cbrt        expm1l      ldexpl       scalbf 
acosdf     cbrtf       fabsf       lgamma       scalbl 
acosdl     cbrtl       fabsl       lgammaf      sind 
acosf      ceilf       fabsl       lgammal      sindf 
acosl      ceill       finite      log10f       sindl 
acosh      copysign    finitef     log10l       sinf 
acoshf     copysignf   finitel     log1p        sinl 
acoshl     copysignl   floorf      log1pf       sinhf 
asind      cosd        floorl      log1pl       sinhl 
asindf     cosdf       fmodf       log2         sqrtf 
asindl     cosdl       fmodl       log2f        sqrtl 
asinf      cosf        fp_class    log2l        tand 
asinl      cosl        fp_classf   logb         tandf 
asinh      coshf       fp_classl   logbf        tandl 
asinhf     coshl       frexpf      logbl        tanf 
asinhl     cot         frexpl      logf         tanl 
 
atan2f     cotd        hypotf      logl         tanhf 
atan2l     cotdf       hypotl      modff        tanhl 
atand      cotdl       isnan       modfl        trunc 
atand2     cotf        isnanf      nextafter    truncf 
atand2f    cotl        isnanl      nextafterf   truncl 
atand2l    erf         j0          nextafterl   unordered 
atandf     erfc        j0f         nint         unorderedf 
atandl     erfcf       j0l         nintf        unorderedl 
atanf      erfcl       j1          nintl        y0 
atanl      erff        j1f         powf         y0f 
atanh      erfl        j1l         powl         y0l 
atanhf     expf        jn          rint         y1 
atanhl     expl        jnf         rintf        y1f 
cabsf      expm1       jnl         rintl        y1l 
cabsl      expm1f      ldexpf      scalb        yn 
                                                ynf 
                                                ynl 
 | 
To help you detect run-time errors, the <errno.h> header file defines the following two symbolic values that are returned by many (but not all) of the mathematical functions:
When using the math functions, you can check the external variable errno for either or both of these values and take the appropriate action if an error occurs.
The following program example checks the variable errno for the value EDOM, which indicates that a negative number was specified as input to the function sqrt :
      
#include <errno.h> 
#include <math.h> 
#include <stdio.h> 
 
main() 
{ 
   double input, square_root; 
 
   printf("Enter a number: "); 
   scanf("%le", &input); 
   errno = 0; 
   square_root = sqrt(input); 
 
   if (errno == EDOM) 
      perror("Input was negative"); 
   else 
      printf("Square root of %e = %e\n", 
              input, square_root); 
} 
 | 
If you did not check
errno
 for this symbolic value, the
sqrt
 function returns 0 when a negative number is entered. For more 
 information about the
<errno.h>
 header file, see Chapter 4.
7.3 The <fp.h> Header File
The <fp.h> header file implements some of the features defined by the Numerical C Extensions Group of the ANSI X3J11 committee. You might find this useful for applications that make extensive use of floating-point functions.
Some of the double-precision functions listed in this chapter return the value ±HUGE_VAL (defined in either <math.h> or <fp.h> ) if the result is out of range. The float version of those functions return the value HUGE_VALF (defined only in <fp.h> ) for the same conditions. The long double version returns the value HUGE_VALL (also defined in <fp.h> ).
For programs compiled to enable IEEE infinity and NaN values, the values HUGE_VAL, HUGE_VALF, and HUGE_VALL are expressions, not compile-time constants. Initializations such as the following cause a compile-time error:
      $ CREATE IEEE_INFINITY.C #include <fp.h> double my_huge_val = HUGE_VAL ^Z $ CC /FLOAT=IEEE/IEEE=DENORM IEEE_INFINITY double my_huge_val = HUGE_VAL; .....................^ %CC-E-NEEDCONSTEXPR, In the initializer for my_huge_val, "decc$gt_dbl_infinity" is not constant, but occurs in a context that requires a constant expression. at line number 3 in file WORK1$:[RTL]IEEE_INFINITY.C;1 $  | 
When using both
<math.h>
 and
<fp.h>
, be aware that
<math.h>
defines a function
isnan
 and
<fp.h>
 defines a macro by the same name. Whichever header is included first in 
 the application will resolve a reference to
isnan
.
7.4 Example
Example 7-1 shows how the tan , sin , and cos functions operate.
| Example 7-1 Calculating and Verifying a Tangent Value | 
|---|
      
/*        CHAP_7_MATH_EXAMPLE.C                                 */ 
 
/* This example uses two functions --- mytan and main ---       */ 
/* to calculate the tangent value of a number, and to check     */ 
/* the calculation using the sin and cos functions.             */ 
 
#include <math.h> 
#include <stdio.h> 
 
/* This function calculates the tangent using the sin and       */ 
/* cos functions.                                               */ 
 
double mytan(x) 
    double x; 
{ 
    double y, 
           y1, 
           y2; 
 
    y1 = sin(x); 
    y2 = cos(x); 
 
    if (y2 == 0) 
        y = 0; 
    else 
        y = y1 / y2; 
 
    return y; 
} 
main() 
{ 
    double x; 
 
    /*  Print values: compare   */ 
    for (x = 0.0; x < 1.5; x += 0.1) 
        printf("tan of %4.1f = %6.2f\t%6.2f\n", x, mytan(x), tan(x)); 
} 
 | 
Example 7-1 produces the following output:
      $ RUN EXAMPLE tan of 0.0 = 0.00 0.00 tan of 0.1 = 0.10 0.10 tan of 0.2 = 0.20 0.20 tan of 0.3 = 0.31 0.31 tan of 0.4 = 0.42 0.42 tan of 0.5 = 0.55 0.55 tan of 0.6 = 0.68 0.68 tan of 0.7 = 0.84 0.84 tan of 0.8 = 1.03 1.03 tan of 0.9 = 1.26 1.26 tan of 1.0 = 1.56 1.56 tan of 1.1 = 1.96 1.96 tan of 1.2 = 2.57 2.57 tan of 1.3 = 3.60 3.60 tan of 1.4 = 5.80 5.80 $  | 
| Previous | Next | Contents | Index | 
|   
     |