[gnu.gcc.bug] GCC 1.35 bug on Sun 3

mcgrath%tully.Berkeley.EDU@GINGER.BERKELEY.EDU (Roland McGrath) (05/14/89)

The following input produces bad code; the `fintrz' insn is not emitted at
all.  It produces different, but equally bad, code with -O and without.

If the sequence `"f" "intrz" "%.x %1, %0"' is amalgomated into one string
`"fintrz%.x %1, %0"', or if `foo' is made non-`static', the problem goes away.

static inline double
foo(double value, double *iptr)
{
  double ipart;
  asm("f" "intrz" "%.x %1, %0" : "=f" (ipart) : "f" (value));
  *iptr = ipart;
  return(value - ipart);
}

double
bar(double value, double *iptr)
{
  return foo(value, iptr);
}

mcgrath%paris.Berkeley.EDU@GINGER.BERKELEY.EDU (Roland McGrath) (05/25/89)

GCC 1.35, Sun 3 (68020), Sun Unix 3.5.

% cc1 -O strftime.i
  isalnum isalpha iscntrl isdigit islower isgraph isprint ispunct isspace isupper isxdigit tolower toupper isascii isascii
../ctype.h:42: redefinition of `isascii'
../ctype.h:39: here is the previous declaration of `isascii'
 __huge_val strftimeSegmentation fault (core dumped)

strftime.i:
# 1 "strftime.c"
# 1 "../ansidecl.h"
# 90 "../ansidecl.h"
# 18 "strftime.c"
# 1 "../localeinfo.h"
# 1 "../stddef.h"
typedef long int	ptrdiff_t;
typedef unsigned int	size_t;	 
typedef	unsigned char	wchar_t;
# 25 "../localeinfo.h"
# 1 "../limits.h"
# 1 "../__posix_limits.h"
# 29 "../limits.h"
# 28 "../localeinfo.h"
typedef struct
  {
    	const  char *	const  string;	 
    	const  size_t len;		 
    	const  int shift;		 
  } mb_char;
struct ctype_info
  {
    	const  unsigned char *	const  ctype_b;		 
    	const  unsigned char *	const  ctype_tolower;	 
    	const  unsigned char *	const  ctype_toupper;	 
    	const  mb_char *	const  mb_chars;		 
    	const  size_t maxlen;			 
  };
extern size_t __mb_max;
extern 	const  unsigned char *__ctype_b;
extern 	const  unsigned char *__ctype_tolower;
extern 	const  unsigned char *__ctype_toupper;
struct collate_info
  {
    	const  unsigned char *	const  table;
  };
struct numeric_info
  {
    	const  char *	const  decimal_point;
    	const  char *	const  thousands_sep;
    	const  char *	const  grouping;
  };
struct monetary_info
  {
    	const  char *	const  int_curr_symbol;
    	const  char *	const  currency_symbol;
    	const  char *	const  mon_decimal_point;
    	const  char *	const  mon_thousands_sep;
    	const  char *	const  mon_grouping;
    	const  char *	const  positive_sign;
    	const  char *	const  negative_sign;
    	const  char int_frac_digits;
    	const  char frac_digits;
    	const  char p_cs_precedes;
    	const  char p_sep_by_space;
    	const  char n_cs_precedes;
    	const  char n_sep_by_space;
    	const  char p_sign_posn;
    	const  char n_sign_posn;
  };
struct time_info
  {
    	const  char *	const  abbrev_wkday[7];	 
    	const  char *	const  full_wkday[7];	 
    	const  char *	const  abbrev_month[12];	 
    	const  char *	const  full_month[12];	 
    	const  char *	const  ampm[2];		 
    	const  char *	const  ut0;		 
    	const  char *	const  tz;		 
};
typedef struct
  {
    	const  char *name;			 
    int categories;			 
    	const  struct ctype_info *ctype;
    	const  struct time_info *time;
    	const  struct collate_info *collate;
    	const  struct numeric_info *numeric;
    	const  struct monetary_info *monetary;
  } locale;
