AcePerl
view release on metacpan or search on metacpan
acelib/messubs.c view on Meta::CPAN
/* Message formatting routines. */
/* */
/* */
/* This function writes into its own buffer, note that this has finite size */
/* see top of file: BUFSIZE, also note that subsequent calls will overwrite */
/* this buffer. */
/* */
UTIL_FUNC_DEF char *messprintf (char *format, ...)
{
static char buffer[BUFSIZE] ;
char *mesg_buf ;
va_list args ;
/* Format the message string. */
ACEFORMATSTRING(args, format, mesg_buf, NULL, &buffer[0], BUFSIZE)
return mesg_buf ;
}
/* Used internally for formatting into a specified buffer. */
/* (currently only used as a cover function to enable us to use ACEFORMAT- */
/* STRING from messSysErrorText) */
static char *printToBuf(char *buffer, unsigned int buflen, char *format, ...)
{
char *mesg_buf ;
va_list args ;
/* Format the message string. */
ACEFORMATSTRING(args, format, mesg_buf, NULL, buffer, buflen)
return mesg_buf ;
}
/* Return the string for a given errno from the standard C library. */
/* */
UTIL_FUNC_DEF char* messSysErrorText (void)
{
enum {ERRBUFSIZE = 2000} ; /* Should be enough. */
static char errmess[ERRBUFSIZE] ;
char *mess ;
#ifdef SUN
/* horrible hack for Sunos/Macs(?) which are not standard C compliant */
mess = printToBuf(&errmess[0], ERRBUFSIZE, SYSERR_FORMAT, errno, sys_errlist[errno]) ;
#elif defined(MACINTOSH)
mess = printToBuf(&errmess[0], ERRBUFSIZE, SYSERR_FORMAT, errno) ;
#else
mess = printToBuf(&errmess[0], ERRBUFSIZE, SYSERR_FORMAT, errno, strerror(errno)) ;
#endif
return mess ;
}
/************************* message formatting ********************************/
/* This routine does the formatting of the message string using vsprintf, */
/* it copes with the format string accidentally being our internal buffer. */
/* */
/* This routine does its best to check that the vsprintf is successful, if */
/* not the routine bombs out with an error message. Note that num_bytes is */
/* the return value from vsprintf. */
/* Failures trapped: */
/* num_bytes < 0 => vsprintf failed, reason is reported. */
/* num_bytes + 1 > BUFSIZE => our internal buffer size was exceeded. */
/* (vsprintf returns number of bytes written */
/* _minus_ terminating NULL) */
/* */
static char *uMessFormat(va_list args, char *format, char *prefix,
char *buffer, unsigned int buflen)
{
char *buf_ptr ;
unsigned int buf_len ;
int prefix_len ;
/* Check arguments. */
if (format == NULL)
{
fprintf(stderr, "uMessFormat() : "
"invalid call, no format string.\n") ;
invokeDebugger();
exit (EXIT_FAILURE);
}
if (prefix == NULL)
prefix_len = 0 ;
else
{
prefix_len = strlen(prefix) ;
if ((prefix_len + 1) > PREFIXSIZE)
{
fprintf (stderr, "uMessFormat() : "
"prefix string is too long.\n") ;
invokeDebugger();
exit (EXIT_FAILURE);
}
}
/* If they supply their own buffer to receive the formatted
message then use this, otherwise use the global messbuf buffer. */
if (buffer != NULL)
{
buf_ptr = buffer ;
buf_len = buflen ;
if (buf_len == 0)
{
fprintf (stderr, "uMessFormat() : "
"zero length buffer supplied for message format.\n") ;
invokeDebugger();
exit (EXIT_FAILURE);
}
}
else
{
buf_ptr = &messbuf[0] ;
buf_len = BUFSIZE ;
}
( run in 1.131 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )