Many existing functions that return an errno error code are declared as returning a value of type int. It is semantically unclear by looking at the function declaration or prototype if these functions return an error status or a value ( or worse, some combination of the two (see ERR02-A. Avoid in-band error indicators).
TR 24731-1 introduces the new type errno_t that is defined to be type int in errno.h and elsewhere. Many of the functions defined in TR 24731-1 return values of this type. As a matter of programming style, The errno_t type should be used as the type of something an object that deals may only with the contain values that might be found in errno. For example, a function that returns the value of errno should be declared as having the return type errno_t.
...
| Code Block | ||
|---|---|---|
| ||
enum { NO_FILE_POS_VALUES = 3 };
int opener(
FILE * file,
int *width,
int *height,
int *data_offset
)
{
int file_w;
int file_h;
int file_o;
fpos_t offset;
if (file == NULL) { return EINVAL; }
errno = 0;
if (fgetpos(file, &offset) != 0) { return errno; }
if (fscanf(file, "%i %i %i", &file_w, &file_h, &file_o)
!= NO_FILE_POS_VALUES) {
return EIO;
}
errno = 0;
if (fsetpos(file, &offset) != 0) { return errno; }
if (width != NULL) { *width = file_w; }
if (height != NULL) { *height = file_h; }
if (data_offset != NULL) { *data_offset = file_o; }
return 0;
}
|
...
| Code Block | ||
|---|---|---|
| ||
#include <errno.h>
enum { NO_FILE_POS_VALUES = 3 };
errno_t opener(
FILE * file,
int *width,
int *height,
int *data_offset
)
{
int file_w;
int file_h;
int file_o;
fpos_t offset;
if (file == NULL) { return EINVAL; }
errno = 0;
if (fgetpos(file, &offset) != 0 ) { return errno; }
if (fscanf(file, "%i %i %i", &file_w, &file_h, &file_o)
!= NO_FILE_POS_VALUES) {
return EIO;
}
errno = 0;
if (fsetpos(file, &offset) != 0 ) { return errno; }
if (width != NULL) { *width = file_w; }
if (height != NULL) { *height = file_h; }
if (data_offset != NULL) { *data_offset = file_o; }
return 0;
}
|
...