extern locale _current;			 
extern 	const  locale *	const  _locales[];	 
# 19 "strftime.c"
# 1 "../ctype.h"
enum
  {
    _ISupper	= 1 << 0,		 
    _ISlower	= 1 << 1,		 
    _IScntrl	= 1 << 2,		 
    _ISdigit	= 1 << 3,		 
    _ISspace	= 1 << 4,		 
    _IShex	= 1 << 5,		 
    _ISpunct	= 1 << 6,		 
    _NOgraph	= 1 << 7,		 
    _ISalpha	= _ISupper | _ISlower,	 
    _ISalnum	= _ISalpha | _ISdigit,	 
    _ISxdigit	= _ISdigit | _IShex,	 
    _ISgraph	= _ISalnum | _ISpunct,	 
    _ISprint	= _ISgraph | _NOgraph	 
  };
extern 	const  unsigned char *__ctype_b;		 
extern 	const  unsigned char *__ctype_tolower;	 
extern 	const  unsigned char *__ctype_toupper;	 
static __inline int isalnum( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISalnum)) ) ; } ;
static __inline int isalpha( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISalpha)) ) ; } ;
static __inline int iscntrl( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _IScntrl)) ) ; } ;
static __inline int isdigit( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISdigit)) ) ; } ;
static __inline int islower( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISlower)) ) ; } ;
static __inline int isgraph( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISgraph)) ) ; } ;
static __inline int isprint( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISprint)) ) ; } ;
static __inline int ispunct( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISpunct)) ) ; } ;
static __inline int isspace( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISspace)) ) ; } ;
static __inline int isupper( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISupper)) ) ; } ;
static __inline int isxdigit( int __c)  { return (__ctype_b[		((unsigned char) (__c)) ] & 		((unsigned char) (  _ISxdigit)) ) ; } ;
static __inline int
tolower( int __c) 
{ return __ctype_tolower[		((unsigned char) (__c)) ]; }
static __inline int
toupper( int __c) 
{ return __ctype_toupper[		((unsigned char) (__c)) ]; }
static __inline int
isascii( int __c) 
{ return (		((unsigned char) (__c))  & (1 << 7)) == 0; }
static __inline int
isascii( int __c) 
{ return(		((unsigned char) (__c))  & 0x7f); }
# 151 "../ctype.h"
# 20 "strftime.c"
# 1 "../limits.h"
# 80 "../limits.h"
# 21 "strftime.c"
# 1 "../stddef.h"
# 101 "../stddef.h"
# 22 "strftime.c"
# 1 "../stdio.h"
# 1 "../stddef.h"
# 101 "../stddef.h"
# 28 "../stdio.h"
# 1 "../stdarg.h"
# 49 "../stdarg.h"
typedef char *__va_list;
# 80 "../stdarg.h"
# 31 "../stdio.h"
typedef struct __stdio_file FILE;
typedef enum { __READING, __WRITING, __CHANGING } __io_direction;
typedef struct
  {
    unsigned int __read:1;	 
    unsigned int __write:1;	 
    unsigned int __append:1;	 
    unsigned int __binary:1;	 
    unsigned int __create:1;	 
    unsigned int __exclusive:1;	 
    unsigned int __truncate:1;	 
  } __io_mode;
typedef int 	__io_read  (	void *  __cookie, char *__buf, size_t __nbytes) ;
typedef int 	__io_write  (	void *  __cookie, 	const  char *__buf, size_t __n) ;
typedef long int 	__io_seek  (	void *  __cookie, long int __off, int __w) ;
typedef int 	__io_close  (	void *  __cookie) ;
typedef struct
  {
    __io_read *__read;		 
    __io_write *__write;	 
    __io_seek *__seek;		 
    __io_close *__close;	 
  } __io_functions;
typedef struct
  {
    int 	(*__input)  (FILE *stream) ;
    void 	(*__output)  (FILE *stream, int flush_only, int c) ;
  } __room_functions;
