diff options
Diffstat (limited to 'gcc/testsuite/g++.old-deja/g++.law/inline2.C')
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.law/inline2.C | 3601 |
1 files changed, 3601 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.law/inline2.C b/gcc/testsuite/g++.old-deja/g++.law/inline2.C new file mode 100644 index 00000000000..2eb5b38f7e7 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.law/inline2.C @@ -0,0 +1,3601 @@ +// excess errors test - XFAIL - *-*-* +// Build don't link: +// Special g++ Options: -O2 +// GROUPS passed inlining +# 1 "NISTImages.cc" +# 1 "Vision.h" 1 + + + + + + + + + +extern "C" { +# 1 "/sym/gnu/lib/g++-include/stdio.h" 1 3 + + + + + + + + + + + + + + + + + + + + +#pragma interface + + + + + + + + + + + +# 1 "/sym/gnu/lib/g++-include/_G_config.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 33 "/sym/gnu/lib/g++-include/stdio.h" 2 3 + + +extern "C" { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdio.h" 1 3 + +# 1 "/sym/gnu/lib/g++-include/stdarg.h" 1 3 +extern "C" { +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdarg.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/va-sparc.h" 1 3 + + + + + + + + + + + +typedef char * __gnuc_va_list; + + + + + + + + + +# 79 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/va-sparc.h" 3 + + +# 32 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdarg.h" 2 3 + +# 77 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdarg.h" 3 + + + + + + +# 140 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdarg.h" 3 + + + + + +# 2 "/sym/gnu/lib/g++-include/stdarg.h" 2 3 + +} +# 2 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stdio.h" 2 3 + + + + + + +extern struct _iobuf { + int _cnt; + unsigned char *_ptr; + unsigned char *_base; + int _bufsiz; + short _flag; + char _file; +} _iob[]; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +extern struct _iobuf *__hide_fopen (); +extern struct _iobuf *__hide_fdopen (); +extern struct _iobuf *__hide_freopen (); +extern struct _iobuf *__hide_popen (); +extern struct _iobuf *tmpfile(); +extern long __hide_ftell (); +extern char *fgets(); +extern char *gets(); +extern char *__hide_sprintf (); +extern char *ctermid(); +extern char *cuserid(); +extern char *__hide_tempnam (); +extern char *tmpnam(); + + + + + + +# 69 "/sym/gnu/lib/g++-include/stdio.h" 2 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} + +extern "C" { + +int fclose(struct _iobuf *); +struct _iobuf * fdopen(int, const char*); +int fflush(struct _iobuf *); +int fgetc(struct _iobuf *); +char* fgets(char*, int, struct _iobuf *); +struct _iobuf * fopen(const char*, const char*); +int fprintf(struct _iobuf *, const char* ...); +int fputc(int, struct _iobuf *); +int fputs(const char*, struct _iobuf *); +int fread(void*, int , int , struct _iobuf *); + + + +struct _iobuf * freopen(const char*, const char*, struct _iobuf *); + +int fscanf(struct _iobuf *, const char* ...); +int fseek(struct _iobuf *, long, int); +long ftell(struct _iobuf *); +int fwrite(const void*, int , int , struct _iobuf *); +char* gets(char*); +int getw(struct _iobuf *); +int pclose(struct _iobuf *); +void perror(const char*); +struct _iobuf * popen(const char*, const char*); +int printf(const char* ...); +int puts(const char*); +int putw(int, struct _iobuf *); +int rewind(struct _iobuf *); +int scanf(const char* ...); +void setbuf(struct _iobuf *, char*); +void setbuffer(struct _iobuf *, char*, int); +int setlinebuf(struct _iobuf *); +int setvbuf(struct _iobuf *, char*, int, int ); +int sscanf(char*, const char* ...); +struct _iobuf * tmpfile(); +int ungetc(int, struct _iobuf *); +int vfprintf (...) ; +int vprintf (...) ; +char* sprintf (...) ; +char* vsprintf (...) ; + +extern int _filbuf (...) ; +extern int _flsbuf (...) ; + +} + + + + + + + + + + + + + + + + + + +# 11 "Vision.h" 2 + +# 1 "/usr/include/floatingpoint.h" 1 3 + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/ieeefp.h" 1 3 + + + + + + + + + + + + + + + + + +enum fp_direction_type + { + fp_nearest = 0, + fp_tozero = 1, + fp_positive = 2, + fp_negative = 3 + } ; + +# 34 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/ieeefp.h" 3 + +# 43 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/ieeefp.h" 3 + + +# 53 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/ieeefp.h" 3 + +enum fp_precision_type + { + fp_extended = 0, + fp_single = 1, + fp_double = 2, + fp_precision_3 = 3 + } ; + + +# 73 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/ieeefp.h" 3 + +enum fp_exception_type + { + fp_inexact = 0, + fp_division = 1, + fp_underflow = 2, + fp_overflow = 3, + fp_invalid = 4 + } ; + + +enum fp_class_type + { + fp_zero = 0, + fp_subnormal = 1, + fp_normal = 2, + fp_infinity = 3, + fp_quiet = 4, + fp_signaling = 5 + } ; + + +# 18 "/usr/include/floatingpoint.h" 2 3 + + + + +typedef float single; +typedef unsigned long extended[3]; + +typedef long double quadruple; + + + + + + + + +typedef unsigned fp_exception_field_type; + + + + +typedef int sigfpe_code_type; + +typedef void (*sigfpe_handler_type) (); + + + + + + + + +extern enum fp_direction_type fp_direction; + + + + +extern enum fp_precision_type fp_precision; + + + + +extern fp_exception_field_type fp_accrued_exceptions; + + + + + + + + + + + +typedef char decimal_string[512 ]; + + +typedef struct { + enum fp_class_type fpclass; + int sign; + int exponent; + decimal_string ds; + + + int more; + + + int ndigits; + + +} + decimal_record; + +enum decimal_form { + fixed_form, + + + + floating_form + +}; + +typedef struct { + enum fp_direction_type rd; + + enum decimal_form df; + int ndigits; +} + decimal_mode; + +enum decimal_string_form { + invalid_form, + whitespace_form, + fixed_int_form, + fixed_intdot_form, + fixed_dotfrac_form, + fixed_intdotfrac_form, + floating_int_form, + floating_intdot_form, + floating_dotfrac_form, + floating_intdotfrac_form, + inf_form, + infinity_form, + nan_form, + nanstring_form +}; + + + +extern void double_to_decimal(); +extern void quadruple_to_decimal(); +extern char *econvert(); +extern char *fconvert(); +extern char *gconvert(); +extern char *qeconvert(); +extern char *qfconvert(); +extern char *qgconvert(); + + + + + +extern sigfpe_handler_type ieee_handlers[5 ]; + + + + + + + +extern sigfpe_handler_type sigfpe(); + +extern void single_to_decimal(); +extern void extended_to_decimal(); + +extern void decimal_to_single(); +extern void decimal_to_double(); +extern void decimal_to_extended(); +extern void decimal_to_quadruple(); + +extern char *seconvert(); +extern char *sfconvert(); +extern char *sgconvert(); + +extern void string_to_decimal(); +extern void file_to_decimal(); +extern void func_to_decimal(); + + + +extern double atof(); + + + +extern int errno; + +extern double strtod(); + + +# 12 "Vision.h" 2 + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/malloc.h" 1 3 + + + + + + + + + + + + + + + + +struct mallinfo { + int arena; + int ordblks; + int smblks; + int hblks; + int hblkhd; + int usmblks; + int fsmblks; + int uordblks; + int fordblks; + int keepcost; + + int mxfast; + int nlblks; + int grain; + int uordbytes; + int allocated; + int treeoverhead; +}; + +typedef void * malloc_t; + +extern malloc_t calloc( ); +extern void free( ); +extern malloc_t malloc( ); +extern malloc_t realloc( ); +extern int mallopt(); +extern struct mallinfo mallinfo(); + + +# 13 "Vision.h" 2 + +long time(long *); +int ieee_handler(); +} + +# 1 "/sym/gnu/lib/g++-include/std.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/g++-include/stddef.h" 1 3 + + +extern "C" { + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stddef.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 41 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/stddef.h" 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +typedef int ptrdiff_t; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +typedef int int ; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +typedef __wchar_t wchar_t; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 7 "/sym/gnu/lib/g++-include/stddef.h" 2 3 + + + + +} + +# 24 "/sym/gnu/lib/g++-include/std.h" 2 3 + +# 1 "/sym/gnu/lib/g++-include/stdlib.h" 1 3 + + + + + + + +extern "C" { + +int abs(int); + + +void volatile abort(void); + + + + +double atof(const char*); +int atoi(const char*); +long atol(const char*); + +int atexit(auto void (*p) (void)); +int bsearch (const void *, const void *, int , + int , auto int (*ptf)(const void*, const void*)); +void* calloc(int , int ); +void cfree(void*); + + +void volatile exit(int); + + + + +char* fcvt(double, int, int*, int*); +void free(void*); +char* getenv(const char*); +int getopt(int, char * const *, const char*); +int getpw(int, char*); +char* gcvt(double, int, char*); +char* ecvt(double, int, int*, int*); +extern char** environ; + +long labs(long); +void* malloc(int ); +int malloc_usable_size(void*); +int putenv(const char*); +extern char* optarg; +extern int opterr; +extern int optind; +void qsort(void*, int , int , auto int (*ptf)(void*,void*)); +int rand(void); +void* realloc(void*, int ); +int setkey(const char*); +int srand(unsigned int); +double strtod(const char*, char**); +long strtol(const char*, char**, int); +unsigned long stroul(const char**, int); +int system(const char*); + +long random(void); +void srandom(int); +char* setstate(char*); +char* initstate(unsigned, char*, int); + +double drand48(void); +void lcong48(short*); +long jrand48(short*); +long lrand48(void); +long mrand48(void); +long nrand48(short*); +short* seed48(short*); +void srand48(long); + +char* ctermid(char*); +char* cuserid(char*); +char* tempnam(const char*, const char*); +char* tmpnam(char*); + +} + +# 25 "/sym/gnu/lib/g++-include/std.h" 2 3 + +# 1 "/sym/gnu/lib/g++-include/string.h" 1 3 + + + + + + + + + + + + + + +extern "C" { + +char* strcat(char*, const char*); +char* strchr(const char*, int); +int strcmp(const char*, const char*); +int strcoll(const char*, const char*); +char* strcpy(char*, const char*); +int strcspn(const char*, const char*); +char* strdup(const char*); + + + + +int strlen(const char*); +char* strncat(char*, const char*, int ); +int strncmp(const char*, const char*, int ); +char* strncpy(char*, const char*, int ); +char* strpbrk(const char*, const char*); +char* strrchr(const char*, int); +int strspn(const char*, const char*); +char* strstr(const char*, const char *); +char* strtok(char*, const char*); +int strxfrm(char*, const char*, int ); + +char* index(const char*, int); +char* rindex(const char*, int); +} + +# 1 "/sym/gnu/lib/g++-include/memory.h" 1 3 + + + + + + + +extern "C" { + +void* memalign (...) ; +void* memccpy (...) ; +void* memchr (...) ; +int memcmp (...) ; +void* memcpy (...) ; +void* memmove (...) ; +void* memset (...) ; +int ffs (...) ; +int getpagesize (...) ; +void* valloc (...) ; + +void bcopy (...) ; +int bcmp (...) ; +void bzero (...) ; +} + + + + + + + + + + + + + + +# 43 "/sym/gnu/lib/g++-include/string.h" 2 3 + + + +# 26 "/sym/gnu/lib/g++-include/std.h" 2 3 + + +# 1 "/sym/gnu/lib/g++-include/unistd.h" 1 3 + + + + + +extern "C" { + + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/unistd.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/g++-include/sys/types.h" 1 3 + + +extern "C" +{ + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/types.h" 1 3 + + + + + + + + + + + + + + + +# 1 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/stdtypes.h" 1 3 + + + + + + + + + + + + + +typedef int sigset_t; + +typedef unsigned int speed_t; +typedef unsigned long tcflag_t; +typedef unsigned char cc_t; +typedef int pid_t; + +typedef unsigned short mode_t; +typedef short nlink_t; + +typedef long clock_t; +typedef long time_t; + + + + + + + + + + + + + + + + +# 16 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/types.h" 2 3 + + + +# 1 "/usr/include/sys/sysmacros.h" 1 3 + + + + + + + + + + + + + + + + + + + +# 19 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/types.h" 2 3 + + + + + +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; +typedef unsigned short ushort; +typedef unsigned int uint; + + + + + + + + + + + + + + + +typedef struct _physadr_t { int r[1]; } *physadr_t; +typedef struct label_t { + int val[2]; +} label_t; + + + + + + + +typedef struct _quad_t { long val[2]; } quad_t; +typedef long daddr_t; +typedef char * caddr_t; +typedef unsigned long ino_t; +typedef short dev_t; +typedef long off_t; +typedef unsigned short uid_t; +typedef unsigned short gid_t; +typedef long key_t; +typedef char * addr_t; + + + + + + + + + + + + + + +typedef long fd_mask; + + + + + + + + + +typedef struct fd_set { + fd_mask fds_bits[(((256 )+(( (sizeof (fd_mask) * 8 ) )-1))/( (sizeof (fd_mask) * 8 ) )) ]; +} fd_set; + + + + + + + +# 113 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/sys/types.h" 3 + + + +# 15 "/sym/gnu/lib/g++-include/sys/types.h" 2 3 + + + + + + +} + + + + +# 73 "/sym/gnu/lib/gcc-lib/sparc-sun-sunos4.1/2.3.1/include/unistd.h" 2 3 + + +extern void _exit( ); +extern int access( ); +extern unsigned alarm( ); +extern int chdir( ); +extern int __hide_chmod ( ); +extern int __hide_chown ( ); +extern int close( ); +extern char *ctermid( ); +extern char *cuserid( ); +extern int dup( ); +extern int dup2( ); +extern int __hide_execl ( ); +extern int __hide_execle ( ); +extern int __hide_execlp ( ); +extern int execv( ); +extern int execve( ); +extern int execvp( ); +extern pid_t fork( ); +extern long fpathconf( ); +extern char *getcwd( ); +extern gid_t getegid( ); +extern uid_t geteuid( ); +extern gid_t getgid( ); +extern int getgroups( ); +extern char *getlogin( ); +extern pid_t getpgrp( ); +extern pid_t getpid( ); +extern pid_t getppid( ); +extern uid_t getuid( ); +extern int isatty( ); +extern int link( ); +extern off_t lseek( ); +extern long pathconf( ); +extern int pause( ); +extern int pipe( ); +extern int read( ); +extern int rmdir( ); +extern int __hide_setgid ( ); +extern int setpgid( ); +extern pid_t setsid( ); +extern int __hide_setuid ( ); +extern unsigned sleep( ); +extern long sysconf( ); +extern pid_t tcgetpgrp( ); +extern int tcsetpgrp( ); +extern char *ttyname( ); +extern int unlink( ); +extern int write( ); + + + +# 25 "/sym/gnu/lib/g++-include/unistd.h" 2 3 + + + + + + + + + + + + + + + +# 59 "/sym/gnu/lib/g++-include/unistd.h" 3 + + + +extern void volatile _exit(int); + + + + +extern unsigned alarm (...) ; +extern int brk (...) ; +extern int chdir (...) ; +extern int chmod (...) ; +extern int chown (const char*, unsigned short , unsigned short ); +extern int close (...) ; +extern char* crypt (...) ; +extern int dup (...) ; +extern int dup2 (...) ; +extern void encrypt (...) ; +extern int execl (const char*, const char *, ...); +extern int execle (const char*, const char *, ...); +extern int execlp (const char*, const char*, ...); +extern int exect (...) ; +extern int execv (...) ; +extern int execve (...) ; +extern int execvp (...) ; +extern int fchown (int, unsigned short , unsigned short ); +extern int fork (...) ; +extern int fsync (...) ; +extern int ftruncate (...) ; +extern char* getcwd (...) ; +extern int getdomainname (...) ; +extern int getdtablesize (...) ; +extern int getgroups (...) ; +extern unsigned short geteuid (...) ; +extern unsigned short getegid (...) ; +extern unsigned short getgid (...) ; +extern long gethostid (...) ; +extern int gethostname (...) ; +extern int getpgrp (...) ; +extern int getpid (...) ; +extern int getppid (...) ; +extern char* getlogin (...) ; +extern char* getpass (...) ; +extern unsigned short getuid (...) ; +extern int ioctl (int, int, ... ); +extern int isatty (...) ; +extern int link (...) ; +extern int mkstemp (...) ; +extern char* mktemp (...) ; +extern int nice (...) ; +extern int pause (...) ; +extern int pipe (...) ; +extern int readlink (...) ; +extern int rename (...) ; +extern int rmdir (...) ; +extern void* sbrk (...) ; +extern int syscall (...) ; +extern int setgid (unsigned short ); +extern int sethostname (...) ; + + + + +extern int setpgrp (...) ; + +extern int setregid (...) ; +extern int setreuid (...) ; +extern int setuid (unsigned short ); +extern unsigned sleep (...) ; +extern void swab (...) ; +extern int symlink (...) ; +extern long sysconf (...) ; +extern int truncate (...) ; +extern char* ttyname (...) ; +extern int ttyslot (...) ; + +extern int unlink (...) ; +extern int vfork (...) ; +extern int vadvise (...) ; +extern int vhangup (...) ; +extern long lseek (...) ; +extern int read (...) ; +extern int write (...) ; +extern int access (...) ; + +extern int flock (...) ; + + +} + + +# 28 "/sym/gnu/lib/g++-include/std.h" 2 3 + +# 1 "/sym/gnu/lib/g++-include/stdio.h" 1 3 + + + + + + + + + + + + + + + + + + +# 174 "/sym/gnu/lib/g++-include/stdio.h" 3 + +# 29 "/sym/gnu/lib/g++-include/std.h" 2 3 + +# 1 "/sym/gnu/lib/g++-include/errno.h" 1 3 + + +extern "C" { + + + + + +# 1 "/usr/include/errno.h" 1 3 + + + + + + + + + +# 1 "/usr/include/sys/errno.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 10 "/usr/include/errno.h" 2 3 + +extern int errno; + + +# 9 "/sym/gnu/lib/g++-include/errno.h" 2 3 + + + + +extern char* sys_errlist[]; +extern int sys_nerr; + +extern int errno; + +void perror(const char*); +char* strerr(int); + + +} + + +# 30 "/sym/gnu/lib/g++-include/std.h" 2 3 + +# 1 "/sym/gnu/lib/g++-include/fcntl.h" 1 3 + + +extern "C" { + + + + + + + + + + +# 1 "/usr/include/fcntl.h" 1 3 + + + + + +# 1 "/usr/include/sys/fcntlcom.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +struct flock { + short l_type; + short l_whence; + long l_start; + long l_len; + short l_pid; + short l_xxx; +}; + + + +struct eflock { + short l_type; + short l_whence; + long l_start; + long l_len; + short l_pid; + short l_xxx; + long l_rpid; + long l_rsys; +}; + + + +# 1 "/sym/gnu/lib/g++-include/sys/stat.h" 1 3 + + +extern "C" +{ + + + + + + + + + +# 1 "/usr/include/sys/stat.h" 1 3 + + + + + + + + + + + +struct stat { + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + short st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; + time_t st_atime; + int st_spare1; + time_t st_mtime; + int st_spare2; + time_t st_ctime; + int st_spare3; + long st_blksize; + long st_blocks; + long st_spare4[2]; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +int __hide_chmod ( ); +int fstat( ); +int mkdir( ); +int mkfifo( ); +int stat( ); +mode_t umask( ); + + + +# 14 "/sym/gnu/lib/g++-include/sys/stat.h" 2 3 + + + + + + +extern int chmod (...) ; +extern int stat (...) ; +extern int lstat (...) ; +extern int fstat (...) ; + + + + + + + + + + + + + + + + + + +} + + +# 149 "/usr/include/sys/fcntlcom.h" 2 3 + + +int __hide_open ( ); +int __hide_creat ( ); +int __hide_fcntl ( ); + + +# 6 "/usr/include/fcntl.h" 2 3 + + + + + +# 14 "/sym/gnu/lib/g++-include/fcntl.h" 2 3 + + + + + + + + +int fcntl(int, int, ...); +int creat (...) ; + +int open (...) ; + + +} + +# 31 "/sym/gnu/lib/g++-include/std.h" 2 3 + + +extern "C" { +int strcasecmp (...) ; +} + + +# 18 "Vision.h" 2 + +# 1 "/sym/gnu/lib/g++-include/math.h" 1 3 + + + + + + + + + + + + + + + + + + + + + +#pragma interface + + + + + + + + + + + +# 64 "/sym/gnu/lib/g++-include/math.h" 3 + +extern "C" { + +double acos(double); +double acosh(double); +double asin(double); +double asinh(double); +double atan(double); +double atan2(double, double); +double atanh(double); +double cbrt(double); +double ceil(double); +double copysign(double,double); +double cos(double); +double cosh(double); +double drem(double,double); +double erf(double); +double erfc(double); +double exp(double); +double expm1(double); +double fabs(double); +double finite(double); +double floor(double); +double fmod(double, double); +double frexp(double, int*); +double gamma(double); +double hypot(double,double); +double infnan(int); + + +int isinf(double); +int isnan(double); + +double j0(double); +double j1(double); +double jn(int, double); +double ldexp(double, int); +double lgamma(double); +double log(double); +double log10(double); +double log1p(double); +double logb(double); +double modf(double, double*); +double pow(double, double); +double rint(double); +double scalb(double, int); +double sin(double); +double sinh(double); +double sqrt(double); +double tan(double); +double tanh(double); +double y0(double); +double y1(double); +double yn(int, double); + +double aint(double); +double anint(double); +int irint(double); +int nint(double); +} + + + + + + + + +struct libm_exception +{ + int type; + char* name; + double arg1, arg2, retval; +}; + + + + + + + + +extern "C" int matherr(libm_exception*); + + + +# 1 "/sym/gnu/lib/g++-include/values.h" 1 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 57 "/sym/gnu/lib/g++-include/values.h" 3 + + + + + + + + + + + + + + + +# 166 "/sym/gnu/lib/g++-include/values.h" 3 + + + + + + + + + +# 150 "/sym/gnu/lib/g++-include/math.h" 2 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# 19 "Vision.h" 2 + + +# 1 "MiscUtilities.h" 1 + + + + + +# 1 "/sym/gnu/lib/g++-include/std.h" 1 3 + + + + + + + + + + + + + + + + + + + +# 37 "/sym/gnu/lib/g++-include/std.h" 3 + +# 6 "MiscUtilities.h" 2 + + + + + + + + + +inline int used_mem() { + struct mallinfo mi = mallinfo(); + return mi.usmblks+mi.uordblks; +} +inline volatile void abort() { + fprintf((&_iob[2]) ,"abort\n"); + exit(1); +} + +inline volatile void error(char *s) { + fprintf((&_iob[2]) ,"FATAL ERROR: "); + fprintf((&_iob[2]) ,"%s\n",s); + exit(1); +} +template <class Y> +struct NameValuePair { + char *name; + Y y; +}; + +template <class Y> +Y lookup(NameValuePair<Y> *data,char *name) { + while(data->name) { + if(!strcmp(data->name,name)) return data->y; + data++; + } + abort(); + return data->y; +} + +template <class T> +void swap(T &x,T &y) { + T temp = x; + x = y; + y = temp; +} + + +# 21 "Vision.h" 2 + +# 1 "Counted.h" 1 + + + + + +# 1 "/sym/gnu/lib/g++-include/std.h" 1 3 + + + + + + + + + + + + + + + + + + + +# 37 "/sym/gnu/lib/g++-include/std.h" 3 + +# 6 "Counted.h" 2 + + +template <class T> +struct Counted { + private: + int *count; + T *object; + T *operator&() { + return object; + } + void dec_count() { + if(!count) return; + (*count)--; + if(*count<=0) { + delete count; + delete object; + count=0; + object=0; + } + } + void inc_count() { + if(!count) return; + (*count)++; + } + public: + Counted() { + count=0; + object=0; + } + Counted(T *object):object(object) { + count = new int(1); + } + ~Counted() { + dec_count(); + } + Counted(Counted &other) { + count=other.count; + object=other.object; + inc_count(); + } + Counted &operator=(Counted &other) { + other.inc_count(); + dec_count(); + count=other.count; + object=other.object; + return *this; + } + + T &operator*() {if(!object) abort(); else return *object; return *object;} + T *operator->() {if(!object) abort(); else return object; return object;} + operator T&() {if(!object) abort(); else return *object; return *object;} + + +}; + + +# 22 "Vision.h" 2 + +# 1 "Art.h" 1 + + + + + + +extern "C" { void abort(); } + + + + + + + + + + + + +template <class X> +inline void art_initialize(X *,int) {} + +# 39 "Art.h" + + + + + + +template <class T> +class Art { +protected: + int mark_temp; + T *data; + int dims[1]; + void constructor(int d) { + if(d<0) abort() ; + mark_temp=0; + dims[0]=d; + if(d>0) { + data=new T[d]; + if(!data) abort() ; + } else data=0; + art_initialize(data,d); + } + void destructor() { + if(!data) return; + delete [] data; + mark_temp=0; + data=0; + dims[0]=0; + } + void copy(Art &other) { + int d0=dims[0]<?other.dims[0]; + for(int i=0;i<d0;i++) data[i]=other.data[i]; + } +public: + void copyclear(Art &other) { + dims[0]=other.dims[0]; + data=other.data; + other.dims[0]=0; + other.data=0; + } +private: + void copyconstructor(Art &other) { + mark_temp=0; + if(other.mark_temp) { + copyclear(other); + } else { + constructor(other.dims[0]); + copy(other); + } + } + public: + Art() {constructor(0);} + Art(int d) {constructor(d);} + Art(Art &other) {copyconstructor(other);} + ~Art() {destructor();} + + Art &operator=(Art &other) { + destructor(); + copyconstructor(other); + return *this; + } + int dim(int i) {return dims[i];} + T &operator()(int i) { + if(unsigned(i)>=unsigned(dims[0])) abort() ; + return data[i]; + } + T &sub(int i) {return data[i];} + void resize(int nd) { + if(nd<0) abort() ; + Art t(nd); + int limit=nd<?dims[0]; + for(int i=0;i<limit;i++) t.data[i]=data[i]; + t.mark_temp=1; + *this=t; + } + Art &temp() { mark_temp=1; return *this; } + T *pointer() {return data;} + void fill(T value) {for(int i=0;i<dims[0];i++) data[i]=value;} + + int length() {return dims[0];} + T &operator[](int i) {return operator()(i);} +}; + + + + + + + + +template <class T> +class Stk { +protected: + Art<T> stack; + int fill; +public: + Stk() {stack.resize(4); fill=0;} + Stk(Stk &other) { + stack=other.stack; + fill=other.fill; + } + int dim(int i) {return stack.dim(i);} + void push(T &element) { + if(fill>=stack.dim(0)) stack.resize(2*fill); + stack.sub(fill++)=element; + } + T &tos() { + return stack(fill-1); + } + T &pop() { + return stack(--fill); + } + T &operator()(int i) {return stack(i);} + T &sub(int i) {return stack.sub(i);} + void clear() { + stack.resize(0); + stack.resize(4); + fill=0; + } + void compact() { + stack.resize(fill+1); + } + Stk temp() { stack.temp(); return *this; } + T *pointer() {return stack.pointer();} + operator Art<T>&() {return stack;} + + int length() {return fill;} + T &operator[](int i) {return operator()(i);} +}; + + + + + +template <class T> +class Art2 { +protected: + int mark_temp; + T **data; + int dims[2]; + int total_length; + void constructor(int d0,int d1) { + if(d0<0||d1<0) abort() ; + mark_temp=0; + dims[0]=d0; + dims[1]=d1; + total_length=dims[0]*dims[1]; + if(d0>0) { + data=new T*[d0]; + if(!data) abort() ; + } else data=0; + if(d0>0&&d1>0) { + T *p=new T[d0*d1]; + if(!p) abort() ; + for(int i=0;i<d0;i++) data[i]=p+i*d1; + art_initialize(data[0],d0*d1); + } + } + void destructor() { + if(dims[0]<1) return; + if(!data) return; + delete [] data[0]; + delete [] data; + mark_temp=0; + data=0; + dims[0]=0; + dims[1]=0; + } + void copy(Art2 &other) { + int d0=dims[0]<?other.dims[0]; + int d1=dims[1]<?other.dims[1]; + for(int i=0;i<d0;i++) for(int j=0;j<d1;j++) + data[i][j]=other.data[i][j]; + } +public: + void copyclear(Art2 &other) { + dims[0]=other.dims[0]; + dims[1]=other.dims[1]; + total_length=dims[0]*dims[1]; + data=other.data; + other.dims[0]=0; + other.dims[1]=0; + other.total_length=0; + other.data=0; + } +private: + void copyconstructor(Art2 &other) { + mark_temp=0; + if(other.mark_temp) { + copyclear(other); + } else { + constructor(other.dims[0],other.dims[1]); + copy(other); + } + } + public: + Art2() {constructor(0,0);} + Art2(int d0,int d1) {constructor(d0,d1);} + Art2(Art2 &other) {copyconstructor(other);} + ~Art2() {destructor();} + + Art2 &operator=(Art2 &other) { + destructor(); + copyconstructor(other); + return *this; + } + int dim(int i) {return dims[i];} + T &operator()(int i,int j) { + if(unsigned(i)>=unsigned(dims[0])||unsigned(j)>=unsigned(dims[1])) + abort() ; + return data[i][j]; + } + T &sub(int i,int j) {return data[i][j];} + void resize(int nd0,int nd1) { + if(nd0<0||nd1<0) abort() ; + Art2 t(nd0,nd1); + int limit0=nd0<?dims[0]; + int limit1=nd1<?dims[1]; + for(int i=0;i<limit0;i++) for(int j=0;j<limit1;j++) t.data[i][j]=data[i][j]; + t.mark_temp=1; + *this=t; + } + Art2 &temp() { mark_temp=1; return *this; } + T **pointer() {return data;} + void fill(T value) { + for(int i=0;i<dims[0];i++) for(int j=0;j<dims[1];j++) + data[i][j]=value; + } + + + + int length() {return total_length;} + T &sub(int i) {return data[0][i];} + T &operator()(int i) { + if(unsigned(i)>=total_length) abort() ; + return data[0][i]; + } +}; + +template <class T> +inline void art_swap(T &x,T &y) { + T temp = x; + x = y; + y = temp; +} + +template <class T> +inline void reverse(Art<T> &a) { + int i; + for(i=a.length()/2;i>=0;i--) art_swap(a.sub(i),a.sub(a.length()-i-1)); +} + +template <class T> +inline void reverse(Stk<T> &a) { + reverse(a.stack); +} + +template <class T> +inline void bag_remove(Stk<T> &a,T &element) { + for(int i=0;i<a.length()-1;i++) { + if(a(i)==element) { + a.sub(i)=a.tos(); + a.pop(); + } + } + if(i<a.length()&&a.sub(i)==element) a.pop(); +} + +template <class T> +inline void ordered_remove(Stk<T> &a,T &element) { + int source=0,dest=0; + while(source<a.length()) { + if(a(source)!=element) { + a(dest)=a(source); + dest++; + } + source++; + } + a.stack.resize(dest); +} + +template <class T> +inline Art<T> concatenate(Art<T> &a,Art<T> &b) { + int i,k; + k=a.length(); + Art<T> result(k+b.length()); + for(i=0;i<a.length();i++) result.sub(i)=a.sub(i); + for(i=0;i<b.length();i++) result.sub(i+k)=b.sub(i); + return result.temp(); +} + +template <class T> +inline Stk<T> concatenate(Stk<T> &a,Stk<T> &b) { + int i; + Stk<T> result; + for(i=0;i<a.length();i++) result.push(a.sub(i)); + for(i=0;i<b.length();i++) result.push(b.sub(i)); + return result.temp(); +} + + +# 23 "Vision.h" 2 + +# 1 "Geo.h" 1 + + + + + +# 1 "/sym/gnu/lib/g++-include/math.h" 1 3 + + + + + + + + + + + + + + + + + + + +# 215 "/sym/gnu/lib/g++-include/math.h" 3 + +# 6 "Geo.h" 2 + + +extern "C" { +void abort(); +} + + + + + + + + + + + + + + +template <class T,int n> +class vec { +protected: + T v[n]; +public: + int length() {return n;} + int dim(int) {return n;} + vec() {} + vec(T v0) { v[0]=v0; } + vec(T v0,T v1) { v[0]=v0; v[1]=v1; } + vec(T v0,T v1,T v2) { v[0]=v0; v[1]=v1; v[2]=v2; } + vec(T v0,T v1,T v2,T v3) { v[0]=v0; v[1]=v1; v[2]=v2; v[3]=v3; } + vec(T v0,T v1,T v2,T v3,T v4) { v[0]=v0; v[1]=v1; v[2]=v2; v[3]=v3; v[4]=v4; } + + T &operator[](int i) {return v[i];} + T &sub(int i) {return v[i];} + T &operator()(int i) { + if(unsigned(i)>=n) abort(); + return v[i]; + } + + + + + + + + + + + + + T operator*(vec &other) { + T result=0; + for(int i=0;i<n;i++) result=result+sub(i)*other.sub(i); + return result; + } + + + vec operator-() { + vec result; + for(int i=0;i<n;i++) result.sub(i)= -sub(i); + return result; + } + vec operator*(T other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)*other; + return result; + } + vec operator/(T other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)/other; + return result; + } + vec operator+(vec &other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)+other.sub(i); + return result; + } + vec operator-(vec &other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)-other.sub(i); + return result; + } + vec operator<?(vec &other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)<?other.sub(i); + return result; + } + vec operator>?(vec &other) { + vec result; + for(int i=0;i<n;i++) result.sub(i)=sub(i)>?other.sub(i); + return result; + } + + + int operator==(vec &other) { + for(int i=0;i<n;i++) if(sub(i)!=other.sub(i)) return 0; + return 1; + } + int operator!=(vec &other) { + for(int i=0;i<n;i++) if(sub(i)!=other.sub(i)) return 1; + return 0; + } + int operator<(vec &other) { + for(int i=0;i<n;i++) if(sub(i)>=other.sub(i)) return 0; + return 1; + } + int operator>(vec &other) { + for(int i=0;i<n;i++) if(sub(i)<=other.sub(i)) return 0; + return 1; + } + int operator<=(vec &other) { + for(int i=0;i<n;i++) if(sub(i)>other.sub(i)) return 0; + return 1; + } + int operator>=(vec &other) { + for(int i=0;i<n;i++) if(sub(i)<other.sub(i)) return 0; + return 1; + } +}; + +template <class T> +inline float euclidean_norm(T &v) { + float total=0.0; + for(int i=0;i<v.dim(0);i++) total+=v(i)*v(i); + return sqrt(total); +} + +template <class T> +inline float euclidean_distance(T &u,T &v) { + float total=0.0; + for(int i=0;i<u.dim(0);i++) { + float d=u(i)-v(i); + total+=d*d; + } + return sqrt(total); +} + + + + + +template <class T,int n> +class mat:vec<T,n*n> { +protected: +public: + int dim(int) {return n;} + T &operator[](int i) {return v[i];} + T &sub(int i,int j) {return v[i*n+j];} + T &operator()(int i,int j) { + if(unsigned(i)>=n||unsigned(j)>=n) abort(); + return sub(i,j); + } + mat operator*(mat &other) { + mat result; + for(int i=0;i<n;i++) for(int j=0;j<n;j++) { + T total=0; + for(int k=0;k<n;k++) total=total+sub(i,k)*other.sub(k,j); + result.sub(i,j)=total; + } + return result; + } + vec<T,n> operator*(vec<T,n> &other) { + vec<T,n> result; + for(int i=0;i<n;i++) { + T total=0; + for(int k=0;k<n;k++) total=total+sub(i,k)*other.sub(k); + result.sub(i)=total; + } + return result; + } +}; + + + + + +typedef vec<float,2> vec2; +typedef vec<float,3> vec3; +typedef vec<float,4> vec4; + +typedef mat<float,2> mat2; +typedef mat<float,3> mat3; +typedef mat<float,4> mat4; + +typedef vec<int,2> ivec2; + + + + + + + +inline float norm_angle(float p) { + while(p<0) p+=2* 3.14159265358979323846 ; while(p>=2* 3.14159265358979323846 ) p-=2* 3.14159265358979323846 ; return p; +} +inline float norm_angle0(float p) { + while(p<- 3.14159265358979323846 ) p+=2* 3.14159265358979323846 ; while(p>= 3.14159265358979323846 ) p-=2* 3.14159265358979323846 ; return p; +} +inline float norm_orientation(float p) { + while(p<0) p+= 3.14159265358979323846 ; while(p>= 3.14159265358979323846 ) p-= 3.14159265358979323846 ; return p; +} +inline float norm_orientation0(float p) { + while(p<- 3.14159265358979323846 /2) p+= 3.14159265358979323846 ; while(p>= 3.14159265358979323846 /2) p-= 3.14159265358979323846 ; return p; +} +inline float orientation_difference(float p,float q) { + fabs(norm_orientation0(p-q)); +} + + + + + + + + + + + + + + +inline vec2 cmul(vec2 &p,vec2 &q) { + return vec2(p.sub(0)*q.sub(0)-p.sub(1)*q.sub(1), + p.sub(0)*q.sub(1)+p.sub(1)*q.sub(0)); +} + +inline vec2 cdiv(vec2 &p,vec2 &q) { + float n=q*q; + return vec2((p.sub(0)*q.sub(0)+p.sub(1)*q.sub(1))/n, + (p.sub(1)*q.sub(0)-p.sub(0)*q.sub(1))/n); +} + +inline vec2 csqrt(vec2 &x) { + if (x.sub(0)==0.0&&x.sub(1)==0.0) + return vec2(0.0,0.0); + else { + float a=sqrt((fabs(x.sub(0))+hypot(x.sub(0),x.sub(1)))*0.5); + float b=0.5*(x.sub(1)/a); + if(x.sub(0)>0.0) return vec2(a, b); + else if(x.sub(1)>=0.0) return vec2(a,b); + else return vec2(-a,-b); + } +} +inline vec2 cpow(vec2& x, double p) { + float h=hypot(x.sub(0),x.sub(1)); + if (h<=0.0) abort(); + float lr=pow(h,p); + float a=atan2(x.sub(1),x.sub(0)); + float li=p*a; + return vec2(lr*cos(li),lr*sin(li)); +} + + + +inline float cross(vec2 p,vec2 q) { + return p.sub(0)*q.sub(1)-p.sub(1)*q.sub(0); +} + + + + + +struct TRS2 { + vec2 t; + vec2 r; + TRS2(vec2 t=vec2(0.0,0.0),vec2 r=vec2(1.0,0.0)):t(t),r(r) { + } + vec2 operator()(vec2 &arg) { + return cmul(r,arg)+t; + } + float rotation() { + return atan2(r(1),r(0)); + } +}; + + + +# 24 "Vision.h" 2 + + + + +# 1 "VisionTypes.h" 1 + + + + +typedef Art2<float> FImage; +typedef Art2<int> IImage; +typedef Art2<unsigned char> CImage; + +struct FImageOp {virtual FImage operator()(FImage &) = 0;}; +struct FImageOp2 {virtual FImage operator()(FImage &,FImage &) = 0;}; +struct CImageOp {virtual CImage operator()(CImage &) = 0;}; +struct CImageOp2 {virtual CImage operator()(CImage &,CImage &) = 0;}; + + + + + +struct PFeature { + ivec2 p; + float a; + short group; + short type; + PFeature() {} + PFeature(ivec2 p,float a,int group,int type):p(p),a(a),group(group),type(type) {} +}; + +typedef Stk<PFeature> PFeatureStk; + +struct FIExtractor {virtual PFeatureStk operator()(FImage &) = 0;}; +struct CIExtractor {virtual PFeatureStk operator()(CImage &) = 0;}; +# 28 "Vision.h" 2 + +# 1 "ImageDatabase.h" 1 + + + + + +# 1 "Art.h" 1 + + +# 339 "Art.h" + +# 6 "ImageDatabase.h" 2 + + +typedef Art2<unsigned char> CImage; + + + + + + + + +struct ImageDatabase { + + + + + virtual int length() = 0; + virtual int nclassifications() = 0; + virtual int nusers() = 0; + + + + + virtual int classification(int offset) = 0; + virtual int user(int offset) = 0; + + virtual CImage cimage(int offset) {abort();} + virtual PFeatureStk features(int offset) {abort();} + + + + + + + virtual int user_offset(int user) = 0; + virtual int user_length(int user) = 0; +}; + +ImageDatabase *make_NISTDigitImages(); + + + + + +struct ImageDatabaseIterator { + virtual int done() = 0; + virtual void next() = 0; + virtual operator int() = 0; + virtual void mark_upto_here() {} +}; + +ImageDatabaseIterator *make_IDI_Sequential(ImageDatabase *digits,int current,int stride); +ImageDatabaseIterator *make_IDI_OnePerUser(ImageDatabase *digits,int current); +ImageDatabaseIterator *make_IDI_FromFile(char *name); + + +# 29 "Vision.h" 2 + + + +# 1 "NISTImages.cc" 2 + + + + + + + + + + +# 1 "/sym/gnu/lib/g++-include/std.h" 1 3 + + + + + + + + + + + + + + + + + + + +# 37 "/sym/gnu/lib/g++-include/std.h" 3 + +# 11 "NISTImages.cc" 2 + +# 1 "Art.h" 1 + + +# 339 "Art.h" + +# 12 "NISTImages.cc" 2 + + +extern "C" { +# 1 "./nist/ihead.h" 1 + + + + + + + + + + + + + + +typedef struct ihead{ + char id[ 80 ]; + char created[ 26 ]; + char width[ 8 ]; + char height[ 8 ]; + char depth[ 8 ]; + char density[ 8 ]; + char compress[ 8 ]; + char complen[ 8 ]; + char align[ 8 ]; + char unitsize[ 8 ]; + char sigbit; + char byte_order; + char pix_offset[ 8 ]; + char whitepix[ 8 ]; + char issigned; + char rm_cm; + char tb_bt; + char lr_rl; + char parent[ 80 ]; + char par_x[ 8 ]; + char par_y[ 8 ]; +}IHEAD; + + + + + + + + + + + + + + + + + + + + + +# 15 "NISTImages.cc" 2 + +int readihdrfile(); + +} + +typedef Art2<unsigned char> CImage; + +Stk<char*> mis_files; + +extern "C" { + char *re_comp(char *); + int re_exec(char *); +} + +struct NISTCharFile { + private: + NISTCharFile(NISTCharFile &); + void operator=(NISTCharFile &); + public: + IHEAD *bit_header; + int bit_w,bit_h; + char *bit_data; + int field_w,field_h; + Stk<int> classes; + + static void maybe_read_mis_files() { + if(mis_files.length()>0) return; + struct _iobuf *stream = fopen("/com/nist/mis-files" ,"r"); + if(!stream) abort() ; + char buf[1024]; + while(fgets(buf,sizeof buf,stream)) { + buf[strlen(buf)-1]='\0'; + mis_files.push(strdup(buf)); + } + fclose(stream); + } + + static char *find_matching_mis_file_prefix(char *pattern) { + if(re_comp(pattern)) abort() ; + for(int i=0;i<mis_files.length();i++) { + if(re_exec(mis_files(i))) break; + } + if(i<mis_files.length()) return mis_files(i); + else return 0; + } + + static int part_of_user(int user) { + int part; + if(user<500) part=0; + else if(user<1000) part=1; + else if(user<1500) part=2; + else part=3; + return part; + } + + static char type_of_itype(int itype) { + char type; + switch(itype) { + case 0: type='d'; break; + case 1: type='u'; break; + case 2: type='l'; break; + default: abort() ; + }; + return type; + } + + NISTCharFile(int user,char itype) { + maybe_read_mis_files(); + int type = type_of_itype(itype); + int part = part_of_user(user); + + char buf[512]; + sprintf(buf,"/com/nist3/data/" "hsf_%d/f%04d_.*/%c%04d_.*",part,user,type,user); + char *prefix = find_matching_mis_file_prefix(buf); + ; + + if(!prefix) { + bit_w = 0; + bit_h = 0; + field_w = 0; + field_h = 0; + return; + } + + char file[512]; + + strcpy(file,prefix); strcat(file,".mis"); + if(!readihdrfile(file,&bit_header,&bit_data,&bit_w,&bit_h)) + abort() ; + field_w=atoi(bit_header->par_x); + field_h=atoi(bit_header->par_y); + + strcpy(file,prefix); strcat(file,".cls"); + struct _iobuf *stream = fopen(file,"r"); + if(!stream) + abort() ; + int total=atoi(fgets(buf,sizeof buf,stream)); + if(total!=bit_h/field_h) + abort() ; + while(fgets(buf,sizeof buf,stream)) classes.push(strtol(buf,0,16)); + fclose(stream); + } + + ~NISTCharFile() { + free(bit_header); + free(bit_data); + } + + int length() { + return bit_h/field_h; + } + + CImage image(int i) { + ; + CImage result(field_w,field_h); + int bit_w8=bit_w/8; + int offset=i*field_h; + if(offset>=bit_h) abort() ; + int i,j; + + + for(i=0;i<field_w;i++) for(j=0;j<field_h;j++) { + int jj=j+offset; + result(i,field_h-j-1)=(!!(bit_data[bit_w8*jj+(i>>3)]&(1<<(7-i&7)))) ; + } + + return result.temp(); + } + + int classification(int i) { + return classes(i); + } +}; + +int *NISTDigitImages_table; + +struct NISTDigitImages:ImageDatabase { + private: + NISTDigitImages(NISTDigitImages&); + void operator=(NISTDigitImages&); + public: + enum {table_size=2101}; + + int nclassifications() {return 10;} + int nusers() {return 2200;} + + static void init_table() { + struct _iobuf *stream=fopen("/com/nist/nist-digits" ,"r"); + NISTDigitImages_table = new int[table_size]; + if(!stream) abort() ; + int i=1; + while(fscanf(stream,"%d",&NISTDigitImages_table[i])==1) i++; + if(i!=table_size) abort() ; + fclose(stream); + int total=0; + for(i=1;i<table_size;i++) NISTDigitImages_table[i]+=NISTDigitImages_table[i-1]; + } + + static int locate(int v) { + int low=0; + int high=table_size; + if(v>=NISTDigitImages_table[table_size-1]) abort() ; + while(low+1<high) { + int mid=(low+high)/2; + if(NISTDigitImages_table[mid]<=v) low=mid; + else high=mid; + } + while(low<table_size-1&&NISTDigitImages_table[low+1]<=v) low++; + return low; + } + + int user_offset(int user) { + if(unsigned(user)>=2100) abort() ; + return NISTDigitImages_table[user]; + } + + int user_length(int user) { + if(unsigned(user)>=2100) abort() ; + return NISTDigitImages_table[user+1]-NISTDigitImages_table[user]; + } + + int current_user; + NISTCharFile *current_file; + + private: + void get_cache(int user) { + if(user!=current_user) { + delete current_file; + current_file = new NISTCharFile(user,0); + current_user = user; + } + } + + public: + NISTDigitImages() { + ; + if(!NISTDigitImages_table) init_table(); + current_user=0; + current_file=new NISTCharFile(0,0); + ; + } + + ~NISTDigitImages() { + delete current_file; + } + + int length() {return NISTDigitImages_table[table_size-1];} + + int user(int i) { + return locate(i); + } + + CImage image(int i) { + int user = locate(i); + get_cache(user); + int offset = i-NISTDigitImages_table[user]; + return current_file->image(offset); + } + + int classification(int i) { + int user = locate(i); + get_cache(user); + int offset = i-NISTDigitImages_table[user]; + return current_file->classification(offset); + } +}; + +ImageDatabase *make_NISTDigitImages() { + return new NISTDigitImages(); +} + |