HP OpenVMS SystemsC Programming Language |
HP C
|
| Previous | Contents | Index |
Example 3-1 shows how the character-classification functions are used.
| Example 3-1 Character-Classification Functions |
|---|
/* CHAP_3_CHARCLASS.C */
/* This example uses the isalpha, isdigit, and isspace */
/* functions to count the number of occurrences of letters, */
/* digits, and white-space characters entered through the */
/* standard input (stdin). */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
char c;
int i = 0,
j = 0,
k = 0;
while ((c = getchar()) != EOF) {
if (isalpha(c))
i++;
if (isdigit(c))
j++;
if (isspace(c))
k++;
}
printf("Number of letters: %d\n", i);
printf("Number of digits: %d\n", j);
printf("Number of spaces: %d\n", k);
}
|
The sample input and output from Example 3-1 follows:
$ RUN EXAMPLE1 I saw 35 people riding bicycles on Main Street.[Return] [Ctrl/Z] Number of letters: 36 Number of digits: 2 Number of spaces: 8 $ |
The character-conversion functions convert one type of character to another type. These functions include:
ecvt _tolower fcvt toupper gcvt _toupper mbtowc towctrans mbrtowc wctrans mbsrtowcs wcrtomb toascii wcsrtombs tolower |
For more information on each of these functions, see the Reference Section.
Example 3-2 shows how to use the ecvt function.
| Example 3-2 Converting Double Values to an ASCII String |
|---|
/* CHAP_3_CHARCONV.C */
/* This program uses the ecvt function to convert a double */
/* value to a string. The program then prints the string. */
#include <stdio.h>
#include <stdlib.h>
#include <unixlib.h>
#include <string.h>
main()
{
double val; /* Value to be converted */
int sign, /* Variables for sign */
point; /* and decimal place */
/* Array for the converted string */
static char string[20];
val = -3.1297830e-10;
printf("original value: %e\n", val);
if (sign)
printf("value is negative\n");
else
printf("value is positive\n");
printf("decimal point at %d\n", point);
}
|
The output from Example 3-2 is as follows:
$ RUN EXAMPLE2 original value: -3.129783e-10 converted string: 31298 value is negative decimal point at -9 $ |
Example 3-3 shows how to use the toupper and tolower functions.
| Example 3-3 Changing Characters to and from Uppercase Letters |
|---|
/* CHAP_3_CONV_UPPERLOWER.C */
/* This program uses the functions toupper and tolower to */
/* convert uppercase to lowercase and lowercase to uppercase */
/* using input from the standard input (stdin). */
#include <ctype.h>
#include <stdio.h> /* To use EOF identifier */
#include <stdlib.h>
main()
{
char c,
ch;
while ((c = getchar()) != EOF) {
if (c >= 'A' && c <= 'Z')
ch = tolower(c);
else
ch = toupper(c);
putchar(ch);
}
}
|
Sample input and output from Example 3-3 are as follows:
$ RUN EXAMPLE3 LET'S GO TO THE welcome INN.[Ctrl/Z] let's go to the WELCOME inn. $ |
The HP C RTL contains a group of functions that manipulate strings. Some of these functions concatenate strings; others search a string for specific characters or perform some other comparison, such as determining the equality of two strings.
The HP C RTL also contains a set of functions that allow you to copy buffers containing binary data.
The set of functions defined and declared in the <varargs.h> and the <stdarg.h> header files provide a method of accessing variable-length argument lists. The <stdarg.h> functions are defined by the ANSI C Standard and are more portable than those defined in <varargs.h> .
The RTL functions such as printf and execl , for example, use variable-length argument lists. User-defined functions with variable-length argument lists that do not use <varargs.h> or <stdarg.h> are not portable due to the different argument-passing conventions of various machines.
The <stdarg.h> header file does not contain va_alist and va_dcl . The following shows a syntax example when using <stdarg.h> :
|
function_name(int arg1, ...) { va_list ap; |
When using <varargs.h> :
These names and declarations have the following syntax:
|
function_name(int arg1, ...) { va_list ap;. |
Example 3-4 shows how to use the strcat and strncat functions.
| Example 3-4 Concatenating Two Strings |
|---|
/* CHAP_3_CONCAT.C */
/* This example uses strcat and strncat to concatenate two */
/* strings. */
#include <stdio.h>
#include <string.h>
main()
{
static char string1[80] = "Concatenates ";
static char string2[] = "two strings ";
static char string3[] = "up to a maximum of characters.";
static char string4[] = "imum number of characters";
printf("strcat:\t%s\n", strcat(string1, string2));
printf("strncat ( 0):\t%s\n", strncat(string1, string3, 0));
printf("strncat (11):\t%s\n", strncat(string1, string3, 11));
printf("strncat (40):\t%s\n", strncat(string1, string4, 40));
}
|
Example 3-4 produces the following output:
$ RUN EXAMPLE1 strcat: Concatenates two strings strncat ( 0): Concatenates two strings strncat (11): Concatenates two strings up to a max strncat (40): Concatenates two strings up to a maximum number of characters. $ |
Example 3-5 shows how to use the strcspn function.
| Example 3-5 Four Arguments to the strcspn Function |
|---|
/* CHAP_3_STRCSPN.C */
/* This example shows how strcspn interprets four */
/* different kinds of arguments. */
#include <stdio.h>
main()
{
printf("strcspn with null charset: %d\n",
strcspn("abcdef", ""));
printf("strcspn with null string: %d\n",
strcspn("", "abcdef"));
printf("strcspn(\"xabc\", \"abc\"): %d\n",
strcspn("xabc", "abc"));
printf("strcspn(\"abc\", \"def\"): %d\n",
strcspn("abc", "def"));
}
|
The sample output, to the file strcspn.out , in Example 3-5 is as follows:
$ RUN EXAMPLE2
strcspn with null charset: 6
strcspn with null string: 0
strcspn("xabc","abc"): 1
strcspn("abc","def"): 3
|
Example 3-6 shows how to use the <stdarg.h> functions and definitions.
| Example 3-6 Using the <stdarg.h > Functions and Definitions |
|---|
/* CHAP_3_STDARG.C */
/* This routine accepts a variable number of string arguments, */
/* preceded by a count of the number of such strings. It */
/* allocates enough space in which to concatenate all of the */
/* strings, concatenates them together, and returns the address */
/* of the new string. It returns NULL if there are no string */
/* arguments, or if they are all null strings. */
#include <stdarg.h> /* Include appropriate header files */
#include <stdlib.h> /* for the "example" call in main. */
#include <string.h>
#include <stdio.h>
/* NSTRINGS is the maximum number of string arguments accepted */
/* (arbitrary). */
#define NSTRINGS 10
char *concatenate(int n,...)
{
va_list ap; /* Declare the argument pointer. */
char *list[NSTRINGS],
*string;
int index = 0,
size = 0;
/* Check that the number of arguments is within range. */
if (n <= 0)
return NULL;
if (n > NSTRINGS)
n = NSTRINGS;
va_start(ap, n); /* Initialize the argument pointer. */
do {
/* Extract the next argument and save it. */
list[index] = va_arg(ap, char *);
size += strlen(list[index]);
} while (++index < n);
va_end(ap); /* Terminate use of ap. */
if (size == 0)
return NULL;
string = malloc(size + 1);
string[0] = '\0';
/* Append each argument to the end of the growing result */
/* string. */
for (index = 0; index < n; ++index)
strcat(string, list[index]);
return string;
}
/* An example of calling this routine is */
main() {
char *ret_string ;
ret_string = concatenate(7, "This ", "message ", "is ",
"built with ", "a", " variable arg",
" list.") ;
puts(ret_string) ;
}
|
The call to Example 3-6 produces the following output:
This message is built with a variable arg list. |
Table 4-1 lists and describes all the error- and signal-handling functions found in the HP C Run-Time Library (RTL). For more detailed information on each function, see the Reference Section.
| Function | Description |
|---|---|
| abort | Raises the signal SIGABRT that terminates the execution of the program. |
| assert | Puts diagnostics into programs. |
| atexit | Registers a function to be called at program termination. |
| exit, _exit | Terminates the current program. |
| perror | Writes a short error message to stderr describing the current errno value. |
| strerror | Maps the error code in errno to an error message string. |
| alarm | Sends the signal SIGALARM to the invoking process after the number of seconds indicated by its argument has elapsed. |
| gsignal | Generates a specified software signal. |
| kill | Sends a SIGKILL signal to the process specified by a process ID. |
| longjmp | Transfers control from a nested series of function invocations back to a predefined point without returning normally. |
| pause | Causes the process to wait until it receives a signal. |
| raise | Generates a specified signal. |
| setjmp | Establishes the context for a later transfer of control from a nested series of function invocations, without returning normally. |
| sigaction | Specifies the action to take upon delivery of a signal. |
| sigaddset | Adds the specified individual signal. |
| sigblock | Causes the signals in its argument to be added to the current set of signals being blocked from delivery. |
| sigdelset | Deletes a specified individual signal. |
| sigemptyset | Initializes the signal set to exclude all signals. |
| sigfillset | Initializes the signal set to include all signals. |
| sighold | Adds the specified signal to the calling process's signal mask. |
| sigignore | Sets the disposition of the specified signal to SIG_IGN. |
| sigismember | Tests whether a specified signal is a member of the signal set. |
| siglongjmp | Nonlocal goto with signal handling. |
| sigmask | Constructs the mask for a given signal number. |
| signal | Catches or ignores a signal. |
| sigpause | Blocks a specified set of signals and then waits for a signal that was not blocked. |
| sigpending | Examines pending signals. |
| sigprocmask | Sets the current signal mask. |
| sigrelse | Removes the specified signal from the calling process's signal mask. |
| sigsetjmp | Sets the jump point for a nonlocal goto. |
| sigsetmask | Establishes the signals that are blocked from delivery. |
| sigstack | Defines an alternate stack on which to process signals. |
| sigsuspend | Atomically changes the set of blocked signals and waits for a signal. |
| sigtimedwait | Suspends a calling thread and waits for queued signals to arrive. |
| sigvec | Permanently assigns a handler for a specific signal. |
| sigwait | Suspends a calling thread and waits for queued signals to arrive. |
| sigwaitinfo | Suspends a calling thread and waits for queued signals to arrive. |
| ssignal | Allows you to specify the action to be taken when a particular signal is raised. |
| VAXC$ESTABLISH | Establishes an application exception handler in a way that is compatible with HP C RTL exception handling. |
When an error occurs during a call to any of the HP C RTL functions, the function returns an unsuccessful status. Many RTL routines also set the external variable errno to a value that indicates the reason for the failure. You should always check the return value for an error situation.
The <errno.h> header file declares errno and symbolically defines the possible error codes. By including the <errno.h> header file in your program, you can check for specific error codes after a HP C RTL function call.
At program startup, the value of errno is 0. The value of errno can be set to a nonzero value by many HP C RTL functions. It is not reset to 0 by any HP C RTL function, so it is only valid to use errno after a HP C RTL function call has been made and a failure status returned. Table 4-2 lists the symbolic values that may be assigned to errno by the HP C RTL.
| Symbolic Constant | Description |
|---|---|
| E2BIG | Argument list too long |
| EACCES | Permission denied |
| EADDRINUSE | Address already in use |
| EADDRNOTAVAIL | Can't assign requested address |
| EAFNOSUPPORT | Address family not supported |
| EAGAIN | No more processes |
| EALIGN | Alignment error |
| EALREADY | Operation already in progress |
| EBADF | Bad file number |
| EBADCAT | Bad message catalog format |
| EBADMSG | Corrupted message detected |
| EBUSY | Mount device busy |
| ECANCELED | Operation canceled |
| ECHILD | No children |
| ECONNABORTED | Software caused connection abort |
| ECONNREFUSED | Connection refused |
| ECONNRESET | Connection reset by peer |
| EDEADLK | Resource deadlock avoided |
| EDESTADDRREQ | Destination address required |
| EDOM | Math argument |
| EDQUOT | Disk quota exceeded |
| EEXIST | File exists |
| EFAIL | Cannot start operation |
| EFAULT | Bad address |
| EFBIG | File too large |
| EFTYPE | Inappropriate operation for file type |
| EHOSTDOWN | Host is down |
| EHOSTUNREACH | No route to host |
| EIDRM | Identifier removed |
| EILSEQ | Illegal byte sequence |
| EINPROGRESS | Operation now in progress |
| EINPROG | Asynchronous operation in progress |
| EINTR | Interrupted system call |
| EINVAL | Invalid argument |
| EIO | I/O error |
| EISCONN | Socket is already connected |
| EISDIR | Is a directory |
| ELOOP | Too many levels of symbolic links |
| EMFILE | Too many open files |
| EMLINK | Too many links |
| EMSGSIZE | Message too long |
| ENAMETOOLONG | File name too long |
| ENETDOWN | Network is down |
| ENETRESET | Network dropped connection on reset |
| ENETUNREACH | Network is unreachable |
| ENFILE | File table overflow |
| ENOBUFS | No buffer space available |
| ENODEV | No such device |
| ENOENT | No such file or directory |
| ENOEXEC | Exec format error |
| ENOLCK | No locks available |
| ENOMEM | Not enough core |
| ENOMSG | No message of desired type |
| ENOPROTOOPT | Protocol not available |
| ENOSPC | No space left on device |
| ENOSYS | Function not implemented |
| ENOTBLK | Block device required |
| ENOTCONN | Socket is not connected |
| ENOTDIR | Not a directory |
| ENOTEMPTY | Directory not empty |
| ENOTSOCK | Socket operation on nonsocket |
| ENOTSUP | Function not implemented |
| ENOTTY | Not a typewriter |
| ENWAIT | No waiting processes |
| ENXIO | No such device or address |
| EOPNOTSUPP | Operation not supported on socket |
| EPERM | Not owner |
| EPFNOSUPPORT | Protocol family not supported |
| EPIPE | Broken pipe |
| EPROCLIM | Too many processes |
| EPROTONOSUPPORT | Protocol not supported |
| EPROTOTYPE | Protocol wrong type for socket |
| ERANGE | Result too large |
| EREMOTE | Too many levels of remote in path |
| EROFS | Read-only file system |
| ESHUTDOWN | Can't send after socket shutdown |
| ESOCKTNOSUPPORT | Socket type not supported |
| ESPIPE | Illegal seek |
| ESRCH | No such process |
| ESTALE | Stale NFS file handle |
| ETIMEDOUT | Connection timed out |
| ETOOMANYREFS | Too many references: can't splice |
| ETXTBSY | Text file busy |
| EUSERS | Too many users |
| EVMSERR | OpenVMS specific nontranslatable error code |
| EWOULDBLOCK | I/O operation would block channel |
| EXDEV | Cross-device link |
| Previous | Next | Contents | Index |