extern 	const  __io_functions __default_io_functions;
extern 	const  __room_functions __default_room_functions;
extern __io_close __stdio_close;
extern 	void *  	__stdio_open  (	const  char *__file, __io_mode __m, int *__dp) ;
extern void 	__stdio_linebf  (	void *  __cookie, int *__buffering,
				   size_t *__bufsize, __io_functions *__iof,
				   __room_functions *__rf) ;
extern void 	__stdio_errmsg  (	const  char *__msg, size_t __len) ;
extern char *	__stdio_gen_tempname  (	const  char *__dir, 	const  char *__pfx,
					  int __dir_search, size_t *__lenptr) ;
extern volatile  void 	__libc_fatal  (	const  char *__message) ;
struct __stdio_file
  {
    FILE *__next;			 
    char *__buf;			 
    char *__bufp;			 
    char *__endp;			 
    size_t __bufsz;			 
    	void *  __cookie;			 
    int __fd;				 
    unsigned char __magic;		 
    char __pb_buf[3];			 
    size_t __pb_count;			 
    __io_mode __mode;			 
    unsigned int __eof:1;		 
    unsigned int __error:1;		 
    unsigned int __userbuf:1;		 
    unsigned int __linebuf:1;		 
    unsigned int __seen:1;		 
    unsigned int __didnl:1;		 
    unsigned int __ispipe:1;		 
    __io_direction __direction;		 
    __io_functions __io_funcs;		 
    __room_functions __room_funcs;	 
  };
extern volatile  void 	__stdio_ill_dirch  (__io_direction __dir) ;
# 170 "../stdio.h"
extern void 	__invalidate  (FILE *__stream) ;
typedef long int fpos_t;
extern FILE *__stdio_head;	 
extern FILE *__stdio_tail;	 
extern FILE __stdio_files[3];	 
extern FILE *	const  stdin, *	const  stdout, *	const  stderr;
extern int 	remove  (	const  char *__filename) ;
extern int 	rename  (	const  char *__old, 	const  char *__new) ;
extern FILE *	tmpfile  (	void ) ;
extern char *	tmpnam  (char *__s) ;
extern char *	tempnam  (	const  char *__dir, 	const  char *__pfx) ;
extern int 	__flshfp  (FILE *__stream, unsigned char __c,
			    int __flush_only) ;
extern int 	fclose  (FILE *__stream) ;
extern int 	fflush  (FILE *__stream) ;
extern FILE *	fopen  (	const  char *__filename, 	const  char *__mode) ;
extern FILE*	freopen  (	const  char *__filename,
			    	const  char *__mode, FILE *__stream) ;
extern FILE *	__fopencookie  (	void *  __cookie, __io_mode mode,
				   __io_functions __io_functions) ;
extern FILE *	fdopen  (int __fd, 	const  char *__mode) ;
extern FILE *	fopencookie  (	void *  __cookie, 	const  char *__mode,
				 __io_functions __io_functions) ;
extern FILE *	fopenstring  (char *__s, size_t __len,
				 	const  char *__mode) ;
extern FILE *	freplace  (FILE *__replace, FILE *__with) ;
extern void 	setbuf  (FILE *__stream, char *__buf) ;
extern int 	setvbuf  (FILE *__stream, char *__buf,
			   int __mode, size_t __n) ;
extern void		setbuffer  (FILE *__stream, char *__buf, size_t __size) ;
extern void 	setlinebuf  (FILE *__stream) ;
extern int 	fprintf  (FILE *__stream, 	const  char *__format, ...) ;
extern int 	printf  (	const  char *__format, ...) ;
extern int 	sprintf  (char *__s, 	const  char *__format, ...) ;
extern int 	vfprintf  (FILE *__s, 	const  char *__format, __va_list __arg) ;
extern int 	vprintf  (	const  char *__format, __va_list __arg) ;
extern int 	vsprintf  (char *__s, 	const  char *__format, __va_list __arg) ;
extern int 	__vflprintf  (FILE *__s, 	const  char *__format,
			       __va_list __arg, int __limit, size_t __max) ;
extern int 	snprintf  (char *__s, size_t __maxlen,
			    	const  char *__format, ...) ;
extern int 	vsnprintf  (char *__s, size_t __maxlen,
			     	const  char *__format, __va_list __arg) ;
extern int 	vflprintf  (FILE *__s, size_t __n,
			     	const  char *__format, __va_list __arg) ;
extern int 	vslprintf  (char *__s, size_t __n,
			     	const  char *__format, __va_list __arg) ;
extern int 	vslnprintf  (char *__s, size_t __n, size_t __maxlen,
			      	const  char *__format, __va_list __arg) ;
extern int 	fscanf  (FILE *__stream, 	const  char *__format, ...) ;
extern int 	scanf  (	const  char *__format, ...) ;
extern int 	sscanf  (	const  char *__s, 	const  char *__format, ...) ;
extern int 	__vfscanf  (FILE *__s, 	const  char *__format,
			    __va_list __arg, int __allocate) ;
extern int 	vfscanf  (FILE *__s, 	const  char *__format,
			   __va_list __arg) ;
extern int 	vscanf  (	const  char *__format, __va_list __arg) ;
extern int 	__vsscanf  (	const  char *__s, 	const  char *__format,
			    __va_list __arg) ;
extern int 	vsscanf  (	const  char *__s, 	const  char *__format,
			   __va_list __arg) ;
extern int 	vfscanf_malloc  (FILE *__s, 	const  char *__format,
				  __va_list __arg) ;
extern int 	fscanf_malloc  (FILE *__stream, 	const  char *__format, ...) ;
extern int 	__fillbf  (FILE *__stream) ;
extern int 	fgetc  (FILE *__stream) ;
extern int 	getc  (FILE *__stream) ;
extern int 	getchar  (	void ) ;
extern int 	fputc  (int __c, FILE *__stream) ;
extern int 	putc  (int __c, FILE *__stream) ;
extern int 	putchar  (int __c) ;
extern int 	getw  (FILE *__stream) ;
extern int 	putw  (int __w, FILE *__stream) ;
extern char *	fgets  (char *__s, size_t __n, FILE *__stream) ;
extern char *	gets  (char *__s) ;
extern int 	fputs  (	const  char *__s, FILE *__stream) ;
extern int 	puts  (	const  char *__s) ;
extern int 	ungetc  (int __c, FILE *__stream) ;
extern size_t 	fread  (	void *  __ptr, size_t __size,
			    size_t __n, FILE *__stream) ;
extern size_t 	fwrite  (	const  	void *  __ptr, size_t __size,
			     size_t __n, FILE *__s) ;
extern int 	fgetpos  (FILE *__stream, fpos_t *__pos) ;
extern int 	fsetpos  (FILE *__stream, 	const  fpos_t *__pos) ;
extern int 	fseek  (FILE *__stream, long int __offset, int __whence) ;
extern long int 	ftell  (FILE *__stream) ;
extern void 	rewind  (FILE *__stream) ;
extern void 	clearerr  (FILE *__stream) ;
extern int 	feof  (FILE *__stream) ;
extern int 	ferror  (FILE *__stream) ;
extern void  	perror  (	const  char *__s) ;
extern void 	psignal  (	const  char *__s, int __sig) ;
extern int 	fileno  (FILE *__stream) ;
extern FILE *	popen  (	const  char *__command, 	const  char *__mode) ;
extern int 	pclose  (FILE *__stream) ;
extern char *	ctermid  (char *__s) ;
extern char *	cuserid  (char *__s) ;
# 23 "strftime.c"
# 1 "../stdlib.h"
# 1 "../stddef.h"
# 101 "../stddef.h"
# 31 "../stdlib.h"
# 1 "../errno.h"
# 1 "/usr/include/errno.h"
# 1 "/usr/include/sys/errno.h"
# 7 "/usr/include/errno.h"
extern int errno;
# 28 "../errno.h"
extern volatile  int errno;
# 34 "../stdlib.h"
# 1 "../float.h"
# 1 "../__fl_68881.h"
# 88 "../__fl_68881.h"
static __inline 	const  double
	__huge_val(	void ) 
{
  register double __val;
  __asm("fmove%.d #0x7ff0000000000000, %0" : "=f" (__val));
  return(__val);
}
# 63 "../float.h"
# 38 "../stdlib.h"
typedef struct
  {
    int quot;	 
    int rem;	 
  } div_t;
typedef struct
  {
    long int quot;	 
    long int rem;	 
  } ldiv_t;
extern size_t __mb_max;
extern double 	atof  (	const  char *__nptr) ;
extern int 	atoi  (	const  char *__nptr) ;
extern long int 	atol  (	const  char *__nptr) ;
extern double 	strtod  (	const  char *__nptr, char **__endptr) ;
extern long int 	strtol  (	const  char *__nptr, char **__endptr,
			       int __base) ;
extern unsigned long int 	strtoul  (	const  char *__nptr,
					 char **__endptr, int __base) ;
extern int 	rand  (	void ) ;
extern void 	srand  (unsigned int __seed) ;
extern long int 	__random  (	void ) ;
extern void 	__srandom  (unsigned int __seed) ;
extern 	void *  	__initstate  (unsigned int __seed, 	void *  __statebuf,
			       size_t __statelen) ;
extern 	void *  	__setstate  (	void *  __statebuf) ;
extern long int 	random  (	void ) ;
extern void 	srandom  (unsigned int __seed) ;
extern 	void *  	initstate  (unsigned int __seed, 	void *  __statebuf,
			     size_t __statelen) ;
extern 	void *  	setstate  (	void *  __statebuf) ;
extern 	void *  	malloc  (size_t __size) ;
extern 	void *  	realloc  (	void *  __ptr, size_t __size) ;
extern 	void *  	calloc  (size_t __nmemb, size_t __size) ;
extern void 	free  (	void *  __ptr) ;	
extern void 	cfree  (	void *  __ptr) ;
extern 	void *  	__alloca  (size_t __size) ;
extern 	void *  	alloca  (size_t __size) ;
# 170 "../stdlib.h"
extern 	void *  	memalign  (size_t __alignment, size_t __size) ;
extern 	void *  	valloc  (size_t __size) ;
extern volatile  void 	abort  (	void ) ;
extern int 	atexit  (void (*__func)(	void )) ;
extern int 	on_exit  (void (*__func)(int __status, 	void *  __arg),
			   	void *  __arg) ;
extern volatile  void 	exit  (int __status) ;
extern char *	getenv  (	const  char *__name) ;
extern int 	putenv  (	const  char *__string) ;
extern int 	system  (	const  char *__command) ;
extern 	void *  	bsearch  (	const  	void *  __key, 	const  	void *  __base,
			   size_t __nmemb, size_t __size,
			   int (*__compar)(	const  	void * , 	const  	void * )) ;
extern void 	qsort  (	void *  __base, size_t __nmemb, size_t __size,
			  int (*__compar)(	const  	void * , 	const  	void * )) ;
extern 	const   int 	abs  (int __x) ;
extern 	const   long int 	labs  (long int __x) ;
extern 	const   div_t 	div  (int __numer, int __denom) ;
extern 	const   ldiv_t 	ldiv  (long int __numer, long int __denom) ;
extern int 	mblen  (	const  char *__s, size_t __n) ;
extern int 	mbtowc  (wchar_t *__pwc, 	const  char *__s, size_t __n) ;
extern int 	wctomb  (char *__s, wchar_t __wchar) ;
extern size_t 	mbstowcs  (wchar_t *__pwcs, 	const  char *__s, size_t __n) ;
extern size_t 	wcstombs  (char *__s, 	const  wchar_t *__pwcs, size_t __n) ;
extern int 	getopt  (int __argc, 	const  char **__argv,
			  	const  char *__opts) ;
extern int opterr;
extern int optind;
extern char *optarg;
# 24 "strftime.c"
# 1 "../string.h"
# 1 "../stddef.h"
# 101 "../stddef.h"
# 29 "../string.h"
extern 	void *  	memcpy  (	void *  __dest, 	const  	void *  __src, size_t __n) ;
extern 	void *  	memmove  (	void *  __dest, 	const  	void *  __src, size_t __n) ;
extern 	void *  	memccpy  (	void *  __dest, 	const  	void *  __src,
			   int __c, size_t __n) ;
extern 	void *  	memset  (	void *  __s, int __c, size_t __n) ;
extern int 	memcmp  (	const  	void *  __s1, 	const  	void *  __s2, size_t __n) ;
extern 	void *  	memchr  (	const  	void *  __s, int __c, size_t __n) ;
extern char *	strcpy  (char *__dest, 	const  char *__src) ;
extern char *	strncpy  (char *__dest, 	const  char *__src, size_t __n) ;
extern char *	strcat  (char *__src, 	const  char *__dest) ;
extern char *	strncat  (char *__dest, 	const  char *__src, size_t __n) ;
extern int  	strcmp  (	const  char *__s1, 	const  char *__s2) ;
extern int 	strncmp  (	const  char *__s1, 	const  char *__s2, size_t __n) ;
extern int 	strcoll  (	const  char *__s1, 	const  char *__s2) ;
extern size_t 	strxfrm  (char *__dest, 	const  char *__src, size_t __n) ;
extern char *	strdup  (	const  char *__s) ;
extern char *	strchr  (	const  char *__s, int __c) ;
extern char *	strrchr  (	const  char *__s, int __c) ;
extern size_t 	strcspn  (	const  char *__s, 	const  char *__reject) ;
extern size_t 	strspn  (	const  char *__s, 	const  char *__accept) ;
extern char *	strpbrk  (	const  char *__s, 	const  char *__accept) ;
extern char *	strstr  (	const  char *__needle, 	const  char *__haystack) ;
extern char *	strtok  (char *__s, 	const  char *__delim) ;
extern size_t 	strlen  (	const  char *__s) ;
extern char *	strerror  (int __errnum) ;
extern char  *	strsignal  (int __sig) ;
# 25 "strftime.c"
# 1 "./time.h"
# 1 "../stddef.h"
# 101 "../stddef.h"
# 32 "./time.h"
typedef long int clock_t;
typedef long int time_t;
struct tm
  {
    int tm_sec;		 
    int tm_min;		 
    int tm_hour;	 
    int tm_mday;	 
    int tm_mon;		 
    int tm_year;	 
    int tm_wday;	 
    int tm_yday;	 
    int tm_isdst;	 
  };
extern clock_t 	clock  (	void ) ;
extern time_t 	time  (time_t *__timer) ;
extern 	const  double 	difftime  (time_t __time1, time_t __time0) ;
extern time_t 	mktime  (struct tm *__tp) ;
extern size_t 	strftime  (char *__s, size_t __maxsize,
			       	const  char *__format, 	const  struct tm *__tp) ;
extern struct tm *	gmtime  (	const  time_t *__timer) ;
extern struct tm *	localtime  (	const  time_t *__timer) ;
extern struct tm *	__offtime  (	const  time_t *__timer, long int __offset) ;
# 131 "./time.h"
extern char *	asctime  (	const  struct tm *__tp) ;
extern char *	ctime  (	const  time_t *__timer) ;
# 151 "./time.h"
extern char *__tzname[2];	 
extern int __daylight;		 
extern long int __timezone;	 
extern void 	__tzset  (	void ) ;
extern char *tzname[2];
extern int daylight;
extern long int timezone;
extern void 	tzset  (	void ) ;
# 26 "strftime.c"
# 41 "strftime.c"
size_t
strftime(
      char *s 	,  size_t maxsize 	, 
      	const  char *format 	,  register 	const  struct tm *tp) 
{
  	const  char *	const  a_wkday = 	_current.time ->abbrev_wkday[tp->tm_wday];
  	const  char *	const  f_wkday = 	_current.time ->full_wkday[tp->tm_wday];
  	const  char *	const  a_month = 	_current.time ->abbrev_month[tp->tm_mon];
  	const  char *	const  f_month = 	_current.time ->full_month[tp->tm_mon];
  size_t aw_len = strlen(a_wkday);
  size_t am_len = strlen(a_month);
  size_t wkday_len = strlen(f_wkday);
  size_t month_len = strlen(f_month);
  int hour12 = tp->tm_hour;
  	const  char *	const  ampm = 	_current.time ->ampm[hour12 > 12];
  size_t ap_len = strlen(ampm);
  unsigned int y_week0, y_week1;
  	const  char *zone;
  size_t zonelen;
  register size_t i = 0;
  register char *p = s;
  register 	const  char *f;
  __tzset();
  if (tp->tm_isdst < 0)
    {
      zone = "";
      zonelen = 0;
    }
  else
    {
      zone = __tzname[tp->tm_isdst > 0];
      zonelen = strlen(zone);
    }
  if (hour12 > 12)
    hour12 -= 12;
  else
    if (hour12 == 0) hour12 = 12;
  y_week0 = y_week1 = 0;
  for (f = format; *f != '\0'; ++f)
    {
      if (!isascii(*f))
	{
	  int len = mblen(f, strlen(f));
	  if (len > 0)
	    {
	      do {	i += ((len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( f), (len));	p += ((len));	}	} while (0)  ;
	      continue;
	    }
	}
      if (*f != '%')
	{
	  do {	i += (1);	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 *p = *f;	p += (1);	}	} while (0) ;
	  continue;
	}
      ++f;
      switch (*f)
	{
	case '%':
	  do {	i += (1);	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 *p = *f;	p += (1);	}	} while (0) ;
	  break;
	case 'a':
	  do {	i += ((aw_len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( a_wkday), (aw_len));	p += ((aw_len));	}	} while (0)  ;
	  break;
	case 'A':
	  do {	i += ((wkday_len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( f_wkday), (wkday_len));	p += ((wkday_len));	}	} while (0)  ;
	  break;
	case 'b':
	  do {	i += ((am_len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( a_month), (am_len));	p += ((am_len));	}	} while (0)  ;
	  break;
	case 'B':
	  do {	i += ((month_len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( f_month), (month_len));	p += ((month_len));	}	} while (0)  ;
	  break;
	case 'c':
	  do {	i += ((25));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.3s %.3s %2d %.2d:%.2d:%.2d %d",
		   a_wkday, a_month, tp->tm_mday,
		   tp->tm_hour, tp->tm_min,
		   tp->tm_sec, 1900 + tp->tm_year) != (25)) return(0);	p += ((25));	}	} while (0)  ;
	  break;
	case 'd':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_mday) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'H':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_hour) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'I':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", hour12) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'j':
	  do {	i += ((3));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.3d", tp->tm_yday) != (3)) return(0);	p += ((3));	}	} while (0)  ;
	  break;
	case 'm':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_mon + 1) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'M':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_min) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'p':
	  do {	i += ((ap_len));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( ampm), (ap_len));	p += ((ap_len));	}	} while (0)  ;
	  break;
	case 'S':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_sec) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'U':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2u", y_week0) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'w':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_wday) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'W':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2u", y_week1) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'x':
	  do {	i += ((15));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.3s %.3s %2d %d",
		   a_wkday, a_month, tp->tm_mday, 1900 + tp->tm_sec) != (15)) return(0);	p += ((15));	}	} while (0)  ;
	  break;
	case 'X':
	  do {	i += ((8));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d:%.2d:%.2d", tp->tm_hour, tp->tm_min, tp->tm_sec) != (8)) return(0);	p += ((8));	}	} while (0)  ;
	  break;
	case 'y':
	  do {	i += ((2));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.2d", tp->tm_year) != (2)) return(0);	p += ((2));	}	} while (0)  ;
	  break;
	case 'Y':
	  do {	i += ((4));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 if (sprintf  (p, "%.4d", 1900 + tp->tm_year) != (4)) return(0);	p += ((4));	}	} while (0)  ;
	  break;
	case 'Z':
	  do {	i += ((zonelen));	if (i >= maxsize)	return(0);	else	if (p != ((void *) 0) )	{	 memcpy((	void * ) p, (	void * ) ( zone), (zonelen));	p += ((zonelen));	}	} while (0)  ;
	  break;
	default:
	  break;
	}
    }
  if (p != ((void *) 0) )
    *p = '\0';
  return(i);
}